Python 3.x Pygame精灵移动,无法更新

Python 3.x Pygame精灵移动,无法更新,python-3.x,pygame,sprite,Python 3.x,Pygame,Sprite,我将试着把我的问题重新解释为一个更简洁和具体的问题。下面是Hero类,它向终端发送了几个打印命令,我正试图使用这些命令来解决问题: 代码: 我试图实现的目标: 当鼠标单击游戏地图时,会调用Hero.movetarget,并将移动目标设置为距离当前矩形一个平铺。然后,当charactersprites组对组中的所有精灵调用更新方法(这里的术语正确吗?)时,它们应该向该目标平铺移动几个像素 当更新方法只是在一次跳跃中将所有精灵移动一个磁贴时,我让精灵这样做没有问题。我试图改变它,使精灵滑过几帧到他们

我将试着把我的问题重新解释为一个更简洁和具体的问题。下面是Hero类,它向终端发送了几个打印命令,我正试图使用这些命令来解决问题:

代码:

我试图实现的目标: 当鼠标单击游戏地图时,会调用Hero.movetarget,并将移动目标设置为距离当前矩形一个平铺。然后,当charactersprites组对组中的所有精灵调用更新方法(这里的术语正确吗?)时,它们应该向该目标平铺移动几个像素

当更新方法只是在一次跳跃中将所有精灵移动一个磁贴时,我让精灵这样做没有问题。我试图改变它,使精灵滑过几帧到他们的新目标瓷砖,而不是简单地跳到那里

在阅读上面的终端打印输出时,Hero.movetarget中设置的self.target变量与Hero.update开始时打印到终端的self.target变量不同

我不明白为什么在Hero.movetarget中更改self.target并不是在Hero.update中更改self.target

请原谅我对这个问题的任何无知,并提前感谢您提供的任何见解

load_image类取自Pygame黑猩猩教程: 代码:

调用Hero类的程序主体,编辑成我认为相关的部分: 代码:

提前感谢任何看了一眼并愿意伸出援手的人。我一直在阅读大量的教程,试图教育自己,但我一直无法找到哪里出了问题

任何改进我的代码的建议都是受欢迎的,尽管修复我的静止英雄是我的首要任务

编辑以制定更具体的问题。

互动程序id 我建议你对每个怪物/玩家的位置使用元组
(x,y)
。另存为平铺偏移量而不是像素

绘制时,将平铺id转换为像素。如果它不在屏幕上就可以了

def id_to_screen( tile_id width=32, height=32):
    """convert tile-coordinate to screen-coordinate (Pixels)"""
    x,y = tile_id
    x *= width
    y *= height
    return (x, y)         # unless you need: return pygame.Rect(x, y, width, height)    
您也需要反转,将鼠标位置转换为平铺ID

def screen_to_id( pos, width=32, height=32):
    # converts screen pixel coordinate to world map tile offsets.
    x = pos[0] / width
    y = pos[1] / height
    return (x, y)
直肠
rect.topleft
是精灵要闪烁到的位置的左上角。设置此选项可移动精灵。(现在您正在设置targetx,并从
self.rect
读取

    self.rect.topleft = (384,0)

    # or
    self.rect.move_ip(384,0)
删除
self.targetx
。除非您将其用作地图上的平铺id位置,而不是像素。(如果您绘制精灵,当它的矩形在屏幕外时,这很好。)

一些提示:

    self.targetx = self.rect.topleft[0]
    self.targety = self.rect.topleft[1]

    # becomes
    self.target = self.rect.topleft
    # or
    x,y = self.rect.topleft
    # or
    self.tilex, self.tiley = self.rect.topleft
rect虚拟属性非常有用。请参阅:。它们简化了逻辑/删除了一些数学

    r.bottomleft = (20,30)
    r.left = 500
numpy+示例项目 Numpy对于多维阵列(类似流氓的二维平铺贴图)非常有用。 示例将numpy数组用于贴图

运行
main.py
,按
s
切换滚动磁贴。

磁贴id 我建议您对每个怪物/玩家的位置使用元组
(x,y)
。保存为平铺偏移量而不是像素

当你画画的时候,把瓷砖id转换成像素。如果它在屏幕外就可以了

def id_to_screen( tile_id width=32, height=32):
    """convert tile-coordinate to screen-coordinate (Pixels)"""
    x,y = tile_id
    x *= width
    y *= height
    return (x, y)         # unless you need: return pygame.Rect(x, y, width, height)    
您也需要反转,将鼠标位置转换为平铺ID

def screen_to_id( pos, width=32, height=32):
    # converts screen pixel coordinate to world map tile offsets.
    x = pos[0] / width
    y = pos[1] / height
    return (x, y)
直肠
rect.topleft
是精灵被blit移动到的位置的左上角。设置此选项可移动精灵。(现在您正在设置targetx,并从
self.rect
读取。)

    self.rect.topleft = (384,0)

    # or
    self.rect.move_ip(384,0)
删除
self.targetx
。除非您将其用作地图上的平铺id位置,而不是像素。(如果您绘制精灵,当它的矩形在屏幕外时,这很好。)

一些提示:

    self.targetx = self.rect.topleft[0]
    self.targety = self.rect.topleft[1]

    # becomes
    self.target = self.rect.topleft
    # or
    x,y = self.rect.topleft
    # or
    self.tilex, self.tiley = self.rect.topleft
rect虚拟属性非常有用。请参阅:。它们简化了逻辑/删除了一些数学

    r.bottomleft = (20,30)
    r.left = 500
numpy+示例项目 Numpy对于多维阵列(类似流氓的二维平铺贴图)非常有用。 示例将numpy数组用于贴图


运行
main.py
,按
s
切换滚动互动程序。

我非常感谢这些提示。它们会很有帮助,但我仍然不理解问题的根源。我已将我的问题重新表述得更具体一些;如果您能添加任何其他见解,我将不胜感激。我非常感谢这些提示。它们将有所帮助ful,但我仍然不明白问题的根源。我已将我的问题重新表述为更具体的问题;如果您能添加任何其他见解,我将不胜感激。我解决了问题,尽管我仍然不确定它不起作用的确切原因。charactersprites.update和charactersprites.draw没有更新和绘制所有组成员,因此,我将精灵拆分为更小的组,它们进行了正确的更新和绘制。我解决了这个问题,尽管我仍然不确定它不起作用的确切原因。charactersprites.update和charactersprites.draw没有更新和绘制所有组成员,因此我将精灵拆分为更小的组,它们进行了正确的更新和绘制。