[cocos2d-x 学习] Scene(场景)学习

本文详细介绍了cocos2d-x中的CCScene,包括其基本概念和两种主要的使用方法:`CDirector::sharedDirector()->pushScene`与`CCDirector::sharedDirector()->replaceScene`,旨在帮助开发者理解如何在cocos2d-x框架中管理场景。
摘要由CSDN通过智能技术生成

CCScene简介

CCScene is a subclass of CCNode that is used only as an abstract concept.

CCScene an CCNode are almost identical with the difference that CCScene has it's anchor point (by default) at the center of the screen.

For the moment CCScene has no other logic than that, but in future releases it might have additional logic.

It is a good practice to use and CCScene as the parent of all your nodes.

上面是 cocos2d-x 官网解释关于 CCScene 解释,Scene 主要是游戏中的场景,继承与 CCNode 也是一个 Node(节点),可以理解为玩游戏中每个页面,每一个页面中又有不同的节点,例如任务,怪兽,子弹,主角等,上面也建议我们用 CCScene 作为游戏画面中的容器(parent),包括其他所有节点。

CCScene用法

主要是自己创建场景,使用 CCDirector::replaceScene(**) 和 CCDirector::pushScene(**) 2个方法来更换当前场景
在 win32 include 中新建 SceneTest.h 头文件,头文件定义如下,(#define 为了防止重复编译)
#ifndef __SCENETEST__
#define __SCENETEST__

#include "cocos2d.h"
#include "SimpleAudioEngine.h"

class Sceneclass : cocos2d::CCLayerColor {
public:
	Sceneclass();
	~Sceneclass();
	// 初始化scene
	static cocos2d::CCScene* scene();
	virtual void onEnter();
	// 菜单点击回调函数
	void popScene(cocos2d::CCObject* sender);
	void pushScene(cocos2d::CCObject* sener);
	void replaceScene(cocos2d::CCObject* sender);
	// 添加菜单
	void addMenu(CCLayer* layer);
};

#endif

CDirector::sharedDirector()->pushScene 方法

pushScene 把当前新建的 Scene 加入到项目 scene 堆栈,并且显示到当前页面,之前的 scene 并不会消灭,如果使用 popScene 就把栈顶出栈,恢复到之前 scene

CCDirector::sharedDirector()->replaceScene 方法

replaceScene 把当前 scene 替换掉。

下面是实现的代码:
#include "SceneTest.h"

using namespace cocos2d;

CCScene* Sceneclass::scene()
{
	CCScene* scene = CCScene::create();
	Sceneclass* layer = new Sceneclass();
	layer->autorelease();
	scene->addChild(layer);
	return scene;
}

Sceneclass::Sceneclass()
{
	// 记得初始化
	CCLayerColor::initWithColor(ccc4(255, 255, 255, 255));
}

void Sceneclass::onEnter()
{
	// 初始化父类
	CCLayerColor::onEnter();
	this->addMenu(this);
	CCLog("onEnter");
}

void Sceneclass::popScene(CCObject* sender)
{
	// 弹出当前scene堆栈最顶scene
	CCDirector::sharedDirector()->popScene();
	CCLog("popScene");
}

void Sceneclass::pushScene(CCObject* sender)
{
	CCLog("pushScene");
	CCScene* scene = CCScene::create();
	Sceneclass* layer = new Sceneclass();
	layer->autorelease();
	layer->setColor(ccc3(76, 67, 76));
	// 初始化菜单
	this->addMenu(layer);
	scene->addChild(layer);
	// 把当前scene压入到scene堆栈,之前一个并没有清楚
	CCDirector::sharedDirector()->pushScene(scene);
}

void Sceneclass::replaceScene(CCObject* sender)
{
	CCScene* scene = CCScene::create();
	Sceneclass* layer = new Sceneclass();
	layer->autorelease();
	layer->setColor(ccc3(233, 23, 45));
	// 初始化菜单
	this->addMenu(layer);
	scene->addChild(layer);
	// 替换当前scene,清除前一个scene
	CCDirector::sharedDirector()->replaceScene(scene);
	CCLog("replaceScene");
}

void Sceneclass::addMenu(CCLayer* layer)
{
	// 添加菜单
	CCMenuItemFont* item1 = CCMenuItemFont::create("popScene", this, menu_selector(Sceneclass::popScene));
	CCMenuItemFont* item2 = CCMenuItemFont::create("pushScene", this, menu_selector(Sceneclass::pushScene));
	CCMenuItemFont* item3 = CCMenuItemFont::create("replaceScene", this, menu_selector(Sceneclass::replaceScene));
	CCMenu* menu = CCMenu::create(item1, item2, item3, NULL);
	menu->alignItemsVertically();
	menu->setColor(ccc3(0, 0, 0));
	layer->addChild(menu, 1);
}

Sceneclass::~Sceneclass()
{}

效果:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值