Линейное движение изображения на мышь - PullRequest
0 голосов
/ 03 марта 2019

У меня есть две точки - начало и пункт назначения.(X, Y) Я должен создать пулю.Я создал простой код:

def Entities():
    ##BULLETS
    #bullets array
    for x in gd.bulletList:
        dist = gd.Dist(
                gd.bulletList[x].X,
                gd.bulletList[x].Y, 
                gd.bulletList[x].MX, 
                gd.bulletList[x].MY)
        ## MX - DestX, MY - DestY, X и Y. Speed - speed.
        if (gd.bulletList[x].X < gd.bulletList[x].MX):
            gd.bulletList[x].X = gd.bulletList[x].speed
        if (gd.bulletList[x].X > gd.bulletList[x].MX):
            gd.bulletList[x].X -= gd.bulletList[x].speed
        if (gd.bulletList[x].Y < gd.bulletList[x].MY):
            gd.bulletList[x].Y += gd.bulletList[x].speed
        if (gd.bulletList[x].Y > gd.bulletList[x].MY):
            gd.bulletList[x].Y -= gd.bulletList[x].speed
        win.blit(spd.sprites['bullet'], (gd.bulletList[x].X, gd.bulletList[x].Y))

Создайте так:

Preview

Пожалуйста, помогите мне! Как создать равномерное движение!

1 Ответ

0 голосов
/ 03 марта 2019

Рассчитать вектор от позиции маркера до цели, используя pygame.math.Vector2:

tragetPos = pygame.math.Vector2(bullet.MX, bullet.MY)
bulletPos = pygame.math.Vector2(bullet.X, bullet.Y)
bulletDir = tragetPos - bulletPos

Рассчитать длину вектора (pygame.math.length()).Длина - это текущее расстояние от пули до цели:

distance = bulletDir.length()

Нормализовать вектор направления (pygame.math.normalize()).Это означает, что вектор становится Единичным вектором с длиной 1:

bulletDir = bulletDir.normalize()

Пуля должна двигаться в направлении цели с минимумом скорости (bullet.speed) ирасстояние до цели (пуля не должна выходить за пределы цели).Вычислите новую позицию пули:

bulletPos = bulletPos + bulletDir * min(distance, speed)

Наконец, можно установить атрибуты X и Y и пулю blit.Функция может выглядеть так:

def Entities():

    for bullet in gd.bulletList:

        tragetPos = pygame.math.Vector2(bullet.MX, bullet.MY)
        bulletPos = pygame.math.Vector2(bullet.X, bullet.Y)
        bulletDir = tragetPos - bulletPos
        distance  = bulletDir.length()
        if distance > 0:

            bulletDir = bulletDir.normalize()
            bulletPos = bulletPos + bulletDir * min(distance, speed)

            bullet.X, bullet.Y = bulletPos
            win.blit(spd.sprites['bullet'], (int(bullet.X), int(bullet.Y)))
...