花栗鼠物理定位

时间:2013-04-05 04:34:28

标签: cocos2d-iphone chipmunk physics-engine

我环顾四周,但未能找到这个问题的简明答案。对于我的Cocos2D游戏,我已经集成了Chipmunk物理引擎。在初始化时,我通过建立一系列实体和静态形状来设置“游戏区域”的边界,如下所示:

- (void)initPlayingField {
    // Physics parameters
    CGSize fieldSize = _model.fieldSize;
    CGFloat radius = 2.0;
    CGFloat elasticity = 0.3;
    CGFloat friction = 1.0;

    // Bottom
    CGPoint lowerLeft = ccp(0, 0);
    CGPoint lowerRight = ccp(fieldSize.width, 0);
    [self addStaticBodyToSpace:lowerLeft finish:lowerRight radius:radius elasticity:elasticity friction:friction];

    // Left
    CGPoint topLeft = ccp(0, fieldSize.height);
    [self addStaticBodyToSpace:lowerLeft finish:topLeft radius:radius elasticity:elasticity friction:friction];

    // Right
    CGPoint topRight = ccp(fieldSize.width, fieldSize.height);
    [self addStaticBodyToSpace:lowerRight finish:topRight radius:radius elasticity:elasticity friction:friction];

    // Top
    [self addStaticBodyToSpace:topLeft finish:topRight radius:radius elasticity:elasticity friction:friction];
}

这个设置有效,除了一件事 - 边界的位置似乎被右边的大量像素关闭。在初始化播放器并将其发送到边界墙之后,它不会从屏幕边缘反弹(正如我所期望的那样,将边界框设置为0,0),而是一些像素数(可能是30- 50)从屏幕边缘向内。是什么赋予了?

我最初认为这个问题来自我渲染播放器精灵的地方,但在通过调试器运行后,一切看起来都不错。使用花栗鼠的位置渲染精灵时是否有特殊的协议?我是否需要通过某种PIXELS_PER_METER来增加所有内容?如果他们在精灵表中是否重要?精灵批处理节点?以下是我在视图中设置精灵位置的方法:

Player *player = [[RootModel sharedModel] player];
self.playerSprite.position = player.position;
self.playerSprite.rotation = player.rotation;

以下是我在模型中设置位置的方法:

- (void)update:(CGFloat)dt {
    self.position = self.body->p;
    self.rotation = self.body->a;
}

(是的,我知道存储位置是多余的,因为花栗鼠本身就是这样做的。)

此外,对于那些完成阅读帖子的人来说,这是一个额外的问题。你怎么能以一个恒定的速度朝着它面向的方向移动一个身体,只允许它在任何给定的时间左转或右转,但从不减速?

2 个答案:

答案 0 :(得分:1)

物理体的形状是什么?也许你只是忘了考虑使形状与精灵相同。如果你只考虑位置,那么精灵将能够在任何边界的屏幕外移动一半,因为它的位置在精灵的中心。

以恒定速度移动一个物体,在禁用摩擦时设定其速度(设定为0?)并允许其以碰撞速度从碰撞中反弹(在Box2D中将恢复原状= 1,不知道金花鼠)。

答案 1 :(得分:1)

您是否尝试过调试绘制碰撞形状? Cocos2D 2.1里面有我的CCPhysicsDebugNode类,它很容易添加。如果你的几何图形与你的图形对齐,那将告诉你。你的边界有多厚?您是否可能将精灵添加到可能会抵消它们的父节点?

Chipmunk不要求你为任何真实单位调整它。你可以使用像素或其他任何东西。

最后,@ LearnCocos2D对恒定速度有正确的认识。将摩擦设置为0,将弹性设置为1.0。您可能还想检查每帧的速度并将其加速回到每帧的正常速度。与非静态几何体碰撞会导致速度下降。