2017-07-03 13 views
-1

ここに私のコードです。クラスPlayerスプライトをどのように動かすことができますか? にx、yを追加しますか? def __init__(self, x, y)のように?答えてくれてありがとう、プレーヤーのスプライトを移動するには?

import pygame as pg 
WIDTH = 800 
HEIGHT = 600 

CLOCK = pg.time.Clock() 
FPS = 60 

GREEN = (0, 255, 0) 
LIGHTBLUE = (20, 130, 230) 
BGCOLOR = LIGHTBLUE 

class Player(pg.sprite.Sprite): 

    def __init__(self, x, y): 
     pg.sprite.Sprite.__init__(self) 
     self.image = pg.Surface((50, 50)) 
     self.image.fill(GREEN) 
     self.rect = self.image.get_rect() 
     self.rect.center = ((WIDTH/2, HEIGHT/2)) 
     self.x = x 
     self.y = y 

player = Player() 

pg.init() 

screen = pg.display.set_mode((WIDTH, HEIGHT)) 
pg.display.set_caption('The Moon Smiles Back') 

running = True 
while running: 
    for event in pg.event.get(): 
     if event.type == pg.QUIT: 
      running = False 
     if event.type == pg.KEYDOWN: 
      if event.key == pg.K_ESCAPE: 
       running = False 

    all_sprites = pg.sprite.Group() 
    all_sprites.add(player) 
    all_sprites.update() 
    screen.fill(BGCOLOR) 
    all_sprites.draw(screen) 
    pg.display.flip() 

    CLOCK.tick(FPS) 

pg.quit() 
+1

あなたの投稿がほとんどコードではないようにランダムな文字を追加しないでください。 – perfect5th

+0

コードとタイトルを修正しました。 – phd

答えて

0

は、プレイヤーの現在の速度を保存するためにPlayerクラスに二つの属性を追加します。 updateメソッドでは、xy属性に速度を追加し、rectを新しい位置に設定します。キーが離された場合

class Player(pg.sprite.Sprite): 

    def __init__(self, x, y): 
     pg.sprite.Sprite.__init__(self) 
     self.image = pg.Surface((50, 50)) 
     self.image.fill(GREEN) 
     self.rect = self.image.get_rect() 
     self.rect.center = (x, y) 
     self.x = x 
     self.y = y 
     self.velocity_x = 0 
     self.velocity_y = 0 

    def update(self): 
     self.x += self.velocity_x 
     self.y += self.velocity_y 
     self.rect.center = (self.x, self.y) 

は0に戻る「D」キー(この例では)が押された場合、所望の速度にplayer.velocity_xを設定、右にプレイヤーを移動し、します。他の方向についても同じことをしてください。

if event.type == pg.KEYDOWN: 
    if event.key == pg.K_ESCAPE: 
     running = False 
    elif event.key == pg.K_d: 
     player.velocity_x = 3 
elif event.type == pg.KEYUP: 
    if event.key == pg.K_d: 
     player.velocity_x = 0 
+0

あなたの更新機能では、単に 'self.rect.move_ip(self.velocity_x、self.velocity_x)'を使用することもできます。 – sloth

+0

私は 'rect.move_ip'または' rect.x + = speed'をもっとも単純なものゲーム。問題は、整数(浮動小数点数は切り捨てられます)でのみ正しく動作することです。最終的にゲームフレームレートを独立させたい場合は、速度をデルタ時間で掛けなければならないため、浮動小数点数を処理する必要があります。私は実際には位置と速度のベクトルを使用しますが、コードを少しシンプルに保つようにしました。したがって、この例は正しい方向への第一歩です。 – skrx

+0

公正なポイント。 pygameがベクトルクラスを提供するのは残念ですが、 'Sprite' /' Group'/'Rect'システム全体はそれらを使用しません。あなたの位置ベクトルに合わせてスプライトの矩形を手動で変更する必要があります。 ...... Spriteクラスが自動的にそれを処理できるなら、いいでしょう...... – sloth

関連する問題