Pymunk中的自上而下摩擦

1 投票
2 回答
1317 浏览
提问于 2025-04-16 13:08

我这几天一直在为这个问题苦恼,网上很难找到相关的代码示例。

我正在制作一个俯视视角的游戏,但在按下键时让角色移动遇到了麻烦。目前我使用的是 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

我对你提到的这两个系统不太熟悉,但有一些基本的游戏想法可能和它们有关:

  • 如果你给一个角色施加了一个力(或者冲击力),让它移动,那么要让这个角色停下来,你也得把这个力去掉。在我的游戏里,如果我有一个叫 AddImpulse()/AddForce() 的函数,那么我会有一个对应的函数,比如 Apply_Friction(),它可以根据你想要的程度(可能和地形有关)来抵消这个力,直到角色的移动速度变成零或者更低。我个人觉得,除非游戏玩法需要,不然我不会用这种方法来处理移动,因为每次更新都要计算这些,可能会增加不必要的负担。

  • 应该有办法来追踪按下的键和/或键的位置,然后根据玩家的速度来更新这些 x/y 坐标。由于我不知道你尝试过什么,或者这个 API 能为你做多少,所以很难再说更多。

希望这些对你有帮助。如果这些你已经知道了,就请忽略吧。

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)

根据你传入的参数数量,程序会选择使用cpPivotJointNew或者cpPivotJointNew2这两种方法来创建连接。它们的区别在于,cpPivotJointNew只需要一个支点作为参数,而cpPivotJointNew2则需要两个锚点。所以,如果你传入一个Vec2d,pymunk会使用cpPivotJointNew;但如果你传入两个Vec2d,它就会使用cpPivotJointNew2。

关于PivotJoint构造函数的详细文档可以在这里找到:PivotJoint构造函数文档

撰写回答