苦苦挣扎了两天,很难在网上找到代码示例。

我正在制作一个自上而下的游戏,无法让玩家继续按动按键。目前,我正在使用add_forceadd_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

Ive在以下论坛的部分答案中进行了粘贴/编辑:

#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 constructor docs

关于python - 在pymunk中自上而下的摩擦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5215518/

10-12 19:37