试图在屏幕上显示多个投射物

2024-06-08 18:27:14 发布

您现在位置:Python中文网/ 问答频道 /正文

从本质上说,我试图在屏幕上显示多个投射物,以便玩家避免

在这一点上,我不担心击中框或类似的东西,只是简单地尝试让多个炮弹显示。它显示一个,然后投射物从屏幕上消失,再也不显示回来

我相信这可能是一个范围问题,但我不完全确定。我几乎把我能想到的每一段代码都搬来搬去了,但都没有用

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

我想在屏幕上显示多个炮弹类型的敌人。我看了一些关于如何做这类事情的教程,但没有得到预期的结果


Tags: selfif屏幕initdefcountframeclass
1条回答
网友
1楼 · 发布于 2024-06-08 18:27:14

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

Projectile在实践上似乎还可以。不过,我不能为省略的部分辩护。
但是,在draw函数中从不使用gameDisplay参数,而是使用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()。我想您是想使用Projectile类的draw()方法,这是有道理的。
同样,代码中没有定义self._display_surf,我假设是传递给draw()函数的显示

相关问题 更多 >