Как заставить спрайт двигаться по двум осям одновременно при помощи вектора в Pygame?

Malchik_molodoi

Новичок
Пользователь
Июл 29, 2020
19
4
3
20
Здравствуйте! Хочу сделать игру на Pygame, в которой кораблик посередине экрана поворачивается в сторону курсора и, по нажатию на кнопку, стреляет в сторону курсора. Примерно так оно должно выглядеть:
Untitled.jpg
Поворот кораблика я уже реализовал через арктангенс, а вот со стрельбой у меня возникли вопросы: как заставить эту "пульку" перемещаться одновременно по координатам икс и игрек так, чтобы "пулька" летела ровно в курсор и скорости по обеим осям координат были пропорциональны — т.е. чтобы пулька летела в любую сторону с одинаковой скоростью? Я слышал про метод с количеством итераций: (дельта икс) / (скорость движения по оси икс) = (кол-во итераций), а после (дельта икс/игрек) / (кол-во итераций) = (скорость движения по оси игрек):
Untitled1.jpg
Но у меня не получился этот способ: пулька летит либо по оси икс, либо под углом 45 градусов, или с бешеной скоростью мчит по оси игрек — не то, что мне нужно.
Также я видел, как используют вектора (pygame.math.Vector2), но как при их помощи "стрелять по двум осям" я не совсем понимаю. Мне кажется, что с векторами проще, но как реализовать перемещение по обеим осям при помощи вектора?
 

<'o'>

Новичок
Пользователь
Ноя 3, 2020
8
0
1
Если что-то не понятно, пишите.

Код:
from tkinter import *
from math import*
from time import*
from win32api import*

root = Tk()

can = Canvas(root, width = 500, height = 500)
can.pack()

ball = can.create_oval(0, 0, 5, 5)
goal = [0, 0]

def move(event):
    global goal
    goal = [event.x, event.y]
    speed = 10
    sp_x = speed * ((event.x - can.coords(ball)[0]) / sqrt((event.x - can.coords(ball)[0]) ** 2 + (event.y - can.coords(ball)[1]) ** 2))
    sp_y = speed * ((event.y - can.coords(ball)[1]) / sqrt((event.x - can.coords(ball)[0]) ** 2 + (event.y - can.coords(ball)[1]) ** 2))
    for i in range(round((event.x - can.coords(ball)[0]) // sp_x)):
        can.move(ball, sp_x, sp_y)
        root.update()
        if goal != [event.x, event.y]:
            return 0
        sleep(0.1)
    can.move(ball, event.x - can.coords(ball)[0], event.y - can.coords(ball)[1])
   
can.bind('<Button-1>', move)
root.mainloop()
 
Последнее редактирование:

Форум IT Специалистов