【问题标题】:How to access cocos2d-x sprites in current scene from JNI?如何从 JNI 访问当前场景中的 cocos2d-x 精灵?
【发布时间】:2015-03-02 12:16:08
【问题描述】:

我想从 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 正确访问当前场景的子节点?

【问题讨论】:

    标签: android android-ndk cocos2d-x


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多