cocos2d学习(04)——HelloWorld类分析

HelloWorld类分析

先看一下类图

HelloWorld类一共有四个成员函数。四个函数都比较不一般。

CREATE_FUNC是一个宏定义的成员函数,其在预处理阶段被替换。

下面一个一个来分析这些函数。这个设计得挺好的,就是注释写得不合我意,只怪当年没有努力学英语。

CREATE_FUNC 创建create

 1: CREATE_FUNC(HelloWorld);
 2: ////上面的宏替换后为以下内容
 3: static helloworld* create()
 4: {//调用构造函数,创建一个helloworld对象
 5:     helloworld *pret = new helloworld();
 6:     if (pret && pret->init())
 7:     {    //上面调用了init函数,如果对象创建成功且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() )
 8:     {    //对基类的是init不成功,返回false给调用者(create函数)
 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
 17:     //再加上“X”图像菜单项,并点击它来退出程序
 18:     // you may modify it.
 19:     // 你可以修改它。
 20:     // add a "close" icon to exit the progress. it's an autorelease object
 21:     // 添加一个“close”图标用于退出进程 。这是一个自动释放对象
 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_877_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...
 41:     // 添加你自己的代码到这下面
 42:     // add a label shows "Hello World"
 43:     // 添加一个label用来显示"Hello World",可以修改为别的,中文支持不好。可以简单将源文件修改为UTF8格式来支持中文
 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_877_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的特性,不想看了
 5:         // 这里创建一个scene场景,调用的是场景的创建方法
 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_877_301@ 28:     scene->addChild(layer);
 29:
 30:     // return the scene
 31: return scene;
 32: //返回scene指针给调用者(AppDelegate::applicationDidFinishLaunching())
 33: }

相关文章

操作步骤 1、创建cocos2d-x工程 2、新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#defi...
开发环境:OS(WINDOWS 8.1 X64 企业版) cocos2d-x 2.2.1 vs2010 想给vs安装上cocos的模版,执行Install...
把创建项目做成一个批处理,当创建项目时可以省时省力很多。 操作步骤 1、在 E:cocos2d-x-2.2.1toolspr...
https://www.cnblogs.com/JiaoQing/p/3906780.html 四个响应函数 1 EventListenerPhysicsContact* evC...
转载于 http://www.cnblogs.com/kenkofox/p/3926797.html 熟悉js的dom事件或者flash事件的,基本都能立...
ScrollView(滚动容器)加载大量item时会导致游戏界面的卡顿,严重时整个界面会出现卡死的情况。最近项...