如何解决如何在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 举报,一经查实,本站将立刻删除。