2017-05-23 34 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