为什么我无法在Cocos2d-x 3.2中获得重力值

时间:2014-10-06 22:20:08

标签: c++ cocos2d-x cocos2d-x-3.0

我是cocos2d-x的新手。我试图用cocos2d-x 3.2来构建一个简单的物理游戏,但我遇到了一个问题。 最初,我按照教程并在HelloWorld.h中添加了这些:

private:
    PhysicsWorld* m_world;
public:
    void setPhyWorld(PhysicsWorld* world){ m_world = world; }

然后,我在HelloWorld.cpp中添加了这些:

Scene* HelloWorld::createScene()
{
    auto scene = Scene::createWithPhysics();
    auto layer = HelloWorld::create();
    layer->setPhyWorld(scene->getPhysicsWorld());
    scene->addChild(layer);
    return scene;
}

然后,我尝试在函数init()中获取重力值,如下所示:

bool HelloWorld::init()
{
    Vect g=m_world->getGravity();
    if ( !Layer::init() )
    {
        return false;
    }
    Size visibleSize = Director::getInstance()->getVisibleSize();
    return true;
}

然后,我跑了,但程序停在“Vect g = m_world-> getGravity();” 它说“0x00C53B44有一个未处理的异常”,我不得不打断它。 以前有人有同样的问题吗?如果有人能帮助我,我真的很感激。

1 个答案:

答案 0 :(得分:1)

请遵守您的代码

auto layer = HelloWorld::create(); //Calling init Method of Hello World Layer

layer->setPhyWorld(scene->getPhysicsWorld()); // Setting PhysicsWorld instance to the layer

首先调用init()方法,然后设置setPhyWorld(scene-> getPhysicsWorld()),使m_world = null。

如果你真的想在init()方法中使用physicsWorld实例,你应该自定义create& HelloWorld层的init方法,并使用create()方法发送physicsWorld实例。

//This code above header class of HelloWorld
#define CUSTOM_CREATE_FUNC(__TYPE__) \
static __TYPE__* create(PhysicsWorld* world) \
{ \
    __TYPE__ *pRet = new __TYPE__(); \
    if (pRet && pRet->init(world)) \
    { \
       pRet->autorelease(); \
       return pRet; \
     } \
     else \
     { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
      } \
}

然后

CUSTOM_CREATE_FUNC(HelloWorld); // in the header class, instead of CREATE_FUNC(HelloWorld)
virtual bool init(PhysicsWorld* world);

auto layer = HelloWorld::create(scene->getPhysicsWorld()); // in the createScene() Method 

最后

bool HelloWorld::init(PhysicsWorld* world)
{
   m_world = world;
   Vect g=m_world->getGravity();
   if ( !Layer::init() )
   {
      return false;
   }
   Size visibleSize = Director::getInstance()->getVisibleSize();
   return true;
}