我如何在Pygame中实例精灵?我也需要吗?

时间:2018-04-29 12:30:46

标签: python pygame sprite

所以我正在为我的计算课程中的一些课程做一个游戏,即将完成但是对于我的生活,我无法获得多个蜘蛛精灵在正确的位置产卵或在关卡之间正确重置。我之前尝试过向组添加不同的实例,但我总是会遇到与我尝试的每种方法不同的错误。代码在下面,对于pygame我是相当新的,所以对于凌乱的代码感到抱歉..

class Spider(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load( 'Assets/Level-Assets/Level 1/Enemies/Spider_Down.png')
        self.rect = self.image.get_rect()
        self.Health = 3
        self.Spawned = False
        self.range = 100
        self.Gravity= 6
        self.pos_difference = 0
        self.Active = False
        self.Fall = False
        self.Spiders = []

##################################################################################################################
    def Set_Position(self):
        if self.Spawned == False:
            self.rect.center = (World.mapx, World.mapy)
            Enemies.add(self)
            self.Spawned = True

        else:
            self.rect.center = self.rect.center


######################################################################################################################

    def update(self):


        self.pos_difference = Player.rect.centery - self.rect.centery
        if Player.rect.centerx >= self.rect.centerx -4 or Player.rect.centerx >= self.rect.centerx + 4:
            if Player.rect.centery > self.rect.centery:
                if self.pos_difference < 200:
                    self.Active = True
                    self.Fall = True

        if self.Active == True:
            if self.Fall == True:
                self.rect.centery += self.Gravity

这是Spider的代码,它实际上没有做任何事情,直到在World类中调用它,我相信大部分问题都是......

    def DisplayWorld(self):        
        self.MapLoad = False
        for Row in range(len(self.newMap)):
            for Col in range(len(self.newMap[Row])):
                self.mapx = Col * 64 
                self.mapy = ((Row + self.Height_modifier) * 64)
                self.tile_pos = (self.mapx, self.mapy )


                if int(self.newMap[Row][Col]) == 1:
                    self.rect = self.Brick_Center.get_rect(left = (self.mapx) , bottom = (self.mapy))
                    self.World_sprites.add(World)
                    self.Camera_Pos_Check()
                    Player.Collision_Check()
                    Spider.Collision_Check()
                    Shoot.Collision_Check()
                    self.World_sprites.draw(screen)


                elif int(self.newMap[Row][Col]) == 2:
                    Enemies.add(Spider(screen))




def main():
    play = True
    while play:
        if pygame.key.get_pressed()[pygame.K_ESCAPE]:
            play = False
        if not Sprites.sprites():
            Sprites.add(Player,Spider)
            print(Sprites)
        clock.tick(CLOCKRATE)
        pygame.mouse.set_visible(False)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                play = False



        screen.blit(bgi,(0,0))
        screen.blit(bgi,(0,500))
        World.findLevel()
        Sprites.update()
        Enemies.draw(screen)
        Sprites.draw(screen)
        if Shoot.bullet == True:
            Shoot.update()
            for b in range(len(Shoot.bullets)):
                screen.blit(Shoot.image, (Shoot.bullets[b][0],Shoot.bullets[b][1]))

        UI.Health_Display()
        pygame.display.flip()


Sprites = pygame.sprite.Group()
Enemies = pygame.sprite.Group()
UI = User_Interface()
World = World()
Player = Proto()
Shoot = Shoot()
Portal = Portals()
Spider = Spider()



main()

1 个答案:

答案 0 :(得分:1)

我发现了您的问题:您通过它的实例(Spider)覆盖您的Spider()类,然后给它指定相同的名称。因此,您一直在向敌人列表中添加相同的单个蜘蛛。相反,你应该删除文件底部的这个定义以及你添加(多个)蜘蛛的位置,你应该创建这个实例。

在一个更一般的评论中,使用全局变量和你一样广泛地被认为是糟糕的风格(而且性能不是太大)。在函数和类之间传递它们要好得多。此外,您用于所有变量的CamelCase大小写通常仅用于类。我建议您查看pep8以了解有关如何使用常见Python样式的更多信息。它使这些问题更容易被发现,不太可能发生,并简化了所涉及的任何人的阅读。正确使用这些点可能会显着提高你的成绩;)。