龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

Cocos2d-x学习笔记之Hello World源码分析(2)

时间:2014-09-12 03:19来源:网络整理 作者:网络 点击:
分享到:
以上俩个文件中的代码我们使用模板生成成功以后基本不用更改,我们需要做的就是写自己的场景类,写之前,让我们看看HelloWorld这个场景的实现吧。 先

以上俩个文件中的代码我们使用模板生成成功以后基本不用更改,我们需要做的就是写自己的场景类,写之前,让我们看看HelloWorld这个场景的实现吧。

先来看HelloWorld.h

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

#include "SimpleAudioEngine.h"

//HelloWorld继承自CCLayer图层
class HelloWorld : public cocos2d::CCLayer
{
public:
  //这是HelloWorld场景类的初始化函数,是一个虚函数
  virtual bool init();

  //这是一个静态函数,可以通过指向类名的指针->scene()直接调用,返回一个CCScene场景的指针
  static cocos2d::CCScene* scene();

  //这是一个回调函数,是对单击结束按钮事件的响应函数
  void menuCloseCallback(CCObject* pSender);

  //这个宏可以通过f12看看他的具体实现,其实就是new一个对象,然后调用它的init函数(现在知道init函数什么时候调用了吧),然后返回该对象的指针
  CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

然后是HelloWorld.cpp

#include "HelloWorldScene.h"

using namespace cocos2d;

CCScene* HelloWorld::scene()
{
  CCScene * scene = NULL;
	//这个do,while循环只会执行一次,为什么这样写,先不用管
  do
  {
    //首先创建一个CCScene的场景,调用的是create函数,其实对象的创建大多数都是调用create函数
		//这个create函数内部就是new一个对象,然后调用对象的init()函数,还有关于内存管理的一些工作,先不用管,你只需要记住c++中我们创建指向对象的指针是通过new,现在都封装在了create函数中了
    //可能有时候我们需要往create()中传入一些东西,但是它的内部实现函数我上边说的,就是带了几个参数而已
		scene = CCScene::create();
		//CC_BREAK_IF宏的含义是如果没有创建成功对象scene,就跳出do,while语句
    CC_BREAK_IF(! scene);

    //大家可以对create()f12一下,看是不是到了CREATE_FUNC(HelloWorld)这了,说明我上边说的就是对的。这里产生了一个指向helloworld层的指针。
    HelloWorld *layer = HelloWorld::create();
    CC_BREAK_IF(! layer);

    //将helloworld层添加到scene场景中,往一个场景中添加层,往层中添加精灵等都是用的这个函数addChild()
    scene->addChild(layer);
  } while (0);

  //返回包含helloworld这个层的场景
  return scene;
}

//有些人可能还会问init函数是什么时候调用的,我建议你好好看看上边的注释
bool HelloWorld::init()
{
  bool bRet = false;
  do
  {
		//首先初始化父类的init()函数
    CC_BREAK_IF(! CCLayer::init());

    //这是一个菜单项,对应图中的那个关闭按钮,传入俩张图片,对应正常状态时候的按钮盒按下状态的按钮图片
		//第四个参数中menu_selector是菜单选择器,cocos2d-x中还有不少的选择器,先记住,menuCloseCallback对应那个回调函数,第三个参数this就代表是哪个类的回调函数
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
      "CloseNormal.png",
      "CloseSelected.png",
      this,
      menu_selector(HelloWorld::menuCloseCallback));
    CC_BREAK_IF(! pCloseItem);

    //设置这个按钮的坐标,ccp也是一个宏,用来设置坐标的,getWinSize()获得了屏幕的尺寸,返回CCSize,width、height是它的属性
    pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

    //创建一个菜单,在cocos2d-x中需要将菜单项添加到菜单中也就是CCMenu中才可以,NULL表示菜单项的结束。
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
		//设置这个菜单的坐标CCPointZero对应(0,0)
    pMenu->setPosition(CCPointZero);
    CC_BREAK_IF(! pMenu);

    //将菜单添加到HelloWorld的图层中,1表示的是深度,数字越小深度越深,只有添加到图层中才可以显示
    this->addChild(pMenu, 1);

    //创建一个文字,传入要显示的字,字体,大小,对应图片上的那个helloworld
    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);
    CC_BREAK_IF(! pLabel);

    //获得屏幕的尺寸
    CCSize size = CCDirector::sharedDirector()->getWinSize();
		//为pLabel设置坐标
    pLabel->setPosition(ccp(size.width / 2, size.height - 50));

    //将这个文字天剑到图层中才能显示
    this->addChild(pLabel, 1);

    //往图层中添加一个精灵是最常用的,精灵初始化的时候传入了一张图片,这个资源就在resource下
    CCSprite* pSprite = CCSprite::create("HelloWorld.png");
    CC_BREAK_IF(! pSprite);

    //设置这个精灵的坐标
    pSprite->setPosition(ccp(size.width/2, size.height/2));

    //将精灵添加到图层中,深度是0
    this->addChild(pSprite, 0);

    bRet = true;
  } while (0);

  return bRet;
}

//当用户按下关闭按钮的时候调用该回调函数,CCObject代表的是和这个函数绑定的按钮,用的时候强制转化为CCMenuItemImg*
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
  //导演调用end方法结束游戏
  CCDirector::sharedDirector()->end();
}
精彩图集

赞助商链接