问题描述
下面我有一个格斗游戏,在该游戏中,一旦将玩家从屏幕上推下,游戏便会结束并可以选择重新启动。我的问题是,重新启动后,无论获奖者站在哪儿,克隆品(或印章,图像,鬼影或污点)都会永久保留(即使经过多次回合/死亡)。我需要修复什么,以便在旧位置正确填充背景?我尝试在多个地方添加screen.fill()
无济于事。
class Game:
def __init__(self):
self.all_sprites = pg.sprite.Group()
self.screen = pg.display.set_mode((WIDTH,HEIGHT))
self.playing = True
def new(self):
# RESET PLAYERS
self.player1 = Player(self,2,FLOOR,RED)
self.player2 = Player(self,7,BLUE)
return z.run()
def run(self):
# LOOP
while self.playing:
self.events()
self.update()
self.draw()
def events(self):
# INPUT
for event in pg.event.get():
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
pg.quit()
sys.exit()
# MOVE
if event.key == pg.K_a:
self.player1.move(dx=-1)
if event.key == pg.K_RIGHT:
self.player2.move(dx=1)
# DIE
if z.player1.x < 0:
return z.encore()
def update(self):
# CHANGE INTERNAL PLAYER DATA
self.all_sprites.update()
def draw(self):
# CHANGE PLAYER PHENOMENA
z.screen.fill(BACKGROUND)
z.all_sprites.draw(z.screen)
pg.display.flip()
def encore(self):
# PLAY AGAIN?
curtain = True
while curtain:
z.screen.fill(RED)
for event in pg.event.get():
if event.type == pg.KEYDOWN:
return z.new()
z = Game()
z.new()
在我的Player类下面:
class Player(pg.sprite.Sprite):
def __init__(self,game,x,y,color):
self.groups = game.all_sprites
pg.sprite.Sprite.__init__(self,self.groups)
self.game = game
self.image = pg.Surface((TILESIZE,TILESIZE))
self.image.fill(color)
self.rect = self.image.get_rect()
self.x = x
self.y = y
def move(self,dx=0):
self.x += dx
def update(self):
self.rect.x = int(self.x * TILESIZE)
self.rect.y = int(self.y * TILESIZE)
编程新手;希望包括所有这些代码并不过分;信不信由你,我实际上花了很长时间才将其减少到100行以下。谢谢您的时间!
解决方法
之所以会发生这种情况,是因为每个游戏实例之后都没有重置all_sprites
变量。因此,即使未与Player
连接,仍在绘制以前游戏的精灵。这可以通过Group.empty()
函数来解决,例如:
def encore(self):
# PLAY AGAIN?
curtain = True
while curtain:
z.screen.fill(RED)
for event in pg.event.get():
if event.type == pg.KEYDOWN:
self.all_sprites.empty()
return z.new()
此外,由于循环中的显示未更新,因此z.screen.fill(RED)
似乎无效。这可以通过在后面添加pg.display.flip()
来解决。