在这几天里一直在努力,很难在网上找到代码示例。
我正在制作一个自上而下的游戏并且无法让玩家按下按键。目前我正在使用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标签。)
答案 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为你做了多少,很难真正说出来。
希望这会有所帮助。如果这是你已经知道的东西,请忽略它。