试图在屏幕上显示多个弹丸

时间:2019-04-20 17:43:50

标签: python pygame

从本质上讲,我试图在屏幕上显示多个弹丸,以使玩家避免使用。

在这一点上,我并不担心命中框之类的事情,而只是想让多个弹丸显示出来。它显示一个,然后弹丸从屏幕上消失,再也不会显示出来。

我认为这可能是范围问题,但我不确定。我几乎遍历了所有我能想到的代码,但都没有用。

class Game:

    clock = pygame.time.Clock()

    def __init__(self): 
        self.enemy = Projectile() 
        self.enemies = []

    def loop(self):
        self.clock.tick(30) 

        for enemy in self.enemies:
            if self.enemy.y < 925 and self.enemy.x < self.screen_width: 
                self.enemy.x += self.enemy.velocity
                self.enemy.frame_count += 1
            else:
                self.enemies.pop(self.enemies.index(self.enemy))

        if len(self.enemies) < 5:
            self.enemies.append(self.enemy)

    def render(self):
        # other stuff

        for enemy in self.enemies: 
            self.enemy.draw_projectile(self._display_surf)

然后在我的弹丸文件中,我有:

class Projectile():
     # projectile images

    def __init__(self):
     # stuff 

    def draw(self, gameDisplay): 

        if self.frame_count > 118: 
            self.frame_count = 0 

        display_window.blit(self.projectile_sprites[self.frame_count],(self.x, self.y))

我正在尝试在屏幕上获得多个弹头型敌人。我查看了一些有关如何执行此类操作的教程,但无法获得预期的结果。

1 个答案:

答案 0 :(得分:0)

需要解决的问题很少。不确定这些修补程序是否足够,但是至少它们会有所帮助。

Projectile在语法上似乎还不错。不过,我不能为省略的部分说话。
但是,您永远不会在gameDisplay函数中使用draw参数,但是您有一个display_window。他们应该是同一回事吗?如果是这样,请使用相同的名称。
我猜是display_window / gameDisplay是显示器,表面用pygame.display.set_mode()初始化。如果是这样,就可以了。

对于Game类,请参阅我添加的注释。

class Game:

    clock = pygame.time.Clock()

    def __init__(self): 
        #self.enemy = Projectile() remove this line, is useless.
        self.enemies = []

    def loop(self):
        self.clock.tick(30) 

        for enemy in self.enemies:
            if enemy.y < 925 and enemy.x < self.screen_width:
                #no need of self before enemy in this section. Otherwise you
                #do not refer to the "enemy" on which you are looping but to
                #the attribute "enemy" (which I removed). They are different things. 
                enemy.x += enemy.velocity
                enemy.frame_count += 1
            else:
                self.enemies.pop(self.enemies.index(enemy))
                #I leave this here for now, but remember that editing
                #a list on which you are looping is a bad idea in general.

        if len(self.enemies) < 5:
            self.enemies.append(Projectile())
            #each iteration you need to create a new instance of the class.

    def render(self):
        # other stuff

        for enemy in self.enemies: 
            enemy.draw(self._display_surf)
            #again, no self before enemy, same reason of before.

我不知道什么是draw_projectile()。我想您打算使用draw()类的Projectile方法,这是很合理的。
再次在您的代码中未定义self._display_surf,我认为是您传递给draw()函数的显示。