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で死亡した場合、スポーンしようとしても戻ってきません。

4

1 に答える 1

3

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

sprites.append(Red_Infantry())

スプライトを更新するには:

for sprite in sprites:
    sprite.update()

動きやその他の状態変化をupdateメソッドに入れます。これはpygameが期待することですが、必要に応じて別のスタイルを使用できます。Red_Infantry重要な点は、複数のスプライトを表示するには、の複数のインスタンスが必要であるということです。

スプライトを保持するための単純なリストの代わりに、pygameのGroupクラスを使用することもできます。


Groupこれは、リストの代わりにを使用する完全な例です。この例でEnemyは、キーが押されるたびにanが生成されます。それぞれ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()
于 2012-05-02T16:57:49.063 に答える