2017-05-27 64 views
0

我想用箭頭鍵移動一個矩形,到目前爲止,我只能繪製矩形,但我沒有讓keyhandler工作。 我是python和pygame的新手。如何在python中使用pygame在這段代碼中移動一個矩形?

這是我的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

另請注意,程序以非常笨拙的方式移動。也許一個力量/矢量系統可以解決這個問題(我已經在pygame中專門實現了一個),並且如果這恰好是你想要添加的東西,那麼使它更加平滑。 – Frogboxe

+0

這解決了我的問題!如果你有一個強制/矢量系統的代碼示例,我將非常感激! – wjatscheslaw

+0

實際上,'pygame.event.get()'不返回一個生成器;它返回一個普通的列表。如果您將列表保存在變量'events = pygame.event.get()'中,則可以多次迭代列表。如果您想將事件列表傳遞給多個對象(例如'keyHandling'可以取整個事件列表而不是單個事件),或者想遍歷所有事件並將它們保存到下一幀,可能會有用。它是函數'pygame.event.get()',它將返回自上次調用以來發生的所有事件。 –