我(试图)使用cocos2d-x v3开发一个简单的游戏(参见here)。
目标是将彩虹播放器从底部绿色区域移动到顶部绿色区域。 操纵杆是左侧的白色拇指:可以用手指移动操纵杆来改变玩家的方向。
到目前为止,我正在使用cocos2d-x v3中的内置碰撞检测器(通过类PhysicalBody
)。图中的红色边框表示玩家的形状是它可以自由移动的竞技场的边界。
当用户移动操纵杆的拇指时,其方向用于设置玩家的速度。然而,在物理世界中,设定速度并不是最佳选择,因为它打破了物理定律,即只有力可以施加到身体上。因此,从所需的速度,我计算应用它的冲动:
Vec2 currentVel = _player->getPhysicsBody()->getVelocity();
Vec2 desiredVel = 80*_joystick->getDirection(); // a normalized Vec2
Vec2 deltaVel = desiredVel - currentVel;
Vec2 impulse = _player->getPhysicsBody()->getMass() * deltaVel;
_player->getPhysicsBody()->applyImpulse(impulse);
问题是玩家可以越过边缘显示here。
当玩家与竞技场的边缘接触并且施加冲动时会发生这种情况。
我将玩家的身体设置为:
auto playerBody = PhysicsBody::createBox(_player->getContentSize(), PhysicsMaterial(100.0f, 0.0f, 0.0f));
playerBody->setDynamic(true);
playerBody->setRotationEnable(false);
playerBody->setGravityEnable(false);
_player->setPhysicsBody(playerBody);
其中PhysicsMaterial
的三个参数是密度,恢复和摩擦。同样,地图的正文是:
auto mapBody = PhysicsBody::createEdgeChain(polygonPoints.data(), polygonPoints.size(), PhysicsMaterial(100.0f, 0.0f, 0.0f));
mapBody->setDynamic(false);
mapBody->setGravityEnable(false);
_tileMap->setPhysicsBody(mapBody);
其中polygonPoints
是定义形状的Vec2
的向量。播放器为Sprite
,地图为TMXTiledMap
。
我试图改变密度,摩擦力和恢复原状的值而没有成功。
您是否遇到过同样的问题?
谢谢!
答案 0 :(得分:1)
您似乎正在使用物理的cocos2d-x实现。所以,我对此不太了解。 但通常,当更新物理世界更新速率周期较低时,通过设置或低帧速率会发生这种情况。 检查,UpdateRate你的世界。
来自Doc:
/** Set the speed of physics world, speed is the rate at which the simulation executes. default value is 1.0 */
inline void setSpeed(float speed) { if(speed >= 0.0f) { _speed = speed; } }
/** get the speed of physics world */
inline float getSpeed() { return _speed; }
/**
* set the update rate of physics world, update rate is the value of EngineUpdateTimes/PhysicsWorldUpdateTimes.
* set it higher can improve performance, set it lower can improve accuracy of physics world simulation.
* default value is 1.0
*/
inline void setUpdateRate(int rate) { if(rate > 0) { _updateRate = rate; } }
/** get the update rate */
inline int getUpdateRate() { return _updateRate; }