Возможно ли осуществить постепенное перемещение объекта по заданным координатам в Pygame? - PullRequest
2 голосов
/ 23 февраля 2020

вот пример кода, который я пробовал:

x[0] = 10
y[0]=10
x[1] = 40
y[1]=40
width=10
height=10
pygame.draw.rect(win,(0,0,255),(x[1],y[1],width,height))
pygame.draw.rect(win,(0,0,255),(x[0],y[0],width,height))

1 Ответ

1 голос
/ 23 февраля 2020

Необходимо немного изменить позицию в приложении. L oop.

Определить начальную позицию (start), конечную позицию (end) и скорость (speed):

start = 10, 10
end = 40, 40
speed = 1

Инициирование текущей позиции. Вычислить вектор от текущей позиции до конечной позиции (dx, dy) в приложении l oop и изменить текущую позицию на скорость в направлении к цели:

pos = start[:]
while run:
    # [...]

    dx = end[0] - pos[0]
    dy = end[1] - pos[1]
    dist = math.sqrt(dx*dx + dy*dy)
    if dist > speed:
        pos = pos[0] + dx*speed/dist, pos[1] + dy*speed/dist

Примечание: math.hypot вычисляет евклидово расстояние , а (dx/dist, dy/dist) представляет собой Единичный вектор (единичный вектор имеет длину 1).

Нарисуйте объект в текущей позиции (pos) в каждом кадре:

pygame.draw.rect(win,(0,0,255),(round(pos[0]), round(pos[1]), width, height))

Если у вас есть список позиций:

x = [60, 140, 140, 60]
y = [60, 140, 60,  140]

Тогда start и end должны быть установлены с позиций в списке. Используйте индекс списка current_i для отслеживания текущей начальной позиции. Увеличьте индекс, если объект достиг текущей целевой позиции (end).
См. Пример:

import pygame
import math

pygame.init()
win = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()

x = [60, 140, 140, 60]
y = [60, 140, 60,  140]

width, height = 10, 10
speed = 1
current_i = 0
pos = x[current_i], y[current_i]

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    start = x[current_i], y[current_i]
    end = x[current_i % len(x)], y[current_i % len(y)], 
    dx = end[0] - pos[0]
    dy = end[1] - pos[1]
    dist = math.hypot(dx, dy)
    if dist > speed:
        pos = pos[0] + dx*speed/dist, pos[1] + dy*speed/dist
    else:
        pos = end[:]
        current_i = current_i + 1 if current_i < len(x)-1 else 0

    win.fill(0)
    pygame.draw.rect(win,(0,0,255),(round(pos[0]), round(pos[1]), width, height))
    pygame.display.flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...