Crossed Edge Collision in Cocos2d-x v3 -
i'm (trying) develop simple game using cocos2d-x v3 (see here).
the aim move rainbow-ish player bottom greenish area top one. joystick white thumb on left: can moved finger alter player's direction.
so far, i'm using built-in collision detector in cocos2d-x v3 (through class physicalbody). reddish borders in figure represent shape of player borders of arena can freely move in.
when user moves joystick's thumb, direction used set player's velocity. however, beingness in physical world, setting velocity not best selection because breaks physical laws, i.e. forcefulness can applied body. therefore, desired speed, compute impulse applied accomplish it:
vec2 currentvel = _player->getphysicsbody()->getvelocity(); vec2 desiredvel = 80*_joystick->getdirection(); // normalized vec2 vec2 deltavel = desiredvel - currentvel; vec2 impulse = _player->getphysicsbody()->getmass() * deltavel; _player->getphysicsbody()->applyimpulse(impulse); the problem player can cross edges show here.
this happens when player in contact arena's border , impulse applied.
i set player's body as:
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); where 3 parameters of physicsmaterial density, restitution , friction. in same way, map's body is:
auto mapbody = physicsbody::createedgechain(polygonpoints.data(), polygonpoints.size(), physicsmaterial(100.0f, 0.0f, 0.0f)); mapbody->setdynamic(false); mapbody->setgravityenable(false); _tilemap->setphysicsbody(mapbody); where polygonpoints vector of vec2's defining shape. player sprite , map tmxtiledmap.
i tried alter values of density, friction , restitution without success.
have ever experienced same problem?
thanks!
it seems using cocos2d-x implementation physics. so, have less thought this. generally, happens when update physics world update rate cycle low, either setting or low frame rate. check, updaterate of world.
from doc:
/** set speed of physics world, speed rate @ simulation executes. default value 1.0 */ inline void setspeed(float speed) { if(speed >= 0.0f) { _speed = speed; } } /** speed of physics world */ inline float getspeed() { homecoming _speed; } /** * set update rate of physics world, update rate value of engineupdatetimes/physicsworldupdatetimes. * set higher can improve performance, set lower can improve accuracy of physics world simulation. * default value 1.0 */ inline void setupdaterate(int rate) { if(rate > 0) { _updaterate = rate; } } /** update rate */ inline int getupdaterate() { homecoming _updaterate; } cocos2d-x collision-detection game-physics cocos2d-x-3.0
No comments:
Post a Comment