2012-04-30 6 views
2

私は現在、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!" 

これは、すべてのユニットと同様のスタイルです。最初は正しく実行されますが、2番目、3番目などでは実行されません。つまり、1つの兵士しか持てないということです。また、その兵士がself.killで死亡した場合、私がそれを生成しようとすると元に戻りません。

+0

。クラス定義と新しいインスタンスの作成方法の例を(少なくとも)提供してください。作られたrobots.jpgの編集@ –

+0

、 'sprites.append(Red_Infantry())'と呼ばれると、他の機能は 'まだ使用可能redI'、または私はこれと互換性があるように私のコードを手直しする必要があります使用しますこれは – Oventoaster

答えて

3

投稿したスポーンプロシージャの一部は、新しいインスタンスを作成しません。 redIが新しいRed_Infantryとして宣言されていない限り、兵士をスポーンするたびにRed_Infantryの新しいインスタンスを作成するようにコードを修正する必要があります。

sprites.append(Red_Infantry()) 

スプライト更新する:

for sprite in sprites: 
    sprite.update() 

プット移動および更新方法の他の状態変化を。これはパイゲームが期待するものですが、必要に応じて別のスタイルを使用することもできます。要点は、複数のスプライトを表示するには、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() 
+0

を役に立てば幸いコール?さらに、移動と攻撃のコードを各ユニットクラスに移動する必要がありますか? – Oventoaster

+0

私が追加した例を見てください - それは 'pygame.sprite 'を使います。グループ '更新と産卵を処理する – Devourant

+0

Slaceさん、ありがとう、' Group() 'クラスは完璧に動作します!グループをレンダリングリストの一番上に移動し、動きやコードを修正するだけです。どうもありがとう! – Oventoaster

関連する問題