0
votes

I am new to cococs2dx and I am working on a code involving PhysicsJointFixed. I am using cocos2d-x-3.6. I am unable to compile the code as I wrote below following the guidelines and the PhysicsTest.cpp.

My GameLayer.h looks like:

class GameLayer : public cocos2d::Layer
{
    GameLayer();
    virtual ~GameLayer();

    virtual bool init();

    static Scene* createScene();
    void setPhyWorld(PhysicsWorld* world){m_world = world;}
    CREATE_FUNC(GameLayer);
private:
    PhysicsWorld* m_world;
    ShapeSprite* _square;  //ShapeSprite extends Sprite
    ShapeSprite* _square1;
    PhysicsJointFixed* joint;
    ...
}

The createScene method in GameLayer.cpp:

Scene* GameLayer::createScene()
{

    auto scene = Scene::createWithPhysics();

    auto layer = GameLayer::create();
    layer->setPhyWorld(scene->getPhysicsWorld());

    scene->addChild(layer);

    return scene;
}

Then inside GameLayer::init()

bool GameLayer::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
...
...

_square =  ShapeSprite::gameSpriteWithFile("square.png");
auto squareBody = PhysicsBody::createBox(Size(200,200));
_square->setPhysicsBody(squareBody);
_square->setPosition(Vec2(_screenSize.width * 0.5f, _screenSize.height     * 0.7f));

_square1 =  ShapeSprite::gameSpriteWithFile("square1.png");
auto squareBody1 = PhysicsBody::createBox(Size(100,100));
_square1->setPhysicsBody(squareBody1);
_square1->setPosition(Vec2(_screenSize.width * 0.5f, _screenSize.height * 0.7f));

this->addChild(_square);
this->addChild(_square1);

joint = PhysicsJointFixed::construct(_square->getPhysicsBody(), _square1->getPhysicsBody(),Vec2(100,100));

this->getScene()->getPhysicsWorld()->addJoint(joint);

return true;

}

The code gives EXC_BAD_ACCESS error on the line this->getScene()->getPhysicsWorld()->addJoint(joint); because, this->getScene()->getPhysicsWorld() returns NULL.

Please advise, how can I avoid the error. Any suggestion is appreciated. Thanks in advance.

1
for more suggestions you should read on these answers: stackoverflow.com/questions/28486310/…Joseph

1 Answers

0
votes

This error occurs because your custom layer is not yet added to scene during init(). One possible solution is to override onEnterTransitionDidFinish() and add the joint there. In GameLayer.h add this:

virtual void onEnterTransitionDidFinish();

And move the joint adding code to GameLayer.cpp like this:

void GameLayer::onEnterTransitionDidFinish() {
    joint = PhysicsJointFixed::construct(_square->getPhysicsBody(), _square1->getPhysicsBody(),Vec2(100,100));

    this->getScene()->getPhysicsWorld()->addJoint(joint);
}