同精灵的产卵场多(Spawning Multiple of the same sprite)

2019-09-16 21:39发布

我目前工作的一个名为Table战争,一个回合制策略游戏两名球员的比赛。 进展一直都很顺利,直到我遇到了与产卵单位的问题。

该程序将不生成同一单元的多个,或重生新的旧的死了以后。

下面是一些信息,可以帮助:

  • 每个类存储在一个变量:( redI = Red_Infantry()
  • 所有功能都存储在主回路。
  • 子画面类具有硬编码的X和Y值,产卵单元和移动单元时使用。

我该怎么办?

按照要求,这里是红军步兵类:

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死了,就不会再回来,如果我尝试产卵它。

Answer 1:

产卵过程的一部分,你贴不会产生任何新的实例。 除非redI声明为新Red_Infantry别的地方,你需要修改代码来创建一个新的实例Red_Infantry要催生一个士兵每次。

sprites.append(Red_Infantry())

要更新精灵:

for sprite in sprites:
    sprite.update()

把运动和更新方法等状态变化。 这就是pygame的预期,但如果你愿意,你可以使用不同的风格。 主要的一点是你必须拥有的多个实例Red_Infantry才能看到多个精灵。

你也可以使用pygame中的组类 ,而不是一个简单的列表来保存精灵。


下面是一个使用一个完整的例子Group ,而不是名单。 在该示例中, Enemy在每次键被按下时产生了。 每个Enemy打印其唯一ID到标准输出。

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()


文章来源: Spawning Multiple of the same sprite
标签: pygame