1

我(嘗試)使用cocos2d-x v3開發一個簡單的遊戲(請參閱here)。Cocos2d-x v3中的交叉邊緣碰撞

目標是將彩虹球員從底部的綠色區域移到頂部的綠色區域。 操縱桿是左邊的白色拇指:它可以用手指移動來改變玩家的方向。

到目前爲止,我使用的是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); 

其中polygonPointsVec2的限定的形狀的矢量。玩家是Sprite,地圖是TMXTiledMap

我試圖改變密度,摩擦和恢復原狀而沒有成功。

你有沒有經歷過同樣的問題?

謝謝!

回答

1

看來你正在使用物理學的cocos2d-X實現。所以,我對此不太瞭解。 但通常情況下,更新物理世界更新速率週期較低時會發生這種情況,無論是通過設置還是較低的幀速率。 檢查您的世界的UpdateRate。

從文件:

/** 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; } 
+0

謝謝,這個問題實際上涉及到物理世界進行比較球員的速度太慢更新。但是,UpdateRate不能小於1(它是一個int> 0),因此我必須增加兩次連續更新播放器速度(從1/60秒到0.1秒)的時間間隔。這會導致播放器運動的不明顯延遲並解決問題。接得好! –