我用python 2和pygame创建了一个简单的2D游戏,在这个游戏中你必须避开向下移动的方块。我为“敌人”创建了这个类:
class Enemy(pygame.sprite.Sprite):
def __init__(self, game):
self.groups = game.all_sprites
pygame.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = pygame.Surface((TILESIZE + 10, TILESIZE + 10))
self.image.fill(ENEMY_COLOR)
self.rect = self.image.get_rect()
self.x = random.uniform(0, WIDTH - TILESIZE)
self.rect.x = self.x
self.y = 0
def update(self):
if self.rect.colliderect(self.game.player.rect):
self.game.deaths += 1
self.game.score = 0
self.game.run()
self.rect.y += (self.game.score + 500) / 50
然后,我有一个线程创建一个敌人的示例:
class Create_Enemy(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
while True:
while not game.game_paused:
time.sleep((game.score + 1) / game.speed)
Enemy(game)
然后在draw方法中我写self.all_sprites.draw()
这个游戏是一个无限运行的,每一帧敌人都向下移动几个像素,问题是过了一段时间游戏变得很慢,因为当方块离开屏幕时,精灵不会被删除,有没有办法自动删除屏幕外的示例?
我尝试了以下方法,但它只是删除屏幕上的所有敌人。
if self.rect.y >= WIDTH:
self.rect.kill()
我想我可以做一些类似game.all_sprites.pop(1)
的事情(位置0是播放器),但我找不到一种方法来存档类似的东西...
2条答案
按热度按时间dsf9zpds1#
如果敌人的
rect
不在屏幕内,他们可以通过调用self.kill()
将自己从游戏中移除,例如:另外,你也可以使用pygame的事件系统来代替线程来生成敌人。下面是一个简单的,不完整的,但可以运行的例子(注意注解):
nmpmafwu2#
检查self.rect.y的值,WIDTH,也许是kill方法。看起来self.rect.y总是大于或等于WIDTH,这就是为什么它把它们都杀死了。