簡體   English   中英

如何在pygame中產生多個敵人

[英]How to spawn multiple enemies in pygame

所以我試圖制作一個游戲,角色應該躲避從上方隨機產生的敵人。 問題是,我不知道如何在不實例化另一個類的情況下使隨機值不同,這是我不想做的。 此外,使用 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, 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, 0, 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,0),Enemy)

Player = Player()
Enemys = Enemy()

while Running:
    Screen.fill((0,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, 0, 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), 0, 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,0),Enemy)
        
    def draw(self):  # draw all enemies
        for e in enemy_list:
            pygame.draw.ellipse(Screen,(255,255,0),e)
            

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

while Running:
    Screen.fill((0,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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM