如何在pygame中制作子弹动画?

时间:2020-04-26 09:25:52

标签: python pygame

所以我写了我的代码,一切都按我现在想要的工作。 唯一的问题是我的子弹或火球会传送到我设置的位置。 我想知道是否有一种方法可以使它看起来像是使用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 :(得分:0)

首先从pygame.display.flip()player中删除fireball。那是因为闪烁。在应用程序循环结束时使用一个pygame.display.update()就足够了。
请注意,火球必须在(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 = []

按下 space 时,产生一个新的火球:

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

更新并循环绘制火球:

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()