2017-05-27 4 views
0

矢印キーで四角形を移動したいのですが、これまでは四角形を描くことしかできませんが、キーハンドラーは機能しません。 私はpythonとpygameの初心者です。このコードでpygameを使ってPythonで矩形を移動するにはどうすればいいですか?

これは私のmain.pyです:

import pygame 
import time 
import random 
from Player import * 

# Initialize Pygame 
pygame.init() 
game_over = False 

# Color 
BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 
GRAY = (192, 192, 192) 

# Setting up the window 
surfaceWidth = 800 
surfaceHeight = 500 

surface = pygame.display.set_mode((surfaceWidth, surfaceHeight)) 
pygame.display.set_caption("Rectangle Runner") 
clock = pygame.time.Clock() 

#Player(surface, surface_height, surface_width, size, jump_height, color) 
player = Player(surface, surfaceHeight, surfaceWidth, 50, 200, BLACK) 

# Game Loop 
while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      game_over = True 
     if game_over == True: 
      pygame.quit() 
      quit() 
    surface.fill(GRAY) 
    #Player.draw() 
    player.keyHandling() 
    player.checkBoundaries() 
    player.draw() 
    #Obstacle.draw() 
    pygame.display.update() 
    clock.tick(60) 
# This code shall be unreachable 
pygame.quit() 
quit() 

これはPlayer.pyです:

import pygame 


class Player: 

    def __init__(self, surface, surface_height, surface_width, size, jump_height, color): 
     self.surface = surface 
     self.surface_height = surface_height 
     self.surface_width = surface_width 
     self.size = size 
     self.jump_height = jump_height 
     self.color = color 

     self.x = (0 + (self.surface_width/10)) 
     self.y = self.surface_height - self.size 

     self.x_move = 0 
     self.y_move = 0 

     self.rect = pygame.draw.rect(self.surface, self.color, [self.x, self.y, self.size, self.size]) 


    def keyHandling(self): 
     # Draw the player 
     #pygame.draw.rect(self.surface, self.color, 
         #[self.x, self.y, self.size, self.size]) 
     # KeyListener 
     for event in pygame.event.get(): 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_UP: 
        self.y_move = -10 
        #self.y += self.y_move 
        #self.rect.move_ip(0, -10) 
       if event.key == pygame.K_LEFT: 
        self.x_move = -5 
        #self.x += self.x_move 
        #self.rect.move_ip(-5, 0) 
       if event.key == pygame.K_RIGHT: 
        self.x_move = 5 
        #self.x += self.x_move 
        #self.rect.move_ip(5, 0) 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_UP: 
        self.y_move = 0 
        #self.y += self.y_move 
        #self.rect.move_ip(0, 10) 
       if event.key == pygame.K_LEFT: 
        self.x_move = 0 
       if event.key == pygame.K_RIGHT: 
        self.x_move = 0 
     self.x += self.x_move 
     self.y += self.y_move 


    def checkBoundaries(self): 
     # Checking for Boundaries 
     #if self.y <= self.jump_height: 
     # self.y_move = -10 
     if self.y > self.surface_height - self.size: 
      self.y_move = 0 
     if self.y <= self.jump_height + self.size: 
      self.y_move = -10 

    def draw(self): 
     pygame.draw.rect(self.surface, self.color, [self.x, self.y, self.size, self.size]) 




     #pygame.draw.rect(self.surface, self.color,[self.x, self.y, self.size, self.size]) 

私は助けを必要としています。私はこれを一日中考えている。 事前に感謝:D

答えて

0

あなたのコードの問題は、pygame.event.get()はジェネレータです。それから得られた各アイテムは一度だけ得ることができます。したがって、時計が動くたびに、あなたはイベントジェネレータ内のすべてをつかんでおり、それらはすべて破壊されます。次に、Playerオブジェクトがpygame.event.getを反復するとき、ジェネレータはすでに空になっているので、何もしません。ジェネレータについてはthisを参照してください。

あなたがする必要があるのは、main.pyモジュールのKEYDOWNイベントをキャッチして、キー情報をPlayerオブジェクトに渡すことです。

は、以下でmain.pyでメインループを交換してください:

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      game_over = True 
     if event.type == pygame.KEYDOWN: 
      player.keyDown(event.key) 
     if game_over == True: 
      pygame.quit() 
      quit() 
    surface.fill(GRAY) 
    player.checkBoundaries() 
    player.draw() 
    pygame.display.update() 
    clock.tick(60) 

Player.pyからkeyHandling方法を削除し、以下の方法で置き換える:

def keyDown(self, key): 
    if key == pygame.K_w: 
     self.y -= 10 
    elif key == pygame.K_a: 
     self.x -= 10 
    elif key == pygame.K_d: 
     self.x += 10 

これは今、発電機の問題を取り除きます。

Full code

+0

はまた、プログラムは非常に不格好な方法で動くことに注意してください。おそらく、force/vectorsシステムがこれを修正するでしょう(私はPygameのために過去に実装しました)、それがあなたが追加したい何かになる場合は、よりスムーズにします。 – Frogboxe

+0

これは私の問題を解決しました!力/ベクトルシステムのコード例があれば、本当に感謝しています! – wjatscheslaw

+0

実際、 'pygame.event.get()'はジェネレータを返していません。それは普通のリストを返す。変数 'events = pygame.event.get()'にリストを保存すると、リストを複数回反復することができます。イベントリストを複数のオブジェクトに渡したいかどうかを知ることができます(例えば、 'keyHandling'は単一のイベントの代わりにイベントリスト全体を取ることができます)、またはすべてのイベントを繰り返して次のフレームのために保存したい。最後の呼び出し以降に起こったすべてのイベントを返すのは 'pygame.event.get()'関数です。 –

関連する問題