0

我环顾四周,无法找到这个问题的简明答案。对于我的 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;
}

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

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

4

2 回答 2

1

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

要以恒定速度移动物体,请在禁用摩擦(设置为 0?)的同时设置它的速度,并允许它以其冲击速度从碰撞中反弹(在 Box2D 中,restitution = 1,不知道 Chipmunk)。

于 2013-04-05T08:09:39.810 回答
1

您是否尝试过调试绘制碰撞形状?Cocos2D 2.1 中包含我的 CCPhysicsDebugNode 类,使其非常容易添加。这会让您知道您的几何图形是否与您的图形对齐。你的边界形状有多厚?您是否可能将精灵添加到可能抵消它们的父节点?

Chipmunk 不需要您针对任何真实单位对其进行调整。您可以只使用像素或其他任何东西。

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

于 2013-04-05T13:49:21.173 回答