2017-04-27 3 views
1

単純なゲームを作ろうとしていますが、動きが正しく動作しません。 ボタンが押されている間は動き続けますが、画面の境界線を尊重したいと思っています。それはここに私のコードは、矩形が吃音になり、ハードウェアイベントがキーを押すように起こった場合、pygame constant if文で移動する

import pygame 

pygame.init() 

SD = pygame.display.set_mode((640,480)) 
x = 16 
y = 16 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 
     keys = pygame.key.get_pressed() 
     if keys[pygame.K_w]: 
      if y > 0: 
       y -= 8 
     if keys[pygame.K_a]: 
      if x > 0: 
       x -= 8 
     if keys[pygame.K_s]: 
      if y < 448: 
       y += 8 
     if keys[pygame.K_d]: 
      if x < 608: 
       x += 8 
    SD.fill((255,255,255)) 
    pygame.draw.rect(SD, (255,0,0), (x,y, 30, 30)) 
    pygame.display.update() 

答えて

1

pygame.event.get()はイベントのみが返されます。あなたのif keys[...]は何も起こらないときに評価されません(押されたキーイベントは繰り返されません)

ifsを1レベル上に動かすと、吃音なく動くでしょうが、あなたの動きを遅くする必要があります後で(sleep(0.1)はこの例で行いますが、あなたがループを描いて眠りたくないのでもっと進んだ方がいいでしょう)

+0

はい、ゲームのループではsleep()を使用しないでください。 Pygameには時計が内蔵されています。 'clock = pygame.time.Clock()'を使って作成し、ゲームループでは 'clock.tick(30)'を使用します - これはループが30fpsで動作するようにします。 – Chris

1

キーの押し方は、エンジン)は、キーが押されたり解放されたときにだけイベントを取得するということです。あなたのキャラクターの動きが非常に不安定になっているのは、テキストエディタでキーを押さえているようにキープレスが処理されているからです。キーを押したままにすると、手紙が表示され、手短に手紙が繰り返されます。

あなたが本当にやりたいことは、キープレスイベントを取得したときにTrueに設定し、キーリリースイベントを取得したときにFalseに設定する各キーのブール値を持つことです(process_events関数)。

私は(私は後で説明しますいくつかの他の変更と一緒に)ちょうどそれをするようにコードを変更した:

import pygame 


class Game(object): 
    def __init__(self): 
     """ 
     Initialize our game. 
     """ 
     # The initial position. 
     self.x = 16 
     self.y = 16 

     # The keyboard state. 
     self.keys = { 
      pygame.K_w: False, 
      pygame.K_a: False, 
      pygame.K_s: False, 
      pygame.K_d: False, 
     } 

     # Create the screen. 
     self.SD = pygame.display.set_mode((640,480)) 

    def move_character(self): 
     """ 
     Move the character according to the current keyboard state. 
     """ 
     # Process vertical movement. 
     if self.keys[pygame.K_w] and self.y > 0: 
      self.y -= 1 
     if self.keys[pygame.K_s] and self.y < 448: 
      self.y += 1 

     # Process horizontal movement. 
     if self.keys[pygame.K_a] and self.x > 0: 
      self.x -= 1 
     if self.keys[pygame.K_d] and self.x < 608: 
      self.x += 1 

    def process_events(self): 
     """ 
     Go through the pending events and process them. 
     """ 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 
      # If the event is a key press or release event, then register it 
      # with our keyboard state. 
      elif event.type == pygame.KEYDOWN: 
       self.keys[event.key] = True 
      elif event.type == pygame.KEYUP: 
       self.keys[event.key] = False 

    def draw(self): 
     """ 
     Draw the game character. 
     """ 
     self.SD.fill((255,255,255)) 
     pygame.draw.rect(self.SD, (255,0,0), (self.x, self.y, 30, 30)) 
     pygame.display.update() 

    def run(self): 
     while True: 
      self.process_events() 
      self.move_character() 
      self.draw() 


def main(): 
    pygame.init() 

    game = Game() 
    game.run() 


# This just means that the main function is called when we call this file 
# with python. 
if __name__ == '__main__': 
    main() 

私が作った最大の変化は、クラスの中にあなたのゲームを移動することです関数の変数へのアクセスを改善します。また、コードを読みやすくするさまざまな機能に分割することもできます。

関連する問題