我环顾四周,无法找到这个问题的简明答案。对于我的 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;
}
(是的,我知道存储位置是多余的,因为花栗鼠天生就是这样做的。)
此外,对于那些完成阅读帖子的人来说,奖金问题。你怎么能以恒定的速度在它所面对的任何方向上移动一个物体,只允许它在任何给定时间向左或向右转,但从不减速?