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

Python 如何在pygame中制作子弹动画?,python,pygame,Python,Pygame,所以我写了我的代码,现在一切都按照我希望的方式运行。 唯一的问题是我的子弹或火球传送到我设定的位置。 我想知道是否有一种方法可以让它看起来像是用pygame之类的东西朝着目的地移动。 非常感谢 (width, height) = (1300,800) screen = pygame.display.set_mode((width, height)) playerImage = pygame.image.load('player.png') fireballImage = pygame.image

所以我写了我的代码,现在一切都按照我希望的方式运行。 唯一的问题是我的子弹或火球传送到我设定的位置。 我想知道是否有一种方法可以让它看起来像是用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()

首先,从
player
fireball
中删除
pygame.display.flip()。那是闪烁的。在应用程序循环结束时,一个
pygame.display.update()
就足够了。
注意,火球必须在
(x,y)
而不是
(fb\u x,fb\u y)

def播放器(x,y): 屏幕光点(播放图像,(x,y)) def火球(x,y): 屏幕。blit(火球图像,(x,y)) fireball_state=“准备就绪”
进一步使用/控制每秒的触发器(
FPS
):

clock=pygame.time.clock()
#主回路
运行=真
运行时:
时钟滴答声(FPS)
添加火球列表:

火球=[]
按下空格键时生成新火球:

如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_空间:
fireballs.append([x,y,0,-2])
更新并在循环中绘制火球:

火球中fb的
:
fb[0]+=fb[2]
fb[1]+=fb[3]
火球中fb的
:
火球(fb[0],fb[1])
请参见示例:

火球=[]
FPS=60
clock=pygame.time.clock()
运行=真
运行时:
时钟滴答声(FPS)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_空间:
fireballs.append([x,y,0,-2])
pressed=pygame.key.get_pressed()
如果按下[pygame.K_w]:
y-=2
如果按下[pygame.K_s]:
y+=2
如果按下[pygame.K_a]:
x-=2
如果按下[pygame.K_d]:
x+=2
对于范围内的i(len(火球)-1,-1,-1):
fb=火球[i]
fb[0]+=fb[2]
fb[1]+=fb[3]
如果fb[1]<0:
德尔火球[i]
屏幕填充((255255))
玩家(x,y)
对于火球中的fb:
火球(fb[0],fb[1])
pygame.display.update()

首先从
玩家和
火球中删除
pygame.display.flip()
。那是闪烁的。在应用程序循环结束时,一个
pygame.display.update()
就足够了。
注意,火球必须在
(x,y)
而不是
(fb\u x,fb\u y)

def播放器(x,y): 屏幕光点(播放图像,(x,y)) def火球(x,y): 屏幕。blit(火球图像,(x,y)) fireball_state=“准备就绪”
进一步使用/控制每秒的触发器(
FPS
):

clock=pygame.time.clock()
#主回路
运行=真
运行时:
时钟滴答声(FPS)
添加火球列表:

火球=[]
按下空格键时生成新火球:

如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_空间:
fireballs.append([x,y,0,-2])
更新并在循环中绘制火球:

火球中fb的
:
fb[0]+=fb[2]
fb[1]+=fb[3]
火球中fb的
:
火球(fb[0],fb[1])
请参见示例:

火球=[]
FPS=60
clock=pygame.time.clock()
运行=真
运行时:
时钟滴答声(FPS)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_空间:
fireballs.append([x,y,0,-2])
pressed=pygame.key.get_pressed()
如果按下[pygame.K_w]:
y-=2
如果按下[pygame.K_s]:
y+=2
如果按下[pygame.K_a]:
x-=2
如果按下[pygame.K_d]:
x+=2
对于范围内的i(len(火球)-1,-1,-1):
fb=火球[i]
fb[0]+=fb[2]
fb[1]+=fb[3]
如果fb[1]<0:
德尔火球[i]
屏幕填充((255255))
玩家(x,y)
对于火球中的fb:
火球(fb[0],fb[1])
pygame.display.update()

你想让它移动到一个特定的位置,还是移动到它碰到什么东西?移动到它碰到什么东西是我最后想做的。现在我的问题是火球正在传送到这个位置,而不是慢慢地移动到它。你应该看看@rabbi76答案,但除此之外,你应该把火球和玩家(可能后来是你的敌人)分成不同的类别,而不是把他们的所有信息(x,y,change,等等)都放在上面。最好看看pygames Sprite类,因为它对这类事情非常有帮助。你想让它移动到一个特定的位置,还是移动到它碰到什么东西?移动到它碰到什么东西是我最后想做的。现在我的问题是火球正在传送到这个位置,而不是慢慢地移动到它。你应该看看@rabbi76答案,但除此之外,你应该把火球和玩家(可能后来是你的敌人)分成不同的类别,而不是把他们的所有信息(x,y,change,等等)都放在上面。最好看看pygames Sprite类,因为它对这类事情非常有帮助。嘿,伙计,非常感谢!我是在你的代码的帮助下弄明白的,但我必须承认,一开始我真的很想抵制使用它,因为我很难理解结局到底是什么。你能解释一下(如果你不介意的话)for语句和下面的代码吗?或者特别是两个for语句。@kr4ck3d_是_s4d
firebolls=[]
是一个列表<代码>火球。追加([x,y,0,-2])
向列表中追加一个包含4个元素的列表。因此,您创建了一个列表,每个元素也是一个列表