自上而下的花栗鼠摩擦

时间:2011-03-07 03:26:24

标签: python chipmunk pymunk

在这几天里一直在努力,很难在网上找到代码示例。

我正在制作一个自上而下的游戏并且无法让玩家按下按键。目前我正在使用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标签。)

2 个答案:

答案 0 :(得分:1)

Joe将问题转交给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 constructor docs

答案 1 :(得分:0)

我对你提到的任何一种系统都不熟悉,但可能涉及的一些基本游戏理念是:

  • 如果添加影响移动的力(或冲动),要使实体停止,您还必须将其取走。在我的游戏中,如果我有一个函数AddImpulse()/ AddForce(),我会有一个相应的一个,如Apply_Friction(),它会反转你想要的效果(基于地形?)直到movepeed为零或更少。除非玩游戏需要,否则我个人不会为这种移动方法而烦恼,因为它可以添加更多值得每次更新的计算。

  • 应该有某种方法来跟踪KeyPressed和/或KeyPosition,然后使用这些x / y坐标根据玩家的速度增加。不知道你尝试了什么或者API为你做了多少,很难真正说出来。

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