2012-04-30 128 views
2

我目前正在研究一款桌面戰爭遊戲,一款基於回合制策略遊戲的雙人遊戲。進展一直順利,直到遇到產卵單位的問題。產卵倍數相同的精靈

該程序不會產生多個相同的單位,或在舊的死亡後重新生成新的。

下面是一些信息可以幫助:

  • 每個類存儲在一個變量:(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死亡時,如果我嘗試產卵,它就不會回來。

+0

這些信息不足。嘗試提供(至少)你的類定義以及你如何創建新實例的例子。 –

+0

@ robots.jpg進行編輯,希望能有所幫助 – Oventoaster

回答

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輸出到標準輸出。

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

調用sprites.append(Red_Infantry())'後,其他使用'redI'的函數仍然可用,還是必須重寫我的代碼才能與此兼容呼叫?另外,我是否應該將移動和攻擊代碼移動到每個單元課程? – Oventoaster

+0

查看我添加的示例 - 它使用'pygame.sprite。Group'來處理更新和產卵 – Devourant

+0

謝謝Slace,'Group()'類完美地工作!我只需將組移到渲染列表的頂部,並重新修改我的動作和攻擊代碼。非常感謝! – Oventoaster