2017-05-23 3 views
0

これは私のコードです:長方形が動いていないのはなぜですか?

import pygame 
from pygame.locals import * 

#define the player 
class Player(pygame.sprite.Sprite): 
def __init__(self): 
    super(Player, self).__init__() 
    self.surf = pygame.Surface((50, 25)) 
    self.surf.fill((255,255,255)) 
    self.rect = self.surf.get_rect() 

def update(self, pressed_keys): 
    """ 
    if pressed_keys[K_UP]: 
    self.rect.move_ip(0, -5) 
    if pressed_keys[K_DOWN]: 
    self.rect.move_ip(0, 5) 
    """ 
    if pressed_keys[K_LEFT]: 
    self.rect.move_ip(-5, 0) 
    if pressed_keys[K_RIGHT]: 
    self.rect.move_ip(5, 0) 

    #keep player on the screen 
    if self.rect.left < 0: 
    self.rect.left = 0 
    elif self.rect.right > 400: 
    self.rect.right = 400 

#initialization 
pygame.init() 

#create the screen object 
screen = pygame.display.set_mode((400, 600)) 

#instantiate the player 
player = Player() 

running = True 

#main loop 
while running: 
for event in pygame.event.get(): 
    if event.type == KEYDOWN: 
    if event.key == K_ESCAPE: 
    running = False 
    elif event.type == QUIT: 
    running = False 

#draw the player to the screen 
screen.blit(player.surf, (200, 550)) 

pressed_keys = pygame.key.get_pressed() 

player.update(pressed_keys) 

#update the display 
pygame.display.flip() 

すべてが現れますが、私はエラーなしで私の矢印キーで四角形を示した移動することはできません..事前に感謝を助けて!また、pressed_keysが動作しているかどうかを確認するためにプリントを追加し、長方形を動かさずにプリントします。あなたがpygameを使用していることを確認する

答えて

1

良い:PythonでD

、コードは、すべての構文規則に従って適切にインデントされ、そして最も重要なのは、あるべき意味「良い」のコードを書くことが重要です明確で読みやすい。

  1. 必ず4つのスペースまたはタブ

  2. コメント文字("#")で、あなたのコードをインデント必ず従ってください。ここでは

    は(PEP 8ガイドラインに従って)あなたのコードを固定するためのいくつかのガイドラインがありますつまり、次のようになります。"# <= there's a space there"

  3. あまりにも多くの連続した空白があってはなりません。

  4. すなわち(10, 10, 10)


そして、ここでいくつかのpygameガイド線であり、リスト/タプル/セット中のコンマの後にスペースを入れてください:あなたはpygame.key.get_pressed()を使用してはならない

  1. は、明示的にすべてのループでキー入力を確認する

  2. clock.tickを使用してフレームレートを設定しfor event in pygame.event.get()

  3. 、最小フレームレートは30である必要があり、これはscreen.fill((0, 0, 0))

  4. 、常にそれは黒だ場合でも、色を使用して画面いっぱい

  5. 一定の速度でプログラムを維持します

  6. すべてのループの後に画面を補充します。ここで


    screen.fill((0, 0, 0))

はあなたの問題を修正する方法 、待っていたものです。それは実際にはとても簡単です。 screen.blit(player.surf, (200, 550))あなたの場所は、(200, 550)に設定されています。代わりに、あなたはおそらくそれをscreen.blit(player.surf, player.rect)に変更し、playerをその場所( "rect")にブリットします。

import pygame 
from pygame.locals import * 


# define the player 
class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     super(Player, self).__init__() 
     self.surf = pygame.Surface((50, 25)) 
     self.surf.fill((255, 255, 255)) 
     self.rect = self.surf.get_rect() 

    def update(self, pressed_keys): 
     if pressed_keys == K_LEFT: 
      self.rect.move_ip(-5, 0) 
     if pressed_keys == K_RIGHT: 
      self.rect.move_ip(5, 0) 
     # keep player on the screen 
     if self.rect.left < 0: 
      self.rect.left = 0 
     elif self.rect.right > 400: 
      self.rect.right = 400 

# initialization 
pygame.init() 

# create the screen object 
screen = pygame.display.set_mode((400, 600)) 
screen.fill((0, 0, 0)) 

# instantiate the player 
player = Player() 

# instantiate the ticker 
clock = pygame.time.Clock() 

# mainloop 
running = True 
while running: 
    for event in pygame.event.get(): 
     if event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       running = False 
      elif event.key == K_LEFT: 
       player.update(event.key) 
      elif event.key == K_RIGHT: 
       player.update(event.key) 
     elif event.type == QUIT: 
      running = False 

    screen.fill((0, 0, 0)) 
    # draw the player to the screen 
    screen.blit(player.surf, player.rect) 
    # update the display 
    pygame.display.flip() 
    clock.tick(30) 
+0

どうもありがとう:


はここにすべての私の提案、次のコードの完全な修正版です。すみません、プレイヤーの位置を設定するにはどうしたらいいですか?ありがとうございました。 – Entel

+0

最初にスプライトの場所を設定するには、 'self.rect = self.surf.get_rect()'を 'self.rect = self.surf.get_rect(center =(100,100))'に置き換えてください。タプルを '(x、y)'に置き換え、 'center'引数を' topleft'、 'topright'、' 'top''、' bottom' ...に置き換えることができます。 ://www.pygame.org/docs/ref/rect.html#pygame.Rect。その後、 'self.rect.move(x、y)'を使ってスプライトを 'x'と' y'コードに移動することができます。 'self.rect.right = 10'または' self.rect.top = 100'の組み合わせのいずれか... – abccd

+1

'pygame.key.get_pressed()を明示的に使用して、すべてのループでキー入力をチェックしないでください。あなたのコードは遅くなり、おそらく遅れてしまうでしょう - それはナンセンスです。コードを遅くすることはありません。 'pygame.key.get_pressed()'はキーの状態を取得する正しい方法です。あなたのコードでは、もはや連続した動きを得るためにキーを押したままにすることはできません。 「フレームレートを設定しすぎてRAMを消費しないようにする」 - それはナンセンスです。あなたのゲームが一定の速度で動くようにフレームレートを設定します。それはRAMとは関係ありません.... – sloth

関連する問題