我(嘗試)使用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);
其中polygonPoints
是Vec2
的限定的形狀的矢量。玩家是Sprite
,地圖是TMXTiledMap
。
我試圖改變密度,摩擦和恢復原狀而沒有成功。
你有沒有經歷過同樣的問題?
謝謝!
謝謝,這個問題實際上涉及到物理世界進行比較球員的速度太慢更新。但是,UpdateRate不能小於1(它是一個int> 0),因此我必須增加兩次連續更新播放器速度(從1/60秒到0.1秒)的時間間隔。這會導致播放器運動的不明顯延遲並解決問題。接得好! –