我目前正在开发一款名为Table Wars的游戏,这是一款针对两名玩家的回合制战略游戏。进展一直很顺利,直到我遇到产卵单位的问题。
程序不会产生同一个单元的多个,或者在旧单元死后重新生成新单元。
以下是一些可能有用的信息:
redI = Red_Infantry()
)我该怎么办?
根据要求,这里是红步兵的课程:
class Red_Infantry(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('Soldier_red.png', -1)
self.selected = 0
self.area = screen.get_rect()
self.rect.topleft = (100, 300)
self.health = 100 #Soldiers are have mediocre toughness.
self.attack_damage = 25
self.range_maximum = 20 #in pixels, this is melee range
self.range_minimum = 0
self.update()
def update(self):
if self.health <= 0:
self.kill()
和产生这个单位的代码:
if spawned_units < 3 and PHASE == 1 and TURN == 'Red':
if REDGOLD < 10:
print "Out of money! Moving to Phase 2!"
PHASE = 2
spawned_units = 0
elif event.type == KEYDOWN and event.key == K_1:
if REDGOLD >= 10 and REDCOMMAND >= 5:
Sprites.append(redI)
REDGOLD -= 10
REDCOMMAND -= 5
spawned_units = spawned_units + 1
else:
print "Not enough gold!"
这与所有单位的风格相似。它第一次正确执行,但不是在第二次,第三次等等,这意味着我只能有一名士兵。此外,当那个士兵通过self.kill死亡时,如果我试图产生它就不会再回来了。
答案 0 :(得分:3)
您发布的spawn过程的一部分不会创建任何新实例。除非redI
在其他地方被声明为新的Red_Infantry
,否则每次要生成士兵时都需要修改代码以创建Red_Infantry
的新实例。
sprites.append(Red_Infantry())
更新精灵:
for sprite in sprites:
sprite.update()
在更新方法中放置移动和其他状态更改。这是pygame所期望的,但如果你愿意,你可以使用不同的风格。重点是你必须有多个Red_Infantry
实例才能看到多个精灵。
您也可以使用pygame's Group class代替简单列表来保存精灵。
这是一个使用Group
而不是列表的完整示例。在该示例中,每次按下键时都会生成Enemy
。每个Enemy
都会将其唯一ID打印到stdout。
import sys
import random
import pygame
from pygame.locals import *
def main():
pygame.init()
screen = pygame.display.set_mode((480, 320))
enemies = pygame.sprite.Group()
while True:
for event in pygame.event.get():
if event.type == KEYDOWN:
enemies.add(Enemy(screen))
elif event.type == QUIT:
sys.exit()
enemies.update()
screen.fill(pygame.Color("black"))
enemies.draw(screen)
pygame.display.update()
class Enemy(pygame.sprite.Sprite):
def __init__(self, screen):
pygame.sprite.Sprite.__init__(self)
print "created a new sprite:", id(self)
self.image = pygame.image.load("sprite.png")
self.rect = self.image.get_rect()
self.rect.move_ip(random.randint(0, screen.get_width()),
random.randint(0, screen.get_height()))
def update(self):
self.rect.move_ip(random.randint(-3, 3), 0)
if __name__ == "__main__":
main()