我看了很多,也没能找到这个问题的简明答案。在我的Cocos2D游戏中,我集成了花鼠物理引擎。在初始化时,我通过建立一系列主体和静态形状来设置“游戏场”的边界,如下所示:
- (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)。怎么回事?
我最初以为问题出在我渲染player sprite的地方,但是通过调试器运行之后,一切看起来都很好。当使用花栗鼠的位置来渲染精灵时,有什么特殊的协议要遵循吗?我需要把所有的东西都乘以某种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;
}(是的,我知道存储位置是多余的,因为花栗鼠天生就是这么做的。)
另外,对于那些读完这篇文章的人,还有一个额外的问题。你如何才能使物体在任何方向上以恒定的速度移动,只允许它在任何给定的时间向左或向右转动,而永远不会减速?
发布于 2013-04-05 16:09:40
物理物体的形状是什么?也许您只是忘记了将形状设置为与精灵相同的大小。如果只考虑位置,那么精灵将能够在任何边界移动到屏幕之外的一半,因为它的位置在精灵的中心。
要以恒定速度移动物体,请在禁用摩擦力的同时设置其速度(设置为0?)并允许它以其撞击速度从碰撞中反弹(在Box2D中,这将是恢复= 1,不知道花鼠)。
发布于 2013-04-05 21:49:21
你有没有试过调试绘制碰撞形状?Cocos2D 2.1中有我的CCPhysicsDebugNode类,这使得添加它变得非常容易。这将让您知道您的几何体是否与您的图形对齐。你的边界形状有多厚?您是否有可能将精灵添加到可能会偏移它们的父节点?
花栗鼠不需要你为任何真实的单位调整它。你可以只使用像素或者其他任何东西。
最后,@LearnCocos2D有关于恒定速度的正确想法。将friction设置为0,将elasticity设置为1.0。你可能还想在每一帧中检查它的速度,并在每一帧中将它加速回到正常的速度。与非静态几何体的碰撞将导致其减速。
https://stackoverflow.com/questions/15825970
复制相似问题