Python pymunk中的自上而下摩擦

Python pymunk中的自上而下摩擦,python,chipmunk,pymunk,Python,Chipmunk,Pymunk,已经为此挣扎了几天,在网上很难找到代码示例 我正在做一个自上而下的游戏,很难让玩家在按键时移动。此时,我正在使用add_force或add_pulse向某个方向移动玩家,但玩家不会停止。 我读过关于使用空间和玩家之间的表面摩擦来模拟摩擦的内容,下面是演示中的操作方法 然而,我对API理解不够,无法将这段代码从chipmunk移植到pymunk cpConstraint *pivot = cpSpaceAddConstraint(space, cpPivotJointNew2(tankContro

已经为此挣扎了几天,在网上很难找到代码示例

我正在做一个自上而下的游戏,很难让玩家在按键时移动。此时,我正在使用
add_force
add_pulse
向某个方向移动玩家,但玩家不会停止。 我读过关于使用空间和玩家之间的表面摩擦来模拟摩擦的内容,下面是演示中的操作方法

然而,我对API理解不够,无法将这段代码从chipmunk移植到pymunk

cpConstraint *pivot = cpSpaceAddConstraint(space, cpPivotJointNew2(tankControlBody, tankBody, cpvzero, cpvzero));
到目前为止,我有一些东西看起来像这样:

class Player(PhysicalObject):
    BASE_SPEED = 5
    VISIBLE_RANGE = 400
    def __init__(self, image, position, world, movementType=None):
        PhysicalObject.__init__(self, image, position, world)
        self.mass = 100
        self.CreateBody()
        self.controlBody = pymunk.Body(pymunk.inf, pymunk.inf)
        self.joint = pymunk.PivotJoint(self.body, self.controlBody, (0,0))
        self.joint.max_force = 100
        self.joint.bias_coef = 0
        world.space.add(self.joint)
我不知道如何将空间/玩家的约束添加到空间中


(需要有1500+代表的人来为这个问题创建pymunk标签)。

我对你提到的两种系统都不熟悉,但可能与之相关的一些基本游戏理念是:

  • 如果添加了影响运动的力(或冲量),要使实体停止,还必须将其移除。在我的游戏中,如果我有一个函数AddImpulse()/AddForce(),我会有一个相应的函数,比如Apply_摩擦力(),它会将效果反转多少(基于地形?),直到移动速度为零或更小。我个人不会为这种移动方法费心,除非游戏需要,因为它可以增加更多的计算,值得每次更新

  • 应该有一些方法来跟踪按键和/或按键位置,然后使用这些x/y坐标根据玩家速度递增。如果不知道您已经尝试了什么,或者API为您提供了多少帮助,那么很难说得更多


希望这有帮助。如果这是你已经知道的东西,请忽略它。

我对你提到的两种系统都不熟悉,但一些可能相关的基本游戏理念是:

  • 如果添加了影响运动的力(或冲量),要使实体停止,还必须将其移除。在我的游戏中,如果我有一个函数AddImpulse()/AddForce(),我会有一个相应的函数,比如Apply_摩擦力(),它会将效果反转多少(基于地形?),直到移动速度为零或更小。我个人不会为这种移动方法费心,除非游戏需要,因为它可以增加更多的计算,值得每次更新

  • 应该有一些方法来跟踪按键和/或按键位置,然后使用这些x/y坐标根据玩家速度递增。如果不知道您已经尝试了什么,或者API为您提供了多少帮助,那么很难说得更多


希望这有帮助。如果这是你已经知道的东西,请忽略它。

乔在花栗鼠/侏儒论坛上交叉张贴了这个问题,它在那里得到了更多的答案

我在下面的论坛上粘贴/编辑了我的部分答案:

#As pymunk is python and not C, the constructor to PivotJoint is defined as
def __init__(self, a, b, *args):
    pass

#and the straight conversion from c to python is
pivot1 = PivotJoint(tankControlBody, tankBody, Vec2d.zero(), Vec2d.zero())
# but ofc it works equally well with 0 tuples instead of the zero() methods:
pivot2 = PivotJoint(tankControlBody, tankBody, (0,0), (0,0))

mySpace.add(pivot1, pivot2)
根据是否向args发送一个或两个参数,它将使用C接口中的cpPivotJointNew或cpPivotJointNew2方法来创建关节。这两种方法之间的区别在于,cpPivotJointNew需要一个轴心点作为参数,而cpPivotJointNew2需要两个锚定点。因此,如果您发送一个Vec2d,pymunk将使用cpPivotJointNew,但是如果您发送两个Vec2d,它将使用cpPivotJointNew


完整的PivotJoint构造器文档在这里:

乔在花栗鼠/pymunk论坛上交叉发布了这个问题,并在那里得到了更多的答案

我在下面的论坛上粘贴/编辑了我的部分答案:

#As pymunk is python and not C, the constructor to PivotJoint is defined as
def __init__(self, a, b, *args):
    pass

#and the straight conversion from c to python is
pivot1 = PivotJoint(tankControlBody, tankBody, Vec2d.zero(), Vec2d.zero())
# but ofc it works equally well with 0 tuples instead of the zero() methods:
pivot2 = PivotJoint(tankControlBody, tankBody, (0,0), (0,0))

mySpace.add(pivot1, pivot2)
根据是否向args发送一个或两个参数,它将使用C接口中的cpPivotJointNew或cpPivotJointNew2方法来创建关节。这两种方法之间的区别在于,cpPivotJointNew需要一个轴心点作为参数,而cpPivotJointNew2需要两个锚定点。因此,如果您发送一个Vec2d,pymunk将使用cpPivotJointNew,但是如果您发送两个Vec2d,它将使用cpPivotJointNew

完整的PivotJoint构造函数文档在这里:

谢谢Hugh!:)要添加标签,现在我只需要一个答案!;)谢谢你,休!:)要添加标签,现在我只需要一个答案!;)