微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Pygame中产生多个敌人

如何解决如何在Pygame中产生多个敌人

因此,我正在尝试制作一个游戏,让角色躲避从上方随机产生的敌人。问题是,我不知道如何在不实例化另一个类的情况下使Random值不同,这是我不想做的。同样,使用Screen.fill()时,敌人不会出现,因为它们每帧都被颜色重叠,如果我不使用Screen.fill(),我的角色每次移动都会留下痕迹。有什么建议吗?

import random

pygame.init()
Running = True
Screen = pygame.display.set_mode((800,600))

player_img = pygame.image.load('/Users/kevinhadinata/Downloads/ufo.png')
player_updated = pygame.transform.scale(player_img,(60,60))

enemy_list = []
enemy_img = pygame.image.load('/Users/kevinhadinata/Downloads/alien.png')
SPAWNENEMY = pygame.USEREVENT
pygame.time.set_timer(SPAWNENEMY,1000)

class Player:
    def __init__(self):
        self.ypos = 540
        self.xpos = 325
        self.height = 60
        self.width = 60
        self.playerUpdated = player_updated
    def create_player(self):
        PlayeRSS = pygame.Rect(self.xpos,self.ypos,self.height,self.width)
        pygame.draw.ellipse(Screen,(0,0),PlayeRSS)
        Screen.blit(player_updated,(PlayeRSS.x,PlayeRSS.y))

sizee = random.randint(10,40)
randomX = random.randint(0,700)

class Enemy:
    def __init__(self):
            self.xval = random.randint(0,700)
            self.size = random.randint(10,40)
    def create_enemy(self):
        Enemy = pygame.Rect(self.xval,self.size,self.size)
        #enemy_updated = pygame.transform.scale(enemy_img,(self.size,self.size))
        enemy_list.append(Enemy)
        pygame.draw.ellipse(Screen,(255,255,Enemy)

Player = Player()
Enemys = Enemy()

while Running:
    Screen.fill((0,0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                Player.xpos -= 20
            if event.key == pygame.K_RIGHT:
                Player.xpos += 20
        if event.type == SPAWNENEMY:
            Enemys.create_enemy()

    Player.create_player()

    pygame.display.update()


解决方法

不实例化一个新敌人是一个好主意,因为仅将其回收到屏幕顶部就足够了。这等于简单地更改大小&x,y。

您的某些代码正在将Enemy类名与Enemy变量名一起使用。我已将此变量名称更改为new_enemy

class Enemy:
    def __init__(self):
        self.recycle()   # set the position & size initially

    def recycle( self ):
        # start or re-start an enemy position
        self.size = random.randint(10,40)
        self.xval = random.randint(0,700)
        self.yval = -self.size              # off the screen-top
        self.rect = pygame.Rect( self.xval,self.yval,self.size,self.size )

    def draw( self,screen ):
        pygame.draw.ellipse( screen,(255,255,0),self.rect )

    def create_enemy(self):
        global enemy_list
        new_enemy = Enemy()               # create a new Enemy
        enemy_list.append( new_enemy )    # add it to the list
    

然后在主循环中,您可以recycle()离开屏幕的任何敌人。

[...]    # in main loop

# draw all the enemies,and re-position any enemies that moved off the screen
for enemy in enemy_list:
    enemy.draw( screen )
    if ( enemy.ypos > 600 ):          # TODO - don't use a fixed size
        enemy.recycle()               # move back to top

在绘图中混合了生成代码,我将其重新排列成一个单独的.draw()函数。使用此功能也可以解决清除屏幕的问题。每一帧,代码都会清除屏幕,然后重新绘制所有项目。

,

您需要创建一个敌人列表,并在主循环中迭代该列表以绘制每个敌人。使用randint随机放置敌人。

尝试以下代码:

import random,pygame

pygame.init()
Running = True
Screen = pygame.display.set_mode((800,600))

player_img = pygame.image.load('/Users/kevinhadinata/Downloads/ufo.png')
player_updated = pygame.transform.scale(player_img,(60,60))

enemy_list = []
enemy_img = pygame.image.load('/Users/kevinhadinata/Downloads/alien.png')
SPAWNENEMY = pygame.USEREVENT
pygame.time.set_timer(SPAWNENEMY,1000)

class Player:
    def __init__(self):
        self.ypos = 540
        self.xpos = 325
        self.height = 60
        self.width = 60
        self.playerUpdated = player_updated
    def create_player(self):
        self.Playerss = pygame.Rect(self.xpos,self.ypos,self.height,self.width)
        pygame.draw.ellipse(Screen,(0,self.Playerss)
        Screen.blit(player_updated,(self.Playerss.x,self.Playerss.y))
        
    def draw(self):  # draw player
        Screen.blit(player_updated,(self.xpos,self.ypos))

sizee = random.randint(10,40)
randomX = random.randint(0,700)

class Enemys:
    def __init__(self):
            #self.xval = random.randint(0,700)
            self.size = random.randint(10,40)
    def create_enemy(self):
        Enemy = pygame.Rect(random.randint(100,700),self.size)
        #enemy_updated = pygame.transform.scale(enemy_img,(self.size,self.size))
        enemy_list.append(Enemy)
        pygame.draw.ellipse(Screen,Enemy)
        
    def draw(self):  # draw all enemies
        for e in enemy_list:
            pygame.draw.ellipse(Screen,e)
            

Player = Player()  # player object
Enemys = Enemys()  # collection of enemies
Player.create_player()

while Running:
    Screen.fill((0,0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                Player.xpos -= 20
            if event.key == pygame.K_RIGHT:
                Player.xpos += 20
        if event.type == SPAWNENEMY:
            Enemys.create_enemy()

    Player.draw()  # draw player
    Enemys.draw()  # draw all enemies
    pygame.display.update()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。