如何从JNI访问当前场景中的cocos2d-x sprite?

时间:2015-03-02 12:16:09

标签: android android-ndk cocos2d-x

我想从Android JNI访问cocos2d-x场景的子节点。

场景在 AppDelegate 中创建,如下所示:

Director::getInstance()->runWithScene(MainScene::create());
//scene node has several children

该场景包含几个应该在JNI中操作的子画面。在场景启动中,精灵添加如下:

Scene* MainScene::createScene() {
    auto scene = Scene::create();
    auto layer = MainScene::create();
    scene->addChild(layer);
    return scene;
}

bool MainScene::init() {
    ...
    this->addChild(sprite, 7);
    ...
}

但是当我想访问 JNI 中的精灵时,场景不包含任何子项。我试图通过标记名访问子项,并按如下方式计算子项。

//INITIALIZE COCOS2D
void cocos_android_app_init (JNIEnv* env, jobject thiz) {
    AppDelegate *pAppDelegate = new AppDelegate();
}

//ACCESS SPRITES IN SCENE
JNIEXPORT void JNICALL Java_com_example_appname_AppActivity_manipulateSprite
    ( JNIEnv* env, jobject thiz){
    //MANIPULATE SCENE IN GL THREAD:
    Director::getInstance()->getScheduler()->performFunctionInCocosThread([&](){
        //ACCESS CHILDREN BY TAG
        auto child = Director::getInstance()->getRunningScene()->getChildByTag(7);
        auto sprite = dynamic_cast<cocos2d::Sprite*>(child);
        //this sprite is NULL, but I set the sprite with 
        //tag "7" when the scene is created

        //COUNT THE CHILDREN
        int child_count = Director::getInstance()
            ->getRunningScene()->getChildrenCount(); 
        //why is the number of children zero?
    }
}

还请注意,当从JNI向场景附加新的子节点时,可以访问这些新创建的子节点,但不能访问初始化期间创建的子节点。

此外,我尝试在createScene方法中为场景图层指定一个标记名,但getRunningScene似乎没有子图标。

如何正确地从JNI访问当前场景的子节点?

1 个答案:

答案 0 :(得分:0)

尝试调用replaceScene并在第一次调用JNI方法时重新启动场景。