Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Tobias LavingОтветов: 1

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

    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

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

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

pygamepythongame-physics

Ответы

Ответ 1 · рейтинг 2 · placeybordeaux

Если вы сделаете это таким образом, 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы