在pygame中射击子弹



我正在制作自己的太空侵略者游戏,到目前为止,我已经能够使用鼠标移动我的飞船。但是,我仍然无法拍摄。这是我的游戏循环。

def game_loop():
x=0
y=0

xlist=[]
ylist=[]

while True:

mouseclk=pygame.mouse.get_pressed()
game_display.fill(white)
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
quit()

x, y = pygame.mouse.get_pos()
xlist.append(x)
ylist.append(y)

if x>=display_width-40:
x=display_width-40
if y>=display_height-48:
y=display_height-48

if pygame.mouse.get_focused()==0:
game_display.blit(spaceship, (x, y))
elif pygame.mouse.get_focused()==1:
game_display.blit(spaceshipflames, (x, y))

pygame.display.update()

if pygame.mouse.get_focused()==0:
pause()

clock.tick(500)

我尝试在游戏循环中使用以下代码:

if mouseclk[0]==1:
shoot.play()
while True:    
pygame.draw.circle(game_display, white, (x+20, y-2), 5)
pygame.draw.circle(game_display, red, (x+20, y-7), 5)
y-=5

if y<=0:
break
pygame.display.update()
clock.tick(400)

但最终结果非常小故障,不允许我发射多颗子弹而不会使游戏断断续续。

有没有办法同时运行两个循环,或者完全不同的方式来实现拍摄?

我建议使用类(特别是对于游戏(并将代码拆分为较小的函数。

在制作游戏时,每个类都应该代表游戏中的某种类型的对象,例如这里的船或子弹。使用类应该有助于解决多个项目符号导致故障的问题。

分解为较小的函数将使代码在增长时更易于阅读和更新。尽量坚持单一责任原则。

如何在实现拍摄时牢记以下几点:

bullets = []
class Bullet:
def __init__(self, position, speed):
self.position = position
self.speed = speed
def move(self):
self.position[1] += self.speed
class Ship:
def __init__(self, position, bullet_speed):
self.position = position
self.bullet_speed = bullet_speed
def shoot(self):
new_bullet = Bullet(self.position, self.bullet_speed)
bullets.append(new_bullet)

其中position变量的形式为[x,y].然后,要将子弹向前移动,请将此行放在主游戏循环中的某个位置:

for bullet in bullets:
bullet.move()

并遍历所有项目符号并将每个项目符号绘制到屏幕上以渲染它们。

这不是最详细的例子,但希望它足以让你朝着正确的方向前进。

最新更新