0

Cocos2d-xは、Cocos2d-for-iPhoneのC++ポートです。クロスプラットフォームの利点があります。私はCocos2d-xを使用してAndroidとiPhone用のゲームを開発しています。

現在、AndroidNDKとXcodeの両方を使用してCocos2d-Xコードのセットをコンパイルしています。

Xcodeでは、ゲームはiPhoneでコンパイルされ、正常に実行されます。

Android NDKでは、コンパイルが失敗します。(私は公式のAndroid r7c NDKを使用しています)。

助けてください。

ここに画像の説明を入力してください

編集済み:完全な実装ファイルに興味のある方のために。ここにあります。

#include "GameOverScene.h"
#include "HelloWorldScene.h"

using namespace cocos2d;

bool GameOverScene::init() {
    if (CCScene::init()) {
        this->_layer = GameOverLayer::node();
        this->_layer->retain();
        this->addChild(_layer);

        return true;
    } else {
        return false;
    }
}

GameOverScene::~GameOverScene () {
    if (_layer) {
        _layer->release();
        _layer = NULL;
    }
}

bool GameOverLayer::init () {
    if (CCLayerColor::initWithColor(ccc4f(255, 255, 255, 255))) {
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        this->_label = CCLabelTTF::labelWithString("", "Artial", 32);
        _label->retain();
        _label->setColor(ccc3(0, 0, 0));
        _label->setPosition(ccp(winSize.width/2, winSize.height/2));
        this->addChild(_label);

        this->runAction(CCSequence::actions(CCDelayTime::actionWithDuration(3), CCCallFunc::actionWithTarget(this, callfunc_selector(GameOverLayer::gameOverDone)), NULL));

        return true;
    } else {
        return false;
    }
}

void GameOverLayer::gameOverDone() {
    CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
}

GameOverLayer::~GameOverLayer() {
    if (_label) {
        _label->release();
        _label = NULL;
    }
}

そして完全なヘッダーファイル

#ifndef S6_GameOverScene_h
#define S6_GameOverScene_h

#include "cocos2d.h"

class GameOverLayer : public cocos2d::CCLayerColor {

public:
    GameOverLayer():_label(NULL) {};
    virtual ~GameOverLayer();
    bool init();
    LAYER_NODE_FUNC(GameOverLayer);

    void gameOverDone();

    CC_SYNTHESIZE_READONLY(cocos2d::CCLabelTTF*, _label, Label);

};

class GameOverScene : public cocos2d::CCScene {

public:
    GameOverScene():_layer(NULL) {};
    ~GameOverScene();
    bool init();

    //SCENE_NODE_FUNC(GameOverScene);

    static GameOverScene* node()
    {
        GameOverScene *pRet = new GameOverScene();

        //Error: undefined reference to `GameOverScene::init()'
        if (pRet && pRet->init())
        {
            pRet->autorelease();
            return pRet;
        }
        else
        {
            //Error: undefined reference to `vtable for GameOverScene'
            delete pRet;

            pRet = NULL;
            return NULL;
        }
    }; 

    CC_SYNTHESIZE_READONLY(GameOverLayer*, _layer, Layer);
};


#endif
4

3 に答える 3

1

/Users/my_account_name/Desktop/Projects/S6/S6/android/jni/../../Classes/GameOver‌Scene.h:40:GameOverScene :: init()への未定義の参照 '

GameOverSceneのオブジェクトファイルにリンクする必要があります。

于 2012-04-23T15:42:01.800 に答える
1

Android.mkファイルに問題がある可能性があります。コンパイルのためにGameOverScene.hファイルを追加する必要があります。

于 2012-04-24T09:29:31.827 に答える
1

ClassedフォルダーにあるAndroid.mkにGameOverScene.cppを追加するのを忘れる可能性があります。

于 2012-05-03T05:44:28.767 に答える