看了半天的源码,有种看看都懂,一问都不知道的感觉。唉,还是实际点,来敲敲代码吧。
打开我的vs,新建类GameScene。为了公用,把类放在Class文件夹下吧。
一个场景继承cocos2d::Layer这个类,因为每个场景都是由层组成的,所以实现场景所以需要继承Layer。
HelloWorldScene里有四个方法,这应该是实现一个场景最基础的几个方法咯,所以我也在GameScene里仿着写这几个。
static cocos2d::Scene* createScene(); //静态函数,通过该函数获取场景对象
virtual bool init(); //初始化Scene函数
void menuCloseCallback(cocos2d::Ref* pSender); //关闭按钮回调函数
CREATE_FUNC(GameScene); //具体创建GameScene场景的宏函数
/*
这是一个宏,具体内容如下:
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>CREATE_FUNC(GameScene);将转化成</span>
<span style="white-space:pre"></span><pre name="code" class="cpp"><span style="white-space:pre"> </span>static GameScene* create {<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
GameScene *pRet = new GameScene();
if (pRet && pRet->init())
{
pRet->autorelease();
return pRet;
}
else
{
delete pRet;
pRet = NULL;
return NULL;
}
*/
在头文件定义好后,然后在GameScene.cpp里具体实现。
USING_NS_CC;
//创建GameScene场景
Scene* GameScene::createScene() {
auto scene = Scene::create();
auto layer = GameScene::create();
scene->addChild(layer);
return scene;
}
bool GameScene::init() {
//先实例化父类Layer的init方法,成功返回true,失败返回false
if (!Layer::init()) {
return false;
}
Size size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
auto closeSprite = MenuItemImage::create("CloseNormal.png",//正常状态下的图片
"CloseSelected.png",//被选中的状态下的图片
CC_CALLBACK_1(GameScene::menuCloseCallback, this)); //回调函数地址
closeSprite->setPosition(Vec2(origin.x + size.width - closeSprite->getContentSize().width / 2, //设置关闭菜单的大小
origin.y + size.height - closeSprite->getContentSize().height / 2));
auto menu = Menu::create(closeSprite, NULL); //把它加入到菜单里
menu->setPosition(Vec2::ZERO);<span style="white-space:pre"> </span>//设置菜单的位置
this->addChild(menu, 1);
}
void GameScene::menuCloseCallback(Ref* pSender) {
Director::getInstance()->end();
}
在AppDelegate.cpp里引入我这个场景的头文件,然后把初始运行的HelloWorld::createScene()改成我的GameScene::createScene();Ok,编译运行。
黑漆漆的一片,代表这第一步的成功额。。。
--小新
2014-8-19