Arg, I feel really dumb asking this, but how do I add a cocos2d-x header and implimentation file to Eclipse?

I’m starting at ground zero with Android after years of programming with iOS and cocos2d-iphone. I am having a hard time adjusting to Eclipse to far since it really seems to be light-years a part from xcode.

I finally got my Hello World project working with cocos2d-x, but now I want to add another scene and call it out in the Appdelegate. How do I go about doing this? In Xcode, I would just add the template file, but in Eclipse I get the sense that I am missing something. What I’ve done so far is right click on Classes and make a new source C*+ file and a new C*+ header file (is that right?). Then I copied the HelloworldScene.cpp and HelloWorldScense.h files into my MainMenuScene.cpp and MainMenuScene.h files…

MainMenuScene.h

#ifndef MAINMENUSCENE_H_
#define MAINMENUSCENE_H_
#include "cocos2d.h"

class MainMenu : public cocos2d::CCLayer
{
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();

    // there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();

    // a selector callback
    void menuCloseCallback(CCObject* pSender);

    // implement the "static node()" method manually
    CREATE_FUNC(MainMenu);
};

#endif // MAINMENUSCENE_H_

MainMenuScene.cpp

#include "MainMenuScene.h"
#include "SimpleAudioEngine.h"

using namespace cocos2d;
using namespace CocosDenshion;

CCScene* MainMenu::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();

    // 'layer' is an autorelease object
    MainMenu *layer = MainMenu::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool MainMenu::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(MainMenu::menuCloseCallback) );
    pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );

    // create menu, it's an autorelease object
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition( CCPointZero );
    this->addChild(pMenu, 1);

    /////////////////////////////
    // 3. add your codes below...

    // add a label shows "Hello World"
    // create and initialize a label
    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Thonburi", 34);

    // ask director the window size
    CCSize size = CCDirector::sharedDirector()->getWinSize();

    // position the label on the center of the screen
    pLabel->setPosition( ccp(size.width / 2, size.height - 20) );

    // add the label as a child to this layer
    this->addChild(pLabel, 1);

    // add "HelloWorld" splash screen"
    CCSprite* pSprite = CCSprite::create("Domino-Table.png");

    // position the sprite on the center of the screen
    pSprite->setPosition( ccp(size.width/2, size.height/2) );

    // add the sprite as a child to this layer
    this->addChild(pSprite, 0);

    return true;
}

void MainMenu::menuCloseCallback(CCObject* pSender)
{
    CCDirector::sharedDirector()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

When I change

CCScene *pScene = HelloWorld::scene();
to
CCScene *pScene = MainMenu::scene();

in my appdelegate.cpp file, I get a fatal error saying that MainMenu is an undefined reference. What have I done wrong?

you must add your new file to Makefile :slight_smile:

First off, thanks for fixing my formatting! Don’t know how I missed the

 and 

.

Second. Does this explain why I can’t go in to an existing cpp file and change the class name? I tried a little experience where I just added a 1 to the end of HelloWorld and found that I got the same error.

Yep, check out jni/Android.mk and add your new .cpp file to the LOCAL_SRC_FILES section. Your C*+ and Java stuff is built in different ways: Eclipse handles all the Java stuff, but you gotta work with makefiles when compiling your C*+ stuff.

…and you’re right, Eclipse is light years behind XCode. :frowning:

Ben

This is something that has tripped a lot of us up at some point (and you’ll probably do it again at some point as well).
There are some posts about automating this so that all cpp/h files are included in every build.

I found both xCode and Eclipse hard to use and do most of my work in VS2012.
I find the debugging and document management better in VS.
I’m hoping the Android Studio will be better than all 3 when it supports NDK.