在pygame中射击子弹

时间:2018-08-24 19:00:31

标签: python python-3.x 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)

但是最终结果是非常小故障,不允许我在不使游戏变得不稳定的情况下发射多发子弹。

是否有一种方法可以同时运行两个循环,或者是一种完全不同的实施射击的方法?

1 个答案:

答案 0 :(得分:2)

我建议使用类(尤其是游戏类)并将代码拆分为较小的函数。

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

突破较小的功能将使您的代码随着代码的增长而更易于阅读和更新。尽量坚持使用Single Responsibility Principle

在考虑这些事项的情况下如何实现拍摄:

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

然后遍历所有子弹并将其绘制到屏幕上以渲染它们。

这不是最详细的示例,但希望它足以使您朝正确的方向前进。