1

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

我正在制作一个自上而下的游戏,并且无法让玩家在按键上移动。目前我正在使用add_forceadd_impulse向一个方向移动播放器,但播放器并没有停止。我已经阅读了有关使用空间和玩家之间的表面摩擦来模拟摩擦的信息,这就是它在tank.c演示中的实现方式。

但是,我对 API 的理解还不够,无法将此代码从花栗鼠移植到 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 标签)。

4

2 回答 2

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

于 2011-03-09T07:55:57.347 回答
0

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

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

  • 应该有一些方法来跟踪 KeyPressed 和/或 KeyPosition,然后使用这些 x/y 坐标根据玩家速度递增。在不知道您尝试过什么或 API 为您做了多少的情况下,很难说更多。

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

于 2011-03-07T19:08:20.167 回答