Я новичок в Cocos2dx v3.x Я занимаюсь разработкой базовой игры для автомобильных гонок, в которой автомобиль может двигаться по непрерывной полосе прокрутки, которая прямолинейна и имеет небольшой изгиб, как игра «Road Fighter» в магазине Google Play. Для перемещения автомобиля я с помощью устройства акселерометр и регулирует скорость кузова автомобиля в соотв. к телу пути, я использую EdgeChain Shape из 5 точек, которые я показал ниже, так что он делает ограниченную область для движения автомобиля, и автомобиль не должен выходить за пределы этого. Но с функцией setVelocity мой автомобиль выходит наружу Граница. Я также установил CollisionBitmask и ContactTestBitmask, столкновение обнаруживается, даже тогда физическое тело автомобиля пересекает тело цепи с краевой цепью.
auto *sprite = Sprite::create("Road.jpg");
sprite->setPosition(Vec2(winSize.width/2,winSize.height/2));
sprite->setScaleX(rX);
sprite->setScaleY(rY);
this->addChild(sprite, 0);
auto edge_body=PhysicsBody::createEdgeChain(vec ,5 ,PHYSICSBODY_MATERIAL_DEFAULT,3);
edge_body->setDynamic(false);
edge_body->addShape(PhysicsShapeEdgeChain::create(vec3, 5));
sprite->setPhysicsBody(edge_body);
edge_body->setCollisionBitmask(1);
edge_body->setContactTestBitmask(true);
//where vec and vec3 are vectors of 5 points acc to track boundary.auto *mycar=Sprite::create(car_png_name);
mycar->setPosition(Point(winSize.width/2,winSize.height*0.35));
addChild(mycar,2);
mycar_body=PhysicsBody::createBox(mycar->getContentSize(),PhysicsMaterial(0,1,0));
mycar->setPhysicsBody(mycar_body);
mycar_body->setRotationEnable(false);
mycar_body->setCollisionBitmask(2);
mycar_body->setContactTestBitmask(true);// DEVICE ACCELEROMETER
Device::setAccelerometerEnabled(true);
auto listener= EventListenerAcceleration::create (CC_CALLBACK_2(HelloWorld::OnAcceleration,this));
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);auto contact_listener=EventListenerPhysicsContact::create();
contact_listener->onContactBegin=CC_CALLBACK_1(HelloWorld::onContactBegin, this);
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contact_listener, this);void HelloWorld::OnAcceleration(cocos2d::Acceleration *acc, cocos2d::Event *event)
{
#define KFILTERINGFACTOR 0.7
#define KRESTACCELX 0
#define KsquirrelMAXPOINTSPERSEC (winSize.width*0.5)
#define KMAXDIFFX 0.15
double rollingX=0;
acc->y = acc->x;
rollingX = (acc->y * KFILTERINGFACTOR) + (rollingX * (1.0 - KFILTERINGFACTOR));
float accelX = acc->y - rollingX;
float accelDiff = accelX - KRESTACCELX;
float accelFraction = accelDiff / KMAXDIFFX;
carspeed = KsquirrelMAXPOINTSPERSEC * accelFraction*1.5;
if(mycar_body!=NULL)
mycar_body->setVelocity(Vec2(carspeed*1.5,0));
}
Я столкнулся с этой проблемой в Cocos2dxv3.4. Та же логика отлично работает в Cocos2dxv2.2.6 с box2d b2body. Я не понимаю, где я не прав, или как иначе, я могу переместить свой автомобиль с акселерометром в пределах границы прокрутки. Может Кто-нибудь посоветует?
Заранее спасибо.
Задача ещё не решена.