【问题标题】:How do you move a sprite in pygame?你如何在pygame中移动精灵?
【发布时间】:2018-07-24 09:46:29
【问题描述】:

我知道这个问题已经以其他形式得到解答,但我似乎无法让它适用于我的游戏。我正在尝试让精灵移动并将他留在他移动到的地方。这是我的代码的一部分:

class player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)

    def draw(self, x, y):

        player = pygame.image.load("stand_down.png").convert_alpha()
        player = pygame.transform.scale(player, (100, 200))
        screen.blit(player, (x, y))
        pygame.display.update()
        for event in pygame.event.get():
            key = pygame.key.get_pressed()
            if event.type == KEYDOWN :
                if key [K_LEFT] :
                    player = pygame.image.load("standleft.png").convert_alpha()
                    player = pygame.transform.scale(player, (100, 200))
                    x -= 50
                    screen.blit(player, (x, y))
                    pygame.display.update()
                    pygame.sprite.Sprite.update(player)
                if key [K_RIGHT]:
                    player = pygame.image.load("standright.png").convert_alpha()
                    player = pygame.transform.scale(player, (100, 200))
                    x += 50
                    screen.blit(player, (x, y))
                    pygame.display.update()
                    pygame.sprite.Sprite.update(player)

    def update(self):
        pygame.sprite.Sprite.update(player)

然后这是我的主要功能的一部分:

player.draw(screen, x, y)
player.update(screen)

我已经尝试了所有我能想到的方法,但玩家只是在不同的点不断闪烁,然后又回到了之前的位置。如果您能提供帮助,将不胜感激!

【问题讨论】:

  • 如果你使用event.type == KEYDOWN,那么使用event.key == K_LEFT
  • 不要在每个地方都使用pygame.display.update() - 它会闪烁屏幕 - 只能循环使用一次。
  • 不要一次又一次地在draw() 中加载图像 - 它会减慢程序速度 - 在__init__ 中只加载一次
  • 不要在draw() 的三个地方blit(player) - 它会减慢程序 - 在draw() 的末尾只做一次
  • 使用for event in pygame.event.get(): 外部玩家 - 您可能需要将事件发送给第二个玩家或其他对象。内部播放器仅使用 if event.type == KEYDOWN : - 创建分离方法 handle_event(self, event) 是个好主意

标签: python animation pygame sprite


【解决方案1】:

我无法测试它,但我会这样做

# --- classes ---

class Player(pygame.sprite.Sprite): # UpperCaseName for class

    def __init__(self, x, y):
        super().__init__()

        temp_image = pygame.image.load("stand_down.png").convert_alpha()
        self.image_down = pygame.transform.scale(temp_image, (100, 200))

        temp_image = pygame.image.load("standleft.png").convert_alpha()
        self.image_left = pygame.transform.scale(temp_image, (100, 200))

        temp_image = pygame.image.load("standright.png").convert_alpha()
        self.image_right = pygame.transform.scale(temp_image, (100, 200))

        self.image = self.image_down

        # keep position and size in pygame.Rect()
        # to use it in collision checking
        self.rect = self.image.get_rect(x=x, y=y)

    def draw(self, screen):
        screen.blit(self.image, self.rect)

    def handle_event(self):#, event)
        self.image = self.image_down

        key = pygame.key.get_pressed()
        if key[K_LEFT]:
            self.rect.x -= 50
            self.image = self.image_left
        if key[K_RIGHT]:
            self.rect.x += 50
            self.image = self.image_right

    def update(self, enemy):
        # check collision with eneny
        if self.rect.colliderect(enemy.rect):
            print("I'm killed by enemy")

# --- main ---

player = Player(400, 400)
enemy = Enemy(100, 100)

while True:

    # - events -

    for event in pygame.event.get():
        #player.handle_event(event)

    player.handle_event()

    # - updates -

    enemy.update()
    player.update(enemy)

    # - draws -

    screen.fill( (0,0,0) )                  
    player.draw(screen)
    enemy.draw(screen)
    pygame.display.update()

【讨论】:

  • 非常感谢,但我一直收到同样的错误,“pygame.Surface”对象没有“image_down”的属性。我该如何解决?
  • 看来你在不同的地方有错误。也许你会在这个问题中使用player = player.imageplayer = player.resize() stackoverflow.com/q/47732591/1832058
  • 如果您仍有问题,则创建新问题(使用按钮Add Question)并输入代码和完整 Traceback。完整的 Traceback 中有许多有用的信息。 IE。它显示了哪一行代码有问题。
  • 顺便说一句:您可以随时使用print(variable)print(type(variable)) 来检查变量中存在的问题。然后当变量仍然给出正确的type(variable)
猜你喜欢
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多