首页 > 解决方案 > 试图在屏幕上显示多个弹丸

问题描述

本质上,我试图在屏幕上显示多个弹丸,让玩家避免。

在这一点上,我并不担心命中框或类似的东西,只是简单地尝试让多个射弹显示。它显示一个,然后弹丸从屏幕上消失并且永远不会重新出现。

我相信这可能是一个范围问题,但我并不完全确定。我几乎移动了我能想到的每段代码,但无济于事。

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

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

标签: pythonpygame

解决方案


很少有事情需要修复。不确定这些修复是否足够,但至少它们会有所帮助。

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()函数的显示。


推荐阅读