不会去重复一些概念性的东西,具体的内容,我在代码中已经备注出来。先看目录,这个创建完项目目录的Classes文件夹下有4个文件,我把helloworld那两个文件直接改了名字,这里我叫MainScene 。切记,在改为名字之后需要到appDelegate.pp里面把对应的helloworld改过来。
废话不多说,直接上代码
1,appDelegate.h
[cpp] view plain copy
- #ifndef _APP_DELEGATE_H_
- #define _APP_DELEGATE_H_
- #include "cocos2d.h"
- /**
- * cocos2d 应用入口类
- * 官方解释这里使用私有继承的原因是隐藏了一些导演类的接口
- * C++ 不是很懂,后期再好好研究下
- */
- class AppDelegate : private cocos2d::Application
- {
- public:
- //构造函数,构造一个AppDelegate
- AppDelegate();
- //析构函数,用于回收垃圾,释放空间,这里是虚函数,建议包括本人在内的new C++er好好补习下C++基础
- //这里找到资料为:C++通过虚函数实现多态."无论发送消息的对象属于什么类,它们均发送具有同一形式的消息,对消息的处理方式可能随接手消息的对象而变"的处理方式被称为多态性。
- virtual ~AppDelegate();
- /**
- * 主程序的入口方法,在这里对导演和场景的初始化
- @return true 初始化 success, 应用 continue.
- @return false 初始化 failed, 应用 terminate.
- */
- virtual bool applicationDidFinishLaunching();
- /**
- * 程序转入背景运行函数
- */
- virtual void applicationDidEnterBackground();
- /**
- * 程序恢复运行函数
- */
- virtual void applicationWillEnterForeground();
- };
- #endif // _APP_DELEGATE_H_
2,appDelegate.cpp
[cpp] view plain copy
- #include "AppDelegate.h"
- #include "MainScene.h" //这里原本是HelloWorldScene,我换了名字
- //使用cocos2dx的命名空间,如果不使用的话,貌似有些cocos的字段显示无法识别
- USING_NS_CC;
- //构建入口类
- AppDelegate::AppDelegate() {
- }
- //析构函数,用于垃圾回收
- AppDelegate::~AppDelegate()
- {
- }
- //启动程序入口
- bool AppDelegate::applicationDidFinishLaunching() {
- // 初始化导演类
- auto director = Director::getInstance();
- //通过导演类获取一个OpenGL坐标系
- auto glview = director->getOpenGLView();
- //如果没有获取到,创建一个坐标系界面,命名为Cocos2dxSceneShow
- if(!glview) {
- glview = GLView::create("Cocos2dxSceneShow");
- director->setOpenGLView(glview);
- }
- // 打开显示帧率
- director->setDisplayStats(true);
- // 设置默认帧率为1.0/60,即每秒60帧
- director->setAnimationInterval(1.0 / 60);
- // 创建一个允许被释放的场景MainScene
- auto scene = MainScene::scene();
- // 入口,运行这个MainScene场景
- director->runWithScene(scene);
- return true;
- }
- // 暂停应用的时候调用。比如来了电话
- void AppDelegate::applicationDidEnterBackground() {
- Director::getInstance()->stopAnimation();
- // 如果用了音乐等 SimpleAudioEngine, 这里需要加上
- // SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
- }
- // 重新唤醒游戏调用
- void AppDelegate::applicationWillEnterForeground() {
- Director::getInstance()->startAnimation();
- // 如果用了音乐等 这里需加上
- // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
- }
3,MainScene.h(helloworld那个类)
[cpp] view plain copy
- #ifndef __MainScene_H__
- #define __MainScene_H__
- #include "cocos2d.h"
- //创建一个MainScene类继承自cocos2d的Layer类
- class MainScene : public cocos2d::Layer
- {
- public:
- //初始化函数,我用来定义组件
- virtual bool init();
- //创建一个场景
- static cocos2d::Scene* scene();
- //转场第一个界面
- void onPushSceneOne(Ref* pSender);
- //转场第二个界面
- void onPushSceneTwo(Ref* pSender);
- //关闭方法
- void menuCloseCallback(Ref* pSender);
- //创建场景宏
- CREATE_FUNC(MainScene);
- };
- #endif // __HELLOWORLD_SCENE_H__
4,MainScene.cpp
[cpp] view plain copy
- //这个类开始在项目生成的时候是helloworld类,这里我改了一下
- #include "MainScene.h"
- //项目中调用了NewScene所以需要引用
- #include "NewScene.h"
- #include "GameScene.h"
- USING_NS_CC;
- //创建主场景
- Scene* MainScene::scene()
- {
- //使用场景类创建一个场景
- auto scene = Scene::create();
- //创建一个MainScene层
- MainScene *layer = MainScene::create();
- //把层添加到场景里面去
- scene->addChild(layer);
- // 返回一个场景
- return scene;
- }
- // 初始化一个MainScene层
- bool MainScene::init()
- {
- //层的初始化是否成功
- if (!Layer::init())
- {
- return false;
- }
- //获取坐标系界面的屏幕可见区域
- Size visibleSize = Director::getInstance()->getVisibleSize();
- //原点位置
- Point origin = Director::getInstance()->getVisibleOrigin();
- //创建一个关闭按钮,参数分别为,正常状态显示的图片,选中状态的图片,操作调用的方法即调用MainScene的menuCloseCallback方法
- auto closeItem = MenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- CC_CALLBACK_1(MainScene::menuCloseCallback, this));
- //设置关闭按钮的位置为视图的右下方
- closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width / 2,
- origin.y + closeItem->getContentSize().height / 2));
- //创建菜单,请注意,最后一个参数一定是NULL
- auto menu = Menu::create(closeItem, NULL);
- //初始化菜单的位置为原点位置,这个我也需要找个时间理解下
- menu->setPosition(Point::ZERO);
- //把菜单添加到层中
- this->addChild(menu, 1);
- //在视图的正中间竖向位置添加2个图片按钮
- auto item1 = MenuItemImage::create("btn-play-normal.png", "btn-play-selected.png", CC_CALLBACK_1(MainScene::onPushSceneOne, this));
- auto item2 = MenuItemImage::create("btn-about-normal.png", "btn-about-selected.png", CC_CALLBACK_1(MainScene::onPushSceneTwo, this));
- auto menu_oper = Menu::create(item1, item2, NULL);
- menu_oper->alignItemsVerticallyWithPadding(50);
- this->addChild(menu_oper, 1);
- return true;
- }
- /**
- * 进入NewScene的方法
- */
- void MainScene::onPushSceneOne(Ref* pSender){
- auto scene = Scene::create();
- scene->addChild(SceneTestLayer::create());
- Director::getInstance()->replaceScene(TransitionFlipX::create(.5, scene));
- }
- /**
- *进入GameScene的方法
- */
- void MainScene::onPushSceneTwo(Ref* pSender){
- auto scene = Scene::create();
- scene->addChild(GameSceneLayer::create());
- Director::getInstance()->replaceScene(TransitionFlipX::create(.5, scene));
- }
- /**
- * 关闭视窗的方法
- * 下面是官方定义好的一个宏,意思就是,当平台为wp8或者winRT会弹出框
- */
- void MainScene::menuCloseCallback(Ref* pSender)
- {
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
- MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.", "Alert");
- return;
- #endif
- Director::getInstance()->end();
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
- exit(0);
- #endif
- }
5,NewScene.h
[cpp] view plain copy
- #ifndef __NewScene_H__
- #define __NewScene_H__
- #include "cocos2d.h"
- //创建一个SceneTestLayer类继承自cocos2d的Layer类
- class SceneTestLayer : public cocos2d::Layer
- {
- public:
- //构造函数
- SceneTestLayer();
- //初始化函数
- bool init();
- //返回主界面函数
- void backToMainScene(Ref* sender);
- //创建SceneTestLayer层宏
- CREATE_FUNC(SceneTestLayer)
- };
- #endif
6,NewScene.cpp
[cpp] view plain copy
- #include "NewScene.h"
- #include "MainScene.h"
- USING_NS_CC;
- //构造函数,这里没做什么
- SceneTestLayer::SceneTestLayer(){}
- /**
- * 初始化函数,用来初始化界面组件
- * 下面的代码很容易理解,我就不一一注解了
- */
- bool SceneTestLayer::init()
- {
- if (Layer::init())
- {
- auto textItem = MenuItemFont::create("This is NewSence");
- auto item = MenuItemFont::create("Back", CC_CALLBACK_1(SceneTestLayer::backToMainScene, this));
- auto menu = Menu::create(textItem,item, NULL);
- menu->alignItemsVertically();
- this->addChild(menu);
- return true;
- }
- return false;
- }
- /**
- * 返回主界面的函数
- */
- void SceneTestLayer::backToMainScene(Ref* sender){
- auto scene = Scene::create();
- scene->addChild(MainScene::create());
- Director::getInstance()->replaceScene(TransitionFlipX::create(.5, scene));
- }
7,GameScene.h
[cpp] view plain copy
- #ifndef __GameSceneLayer_H__
- #define __GameSceneLayer_H__
- #include "cocos2d.h"
- class GameSceneLayer : public cocos2d::Layer
- {
- public:
- GameSceneLayer();
- bool init();
- void backToMainScene(Ref* sender);
- CREATE_FUNC(GameSceneLayer)
- };
- #endif
8,GameScene.cpp
[cpp] view plain copy
- #include "GameScene.h"
- #include "MainScene.h"
- USING_NS_CC;
- GameSceneLayer::GameSceneLayer(){}
- bool GameSceneLayer::init()
- {
- if (Layer::init())
- {
- auto testItem = MenuItemFont::create("This is GameScene");
- auto item = MenuItemFont::create("Back", CC_CALLBACK_1(GameSceneLayer::backToMainScene, this));
- auto menu = Menu::create(testItem, item, NULL);
- //竖向排列,间距50
- menu->alignItemsVerticallyWithPadding(50);
- this->addChild(menu);
- return true;
- }
- return false;
- }
- void GameSceneLayer::backToMainScene(Ref* sender){
- auto scene = Scene::create();
- scene->addChild(MainScene::create());
- Director::getInstance()->replaceScene(TransitionFlipX::create(.5, scene));
- }
OK,代码就这些,我在官方的demo(testcpp里面找了4张图片这里就不解释了)直接放到resource文件夹下面就行了
运行效果如下,简单的说就是3个层的切换
主界面如下:
点击play图片,切换到NewScene:
点击back可返回
点击MainScene的aboat图片,可进入GameScene界面
OK,就是这么简单,当然,这才刚开始,因为到本人写这篇博客为止,我看cocos2dx的资料时间也就2天,这个东西也是模拟官方demo弄的,非常的坑,不过刚开始练手还是可以的。