【问题标题】:pygame "move_ip" method seems not workingpygame“move_ip”方法似乎不起作用
【发布时间】:2022-01-01 16:28:45
【问题描述】:

我正在使用 pygame 编写一个简单的脚本,它只是移动一个矩形,但 move_ip 方法似乎没有做任何事情(我遵循了在 RealPython tutorial 上找到的代码)。 综上,我得到了一个Player的类,如下:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.surf = pygame.Surface((75, 25))
        self.surf.fill((255, 255, 255))
        self.rect = self.surf.get_rect()

    def update(self, pressed_k):
        if pressed_k[K_UP]:
            self.rect.move_ip(0, -5)
        if pressed_k[K_DOWN]:
            self.rect.move_ip(0, 5)
        if pressed_k[K_LEFT]:
            self.rect.move_ip(-5, 0)
        if pressed_k[K_RIGHT]:
            self.rect.move_ip(5, 0)

然后我得到了前面描述的类的一个实例player,在循环中使用,如下:

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

    pressed_keys = pygame.key.get_pressed() 
    player.update(pressed_keys)
    screen.fill((0, 0, 0))
    screen.blit(player.surf, (SCREEN_WIDTH/2, SCREEN_HEIGHT/2)) 
    pygame.display.flip()

当我运行代码时,它会正确创建窗口(显示一个白色矩形,代表播放器),并且程序似乎读取了键盘输入,但代表播放器的块没有进行任何移动。

(实例方法.update被正确调用,各种'if'语句也正常工作,但亲戚self.rect.move_ip不会对玩家的位置做任何改变)

【问题讨论】:

  • 你不要在任何地方使用player.rect,尝试将它传递给screen.blit的调用
  • ...screen.blit(player.surf, player.rect)
  • 知道了,现在可以了。谢谢!

标签: python python-3.x pygame


【解决方案1】:

玩家不断被(SCREEN_WIDTH/2, SCREEN_HEIGHT/2)吸引

screen.blit(player.surf, (SCREEN_WIDTH/2, SCREEN_HEIGHT/2)) 

您必须将播放器拖动到存储在rect 属性中的位置。 pygame.Surface.blit) 的第二个参数可以是一个矩形。在这种情况下,矩形的左上角将用作 blit 的位置:

screen.blit(player.surf, player.rect)

但是,如果您使用的是pygame.sprite.Sprite,那么您也应该使用pygame.sprite.Group.e.g.:

player_group = pygame.sprite.Group(player)

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

    pressed_keys = pygame.key.get_pressed() 
    player_group.update(pressed_keys)

    screen.fill((0, 0, 0))
    player_group.draw(screen)
    pygame.display.flip()

【讨论】:

猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2021-11-27
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多