新人碰见的一个奇怪的问题……

最近刚刚开学习cocos2d-x,版本3.2。碰到下面这么个问题完全没有头绪……
我按着教程说的,在刚建好的project的helloworld头文件里添加了
private:
PhysicsWorld* m_world;
public:
void setPhyWorld(PhysicsWorld* world){ m_world = world; }

然后我想在cpp里获取当前的重力

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

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

问题就出在这个m_world->getGravity();
程序一运行到这里就显示
0x00F93B44处有未经处理的异常:0xC0000005:读取位置0xCDCDCDD1时发生访问冲突。
各种查资料也没碰见有人有类似的问题,真是快崩溃了……

m_world 你这个没定义把,里面应该是空的

我在这里用layer->setPhyWorld(scene->getPhysicsWorld());定义了呀

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

这个setPhyWorld的方法写在头文件里了,就是下面这个
private:
PhysicsWorld* m_world;
public:
void setPhyWorld(PhysicsWorld* world){ m_world = world; }

从你给出的代码来看,并没看到你用setPhyWorld函数给m_world赋值,m_world是个未知的值

你的createScene在哪调用了?是不是没有调用到createScene:14:

layer->setPhyWorld(scene->getPhysicsWorld());

在createScene里的这一句不是调用的setPhyWorld函数吗?然后赋了scene->getPhysicsWorld的值给m_world呀

……咦?这个还需要手动调用吗?我一直以为这是个程序入口,程序运行会自动运行里面的代码

应该是你上面哪里 layer->setPhyWorld(scene->getPhysicsWorld());这句之前 你先 auto layer = HelloWorld::create(); 然后进入INIT 然后调用Vect g=m_world->getGravity(); 这时还没调用你setPhyWorld这个函数的 所以是空的

啊,原来是这样!真是太感谢你了,这问题总算解决了,纠结了我好半天

以后这种问题可以打断点一步一步看 一般情况下 崩就是空值什么的 我也是新手 大家一起学习