2017-05-23 78 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的按鍵是否工作,並在不移動矩形的情況下打印。

回答

1

高興地看到,您正在使用pygame:d

在Python,寫「好」的代碼,這意味着代碼應遵循所有的語法規則,要進行適當的縮進,而最重要的是它是重要的,清晰可讀。

這裏有用於固定你的代碼的一些準則(以下PEP 8準則):

  1. 由4個空格或製表符

  2. 註釋字符("#")應始終遵循總是縮進代碼由一個空格組成,即:"# <= there's a space there"

  3. 不應該有太多空的連續的新行

  4. 留下空間列表/元組/集的逗號後,即(10, 10, 10)


這裏有一些pygame引導線:

  1. 你不應該使用pygame.key.get_pressed()明確地檢查按鍵在每個循環

  2. 檢查按鍵在for event in pygame.event.get()

  3. 設置使用clock.tick幀速率,最小幀速率應爲30,這將讓該程序以恆定速度

  4. 始終使用一種顏色填充你的屏幕,即使是黑色,screen.fill((0, 0, 0))

  5. 每次循環後重新填充屏幕。 screen.fill((0, 0, 0))


這裏是你一直在等待什麼,如何解決你的問題;實際上它非常簡單。 screen.blit(player.surf, (200, 550))你正在blitting它的位置設置(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)'替換元組,''中心'參數可以替換爲'topleft','topright','top','bottom' ...你可以在這裏找到它們:https ://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無關...... – sloth