Как сделать анимацию пули в Pygame? - PullRequest
1 голос
/ 26 апреля 2020

Итак, я написал свой код, и сейчас все работает так, как я хочу. Единственная проблема заключается в том, что моя пуля или огненный шар телепортируются в то место, где я их установил. Мне интересно, есть ли способ заставить его выглядеть так, как будто он действительно движется к месту назначения, используя pygame и еще много чего. Спасибо за тонну!

(width, height) = (1300,800)
screen = pygame.display.set_mode((width, height))
playerImage = pygame.image.load('player.png')
fireballImage = pygame.image.load('fireball.png')
pygame.display.set_caption('Game')
transparent = (0, 0, 0, 0)

#Fireball stats


def player(x ,y):
 screen.blit(playerImage, (x, y))
 pygame.display.flip()

def fireball(x, y):
 screen.blit(fireballImage, (fb_x,fb_y))
 pygame.display.flip()
 fireball_state = "ready"
 print('created')
fb_x = x = width * 0.45
fb_y = y = height * 0.8
x_change = 0
y_change = 0
fb_x_change = 0
fb_y_change = 0

pressed = pygame.key.get_pressed()

#mainloop
running = True
while running:
 for event in pygame.event.get():
     if event.type == pygame.QUIT:
         running = False
     if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_d:
             x_change = 1
     if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
             x_change = -1
     if event.type == pygame.KEYUP:
         if event.key == pygame.K_a or event.key == pygame.K_d:
             x_change = 0
     if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_w:
             y_change = -2
     if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_s:
             y_change = 2
     if event.type == pygame.KEYUP:
         if event.key == pygame.K_w or event.key == pygame.K_s:
             y_change = 0
     if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_SPACE:
             fb_y_change = -400
     if event.type == pygame.KEYUP:
         if event.key == pygame.K_SPACE:
             fb_y_change = 0
   x += x_change
 y += y_change
 fireball(x,y)
 fb_x = x
 fb_y = y
 screen.fill((255,255,255))
 player(x,y)
 fb_x += fb_x_change
 fb_y += fb_y_change
 fireball(fb_x,fb_y)
 pygame.display.update()

1 Ответ

0 голосов
/ 26 апреля 2020

Прежде всего удалите pygame.display.flip() из player и fireball. Этот случай мерцает. Достаточно одного pygame.display.update() в конце приложения l oop.
Обратите внимание, что огненные шары должны быть блиты при (x, y), а не (fb_x, fb_y)

def player(x ,y):
    screen.blit(playerImage, (x, y))

def fireball(x, y):
    screen.blit(fireballImage, (x, y))
    fireball_state = "ready"

Дальнейшее использование pygame.time.Clock() / tick() для контроля флопов в секунду (FPS):

clock = pygame.time.Clock()

#mainloop
running = True
while running:
    clock.tick(FPS)

Добавить список для огненных шаров:

fireballs = []

Создает новый огненный шар при нажатии пробел :

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE:
        fireballs.append([x, y, 0, -2])

Обновление и отрисовка огненных шаров в al oop:

for fb in fireballs:
    fb[0] += fb[2]
    fb[1] += fb[3]
for fb in fireballs:
    fireball(fb[0],fb[1])

См. Пример:

fireballs = []

FPS = 60
clock = pygame.time.Clock()
running = True
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                fireballs.append([x, y, 0, -2])

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_w]:
        y -= 2
    if pressed[pygame.K_s]:
        y += 2
    if pressed[pygame.K_a]:
        x -= 2
    if pressed[pygame.K_d]:
        x += 2

    for i in range(len(fireballs)-1, -1, -1):
        fb = fireballs[i]
        fb[0] += fb[2]
        fb[1] += fb[3]
        if fb[1] < 0:
            del fireballs[i]

    screen.fill((255,255,255))
    player(x,y)
    for fb in fireballs:
        fireball(fb[0],fb[1])
    pygame.display.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...