HelloWorld类分析
先看一下类图
HelloWorld类一共有四个成员函数。四个函数都比较不一般。
CREATE_FUNC是一个宏定义的成员函数,其在预处理阶段被替换。
下面一个一个来分析这些函数。这个设计得挺好的,就是注释写得不合我意,只怪当年没有努力学英语。
CREATE_FUNC 创建create
- 1: CREATE_FUNC(HelloWorld);
- 2: ////上面的宏替换后为以下内容
- 3: static helloworld* create()
- 5: helloworld *pret = new helloworld();
- 6: if (pret && pret->init())
- 8: pret->autorelease(); //自动释放对象
- 9: return pret;
- 10: }
- 11: else
- 12: { //delete并非无意义,在init失败的时候释放,短路操作pret!=NULL
- 13: delete pret;
- 14: pret = null;
- 15: return null;
- 16: }
- 17: }
Init初始化
1: // on "init" you need to initialize your instance
- 2: bool HelloWorld::init()
- 3: {
- 4: //////////////////////////////
- 5: // 1. super init first
- 6: //首先进行超类(被继承的类,就是基类。不建议用超类这个词,有歧义)的初始化
- 7: if ( !CCLayer::init() )
- 9: return false;
- 11:
- 12: CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
- 13: CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
- 14:
- 15: /////////////////////////////
- 16: // 2. add a menu item with "X" image,which is clicked to quit the program
- 18: // you may modify it.
- 19: // 你可以修改它。
- 20: // add a "close" icon to exit the progress. it's an autorelease object
- 22: CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
- 23: "CloseNormal.png",
- 24: "CloseSelected.png",monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 16pt; padding-right: 0px; background-color: white"> 25: this,monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 16pt; padding-right: 0px; background-color: #f4f4f4"> 26: menu_selector(HelloWorld::menuCloseCallback));
- 27:
- @H_491_301@ 28: pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2,monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 16pt; padding-right: 0px; background-color: white"> 29: origin.y + pCloseItem->getContentSize().height/2));
- 30:
- 31: // create menu,it's an autorelease object
- 32: // 创建menu对象,也是自动释放的
- 33: CCMenu* pMenu = CCMenu::create(pCloseItem,NULL);
- 34: //设置位置为CCPintZero,其实就是原点ccp(0,0)
- 35: pMenu->setPosition(CCPointZero);
- 36: //添加到layer
- 37: this->addChild(pMenu,1);
- 38:
- 39: /////////////////////////////
- 40: // 3. add your codes below...
- 42: // add a label shows "Hello World"
- 44: // create and initialize a label
- 45: // 创建一个label并初始化
- 46: CCLabelTTF* pLabel = CCLabelTTF::create("Hello World","Arial",24);
- 47:
- 48: // position the label on the center of the screen
- 49: // 设置lable的位置在屏幕的中间(中央),其实是这个程序OpenGLView的中央
- 50: pLabel->setPosition(ccp(origin.x + visibleSize.width/2,monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 16pt; padding-right: 0px; background-color: white"> 51: origin.y + visibleSize.height - pLabel->getContentSize().height));
- 52:
- 53: // add the label as a child to this layer
- 54: // 把创建的label作为一个孩子添加到这个layer层。(layer上放置Child)
- 55: this->addChild(pLabel,monospace; width: 100%; border-bottom-style: none; color: black; padding-bottom: 0px; direction: ltr; text-align: left; padding-top: 0px; border-right-style: none; padding-left: 0px; margin: 0em; border-left-style: none; line-height: 16pt; padding-right: 0px; background-color: #f4f4f4"> 56:
- 57: // add "HelloWorld" splash screen"
- 58: // 用HelloWorld.png来创建一个 Sprite(精灵)
- 59: CCSprite* pSprite = CCSprite::create("HelloWorld.png");
- 60:
- 61: // position the sprite on the center of the screen
- 62: // 把上面刚刚创建的精灵的(放置的)位置为窗口的中央
- 63: pSprite->setPosition(ccp(visibleSize.width/2 + origin.x,visibleSize.height/2 + origin.y));
- 64:
- 65: // add the sprite as a child to this layer
- 66: // 把上面创建的精灵sprite也添加到layer
- 67: this->addChild(pSprite,0);
- 68:
- 69: return true;
- 70: }
menuCloseCallback菜单回调
1: void HelloWorld::menuCloseCallback(CCObject* pSender)
- 2: {
- 3: // 各个不同的平台标识
- 4: /*********************************************************
- 5: #define CC_PLATFORM_UNKNOWN 0
- 6: #define CC_PLATFORM_IOS 1
- 7: #define CC_PLATFORM_ANDROID 2
- 8: #define CC_PLATFORM_WIN32 3
- 9: #define CC_PLATFORM_MARMALADE 4
- 10: #define CC_PLATFORM_LINUX 5
- 11: #define CC_PLATFORM_BADA 6
- 12: #define CC_PLATFORM_BLACKBERRY 7
- 13: #define CC_PLATFORM_MAC 8
- 14: #define CC_PLATFORM_NACL 9
- 15: #define CC_PLATFORM_EMSCRIPTEN 10
- 16: #define CC_PLATFORM_TIZEN 11
- 17: #define CC_PLATFORM_WINRT 12
- 18: #define CC_PLATFORM_WP8 13
- 19:
- 20: #define CC_TARGET_PLATFORM CC_PLATFORM_WIN32
- 21: **********************************************************/
- 22: //进行平台的判断,这里是win32平台,其他的平台应该是不一样的
- 23: #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
- 24: //WinRT和WindowsPhone8结束,其没有。。。
- 25: CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
- 26: #else
- 27: CCDirector::sharedDirector()->end(); //导演end结束了
- @H_491_301@ 28: #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
- 29: exit(0); //IOS平台多做一步
- 30: #endif
- 31: #endif
- 32: }
Scene场景
1: CCScene* HelloWorld::scene()
- 3: // 'scene' is an autorelease object
- 4: // 场景也是自动释放对象的.看cocos2d3.0中间大量用到了C++11的特性,不想看了
- 6: CCScene *scene = CCScene::create();
- 7: // CCScene *CCScene::create()
- 8: // {
- 9: // CCScene *pRet = new CCScene();
- 10: // if (pRet && pRet->init())
- 11: // {
- 12: // pRet->autorelease();
- 13: // return pRet;
- 14: // }
- 15: // else
- 16: // {
- 17: // CC_SAFE_DELETE(pRet);
- 18: // return NULL;
- 19: // }
- 20: // }
- 21: // 'layer' is an autorelease object
- 22: // layer也是自动释放对象的
- 23: // 这个layer是HelloWorld的对象指针
- 24: HelloWorld *layer = HelloWorld::create();
- 25:
- 26: // add layer as a child to scene
- 27: // 把layer添加到scene上去
- @H_491_301@ 28: scene->addChild(layer);
- 29:
- 30: // return the scene
- 31: return scene;
- 32: //返回scene指针给调用者(AppDelegate::applicationDidFinishLaunching())
- 33: }