Угловое движение в pygame

Я определил функцию, которая позволяет мне перемещать объект по диагонали:

    if(myX > targetX):
        dx = myX - targetX
    else:
        dx = targetX - myX 
    if(myY > targetY):
        dy = myY - targetY
    else:
        dy = targetY - myY

    if(dy == 0):
        dy = 1
    if(dx == 0):
        dx = 1

    #Calc Movement
    if(dx < dy):
        Speedy = dy/dx 
        Speedx = 1
    if(dx > dy):
        Speedy = 1
        Speedx = dx/dy
    elif(dx == dy):
        Speedx = 1
        Speedy = 1

    if(myX < targetX):
        Speedx = Speedx * -1
    if(myY < targetY):
        Speedy = Speedy * -1


    return Speedx,Speedy

Код работает, но проблема в том, что он не делает то, что я хочу. Сейчас объект ускоряется, если я подхожу к нему ближе, что выглядит довольно странно. Я прекрасно понимаю, почему он это делает, но есть ли простой способ установить постоянную скорость, но не направление?


person Tobias Laving    schedule 16.02.2013    source источник
comment
Пора научиться триггеру! Вы можете рассчитать угол, в котором он должен двигаться, а затем получить x и y с помощью sin и cos. Отсюда вы можете умножить на желаемую скорость.   -  person placeybordeaux    schedule 16.02.2013
comment
@placeybordeaux: тригонометрия может работать, но это не обязательно.   -  person martineau    schedule 16.02.2013


Ответы (1)


Если вы сделаете это таким образом, dx и dy будут скалярами вектора, который указывает от вашего парня к цели. Затем вы делите их на величину обоих, здесь это представлено как dz. Теперь dx и dy представляют собой единичный вектор. Как только вы умножите их на скорость, вы заставите ваш объект двигаться с постоянной скоростью, но в разных направлениях.

import math

#set speed to how fast you want your guy to move
speed = 1
dx = myX - targetX
dy = myY - targetY

dz = math.sqrt(dx**2 + dy**2)

speedx = dx/dz * speed
speedy = dy/dz * speed
person placeybordeaux    schedule 16.02.2013
comment
В качестве альтернативы, если вы хотите перейти из точки My в target в num_steps, просто используйте speedx = float(dx) / num_steps и speedy = float(dy) / num_steps. - person martineau; 16.02.2013
comment
Пробовал это, но не сработало, поэтому вместо этого я попробовал тригномическую версию. Тоже не сработало. Оказывается, мне нужно, чтобы скорость была выше 1, иначе он не двинется: S Но все заработало, спасибо за помощь! - person Tobias Laving; 17.02.2013