展会信息港展会大全

零基础学cocos2dx 3.0(顺带学C++)第一篇 切换场景
来源:互联网   发布日期:2015-09-27 14:59:52   浏览:2638次  

导读: 不会去重复一些概念性的东西,具体的内容,我在代码中已经备注出来。先看目录,这个创建完项目目录的Classes文件夹下有4个文件,我把helloworld那两个文件直接改了名字,这里我叫Main...

不会去重复一些概念性的东西,具体的内容,我在代码中已经备注出来。先看目录,这个创建完项目目录的Classes文件夹下有4个文件,我把helloworld那两个文件直接改了名字,这里我叫MainScene 。切记,在改为名字之后需要到appDelegate.pp里面把对应的helloworld改过来。

废话不多说,直接上代码

1,appDelegate.h

#ifndef_APP_DELEGATE_H_

#define_APP_DELEGATE_H_

#include "cocos2d.h"

/**

* cocos2d 应用入口类

* 官方解释这里使用私有继承的原因是隐藏了一些导演类的接口

* C++ 不是很懂,后期再好好研究下

*/

classAppDelegate : 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

#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那个类)

#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

//这个类开始在项目生成的时候是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

#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

#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

#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

#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:

赞助本站

人工智能实验室
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港