我环顾四周,但未能找到这个问题的简明答案。对于我的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;
}
(是的,我知道存储位置是多余的,因为花栗鼠本身就是这样做的。)
此外,对于那些完成阅读帖子的人来说,这是一个额外的问题。你怎么能以一个恒定的速度朝着它面向的方向移动一个身体,只允许它在任何给定的时间左转或右转,但从不减速?
答案 0 :(得分:1)
物理体的形状是什么?也许你只是忘了考虑使形状与精灵相同。如果你只考虑位置,那么精灵将能够在任何边界的屏幕外移动一半,因为它的位置在精灵的中心。
以恒定速度移动一个物体,在禁用摩擦时设定其速度(设定为0?)并允许其以碰撞速度从碰撞中反弹(在Box2D中将恢复原状= 1,不知道金花鼠)。
答案 1 :(得分:1)
您是否尝试过调试绘制碰撞形状? Cocos2D 2.1里面有我的CCPhysicsDebugNode类,它很容易添加。如果你的几何图形与你的图形对齐,那将告诉你。你的边界有多厚?您是否可能将精灵添加到可能会抵消它们的父节点?
Chipmunk不要求你为任何真实单位调整它。你可以使用像素或其他任何东西。
最后,@ LearnCocos2D对恒定速度有正确的认识。将摩擦设置为0,将弹性设置为1.0。您可能还想检查每帧的速度并将其加速回到每帧的正常速度。与非静态几何体碰撞会导致速度下降。