在pymunk中自上而下摩擦

一直在苦苦挣扎这几天,很难在网上找到代码示例。 我正在制作一个自上而下的游戏,并且无法让玩家按下按键。目前我正在使用
add_force
add_impulse
向一个方向移动玩家,但玩家不会停止。 我已经阅读过使用空间和播放器之间的表面摩擦来模拟摩擦,这里是如何在tank.c演示中完成的。 但是,我不太了解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标签)。     
已邀请:
乔将这个问题交给了Chipmunk / pymunk论坛,并在那里得到了几个答案。 http://www.slembcke.net/forums/viewtopic.php?f=1&t=1450&start=0&st=0&sk=t&sd=a 我在下面的论坛中粘贴/编辑了部分答案:
#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它将使用cpPivotJointNew2。 完整的PivotJoint构造函数文档在这里:PivotJoint构造函数文档     
我对你提到的任何一种系统都不熟悉,但可能涉及的一些基本游戏想法是: 如果添加一个影响移动的力(或冲动),要使实体停止,您还必须将其取走。在我的游戏中,如果我有一个函数AddImpulse()/ AddForce(),我会有一个相应的一个,如Apply_Friction(),它会反转你想要的效果(基于地形?)直到movepeed为零或更少。我个人不打算使用这种移动方法,除非游戏需要,因为它可以添加更多的计算,值得每次更新。 应该有一些方法来跟踪KeyPressed和/或KeyPosition,然后使用这些x / y坐标根据玩家的速度增加。如果不知道你尝试了什么或API为你做了多少,那么很难真正说出更多。 希望这可以帮助。如果这是你已经知道的东西,请忽略它。     

要回复问题请先登录注册