2016-11-13 63 views
1

我正在使用python 2.7嘗試使用pygame模塊做一個簡單的遊戲。在這個程序中,它會形成一個矩形,我所遇到的麻煩是讓它在鍵被按下時移動。我認爲問題出在我的代碼中的'player.move'部分,但pygames網站上的文檔很差。任何幫助表示讚賞。如何在pygame中添加移動到形狀?

import pygame 
import random 
import time 

pygame.init() 

white = (255,255,255) 
black = (0,0,0) 

displayWidth = 800 
displayHeight = 800 

FPS = 30 
clock = pygame.time.Clock() 

blockWidth = 50 
blockHeight = 50 

pygame.display.set_caption('Test Game') 
screen = pygame.display.set_mode([displayWidth, displayHeight]) 
background = pygame.Surface(screen.get_size()) 
background.fill((white)) 
background = background.convert() 
screen.blit(background, (0,0)) 
global xStart, yStart 
xStart = 400 
yStart = 400 
global player 
player = pygame.draw.rect(screen, black, ([xStart,yStart,blockWidth,blockHeight])) 
pygame.display.update() 
def mainloop(): 
    global x, y 
    x = xStart 
    y = yStart 
    mainloop = True 
    pygame.display.update() 
    while mainloop == True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       mainloop = False 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_ESCAPE: 
        mainloop = False 
       if event.key == pygame.K_UP: 
        player.move(x, y + 10) 
        pygame.display.update() 
       if event.key == pygame.K_DOWN: 
        player.move(x, y - 10) 
        pygame.display.update() 
       if event.key == pygame.K_LEFT: 
        player.move(x - 10, y) 
        pygame.display.update() 
       if event.key == pygame.K_RIGHT: 
        player.move(x + 10, y) 
        pygame.display.update() 
      clock.tick(FPS) 
      pygame.display.flip() 

mainloop() 
pygame.quit() 
+0

'pygame.draw.rect()'是繪製矩形,而不是用於創建對象。在'while True'中,你必須清除屏幕並在新的地方繪製矩形 - 一次又一次。現在你改變了球員的位置,但是你不會再以新的位置抽球。 PyGame是低級庫,你必須自己做所有事情 - 它不會自動移動和繪製。 – furas

+0

更好找一些教程 - 即。 [編程街機遊戲 與Python和Pygame](http://programarcadegames.com/) – furas

+1

@奧斯汀,也嘗試閱讀我們自己的測試文檔[pygame。](http://stackoverflow.com/documentation/pygame /主題) –

回答

0

查找教程(即Program Arcade Games With Python And Pygame),因爲你有很多事情要改變。

PyGame是低級庫,你必須自己做所有事情。在while循環中,您必須清除屏幕或繪製背景並一次又一次地繪製播放器。

在這裏你的代碼修改後。

你要學會pygame.Rectpygame.Surface,(pygame.Sprite),events

import pygame 
import random 
import time 

# --- constants --- (UPPER_CASE names) 

WHITE = (255, 255, 255) 
BLACK = (0 , 0, 0) 

DISPLAY_WIDTH = 800 
DISPLAY_HEIGHT = 800 

FPS = 30 

BLOCK_WIDTH = 50 
BLOCK_HEIGHT = 50 

# --- functions --- (lower_case names) 

def run(): 

    mainloop = True 

    speed_x = 0 
    speed_y = 0 

    while mainloop: 

     # --- events --- 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       mainloop = False 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_ESCAPE: 
        mainloop = False 
       # - start moving - 
       elif event.key == pygame.K_UP: 
        speed_y = -10 
       elif event.key == pygame.K_DOWN: 
        speed_y = 10 
       elif event.key == pygame.K_LEFT: 
        speed_x = -10 
       elif event.key == pygame.K_RIGHT: 
        speed_x = 10 
      #elif event.type == pygame.KEYUP: 
      # # - stop moving - 
      # if event.key == pygame.K_UP: 
      #  speed_y = 0 
      # elif event.key == pygame.K_DOWN: 
      #  speed_y = 0 
      # elif event.key == pygame.K_LEFT: 
      #  speed_x = 0 
      # elif event.key == pygame.K_RIGHT: 
      #  speed_x = 0    

     # --- updates --- 

     player_rect.move_ip(speed_x, speed_y) 

     # --- draws --- 

     screen.blit(background, background_rect) 
     screen.blit(player, player_rect)      
     pygame.display.flip() 

     clock.tick(FPS) 

# --- main --- 

pygame.init() 
pygame.display.set_caption('Test Game') 

screen = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT)) 
screen_rect = screen.get_rect() 

background_rect = screen_rect 
background = pygame.Surface(background_rect.size) 
background.fill(WHITE) 
background = background.convert() 

player_rect = pygame.Rect(400, 400, BLOCK_WIDTH, BLOCK_HEIGHT) 
player = pygame.Surface(player_rect.size) 
player.fill(BLACK) 

clock = pygame.time.Clock() 

run() 

pygame.quit()