2017-04-09 3 views
1

変数all_spritesをpygame.Group()として呼び出すと値が返されず、理由がわかりません。グループを使用してpygameで画面に描画するのに問題があります

class game: 

def __init__(self): 
    pg.init() 
    self.screen = pg.display.set_mode((screenwidth, screenheight)) 
    pg.display.set_caption("Gammee") 
    self.clock = pg.time.Clock() 



def run(self): 

    while True: 
     self.dt = self.clock.tick(FPS)/1000 
     self.events() 
     self.update() 
     self.draw() 

def new(self): 
    self.othersprites = pg.sprite.Group() 

def draw(self): 
    self.screen.fill(BGCOLOR) 

    self.othersprites.draw(self.screen) 

    pg.display.flip() 

def quit(self): 
    pg.quit() 
    sys.exit() 

def update(self): 
    self.othersprites.update() 

def events(self): 

    for event in pg.event.get(): 
     if event.type == pg.QUIT: 
      self.quit() 
g = game() 

while True: 
    g.new() 
    g.run() 

これは、しかし、何もがれに描かれていないゲーム

class Player(pg.sprite.Sprite): 

def __init__(self, game, x, y): 

    self.groups = game.all_sprites 
    pg.sprite.Sprite.__init__(self, self.groups) 
    self.game = game 
    self.image = pg.Surface((30, 30), SRCALPHA) 
    self.image.fill(YELLOW) 
    self.rect = self.image.get_rect() 

    self.vx, self.vy = 0, 0 
    self.x = x 
    self.y = y 

def get_keys(self): 
    keys = pg.key.get_pressed() 
    if keys[pg.K_LEFT] or keys[pg.K_a]: 
     self.vx = -PLAYER_SPEED 
    if keys[pg.K_RIGHT] or keys[pg.K_d]: 
     self.vx = PLAYER_SPEED 
    if keys[pg.K_UP] or keys[pg.K_w]: 
     self.vy = -PLAYER_SPEED 
    if keys[pg.K_DOWN] or keys[pg.K_s]: 
     self.vy = PLAYER_SPEED 
    if len(keys) != 0: 
     self.vx *= 0.9 
     self.vy *= 0.9 

def update(self): 
    self.get_keys() 
    self.x += self.vx * self.game.dt 
    self.y += self.vy * self.game.dt 
    self.rect.x = self.x 
    self.rect.y = self.y 

ためのコードです。私はまた、スプライトに出力先に​​使用

for sprite in self.all_sprites: 
    print(sprite) 

を置くことによってテストされたが、今私が間違ってやっているのと、

任意のアイデアを何もしませんか?

+3

「Player」をインスタンス化するのを忘れていましたか?コードはエラーを見つけるのに十分ではありませんので、質問を編集し、[最小で完全で検証可能な例]を提供してください(http://stackoverflow.com/help/mcve)。 – skrx

+0

返信いただきありがとうございます。質問を更新して完全なゲームコードを追加しました。プレイヤーをインスタンス化するために、iitがグループに追加されたときに自動的にインスタンス化されると仮定して間違っていなければなりませんか?例えば、クラスには、上とキャメルケースの名前が必要です(例: –

答えて

0

クラスのnewメソッドでPlayerのインスタンスを作成する必要があります。また、スプライトグループは、gameクラスではotherspritesPlayerクラスではall_spritesと呼ばれますが、名前は一致している必要があります。

class game: 

    def new(self): 
     self.othersprites = pg.sprite.Group() 
     # This is how you create an instance/object. 
     self.player = Player(self, 200, 300) 


class Player(pg.sprite.Sprite): 

    def __init__(self, game, x, y): 
     self.groups = game.othersprites 

は、私はプレイヤーに全体gameインスタンスを渡すのではなく、新しい方法でself.otherspritesself.playerスプライトを追加してよりよいと単純になると思います。

class game: 

    def new(self): 
     self.othersprites = pg.sprite.Group() 
     self.player = Player(200, 300) 
     self.othersprites.add(self.player) 
+0

)。 'class GameCharacter'、アンダースコアの小文字(snake_case)は関数/メソッドと変数のためのものです。 'a_variable_name'です。 – skrx

関連する問題