Cocos2d-x学习笔记(四) 布景层的加入移除

布景层类也就是CCLayer类,每一个游戏场景中都能够有非常多层,每一层负责各自的任务,显示地图、显示人物等。

同一时候层还是一个容器。能够放入文本、图片和菜单,构成游戏中一个个UI。这次将学习在场景中加入移除层、设置层属性和在层中实现一些简单的操作。

首先我们来看一下层的创建:

bool LayerTest::init()
{
	//////////////////////////////
	// 1. super init first
	if ( !CCLayer::init() )
	{
		return false;
	}
	CCSize s = CCDirector::sharedDirector()->getWinSize();
	CCLayerColor* layer = CCLayerColor::create( ccc4(255,0,0,255),200,200);
	layer->ignoreAnchorPointForPosition(false);
	layer->setPosition( CCPointMake(s.width/2, s.height/2) );
	addChild(layer, 1);
	return true;
}

执行后效果例如以下:

同一时候我们还能够给这个层改变颜色、大小和其它的属性,在这里我就不示范了。接下来我们写一些简单应用样例。

在前面的样例中场景与层是写在同一个类里的,如今为了便于理解,我将场景与层分开处理,也就是场景和层都将是单独的类。

首先我创建了两个布景层类,AboutLayer和PlayLayer,实现代码例如以下:

AboutLayer.h

#pragma once
#include "cocos2d.h"
USING_NS_CC;
class AboutLayer : public cocos2d::CCLayer
{
public:
	virtual bool init();

	void menuCloseCallback(CCObject* pSender);

	CREATE_FUNC(AboutLayer);
};

AboutLayer.cpp

#include "AboutLayer.h"

bool AboutLayer::init()
{
	CCSize s = CCDirector::sharedDirector()->getWinSize();

	CCLayerColor* pLayer = CCLayerColor::create(ccc4(255,0,0,255));

	pLayer->ignoreAnchorPointForPosition(false);

	pLayer->setContentSize(CCSizeMake(200,200));//设置层大小

	pLayer->setPosition(CCPointMake(s.width/2-100, s.height/2));//设置层位置

	CCLabelTTF *pLabel = CCLabelTTF::create("This is AboutLayer","Thonburi", 14);

	pLabel->setPosition(CCPointMake(pLayer->getContentSize().width/2, pLayer->getContentSize().height/2));

	pLayer->addChild(pLabel);

	return true;
}

然后创建一个场景类。我将它命名为SingleScene,代码例如以下:

SingleScene.h

#pragma once
#include "cocos2d.h"
#include "AboutLayer.h"
#include "PlayLayer.h"

class SingleScene : public cocos2d::CCScene
{
public:
	virtual bool init();
	static CCScene* runScene(); 

	void menuAboutClick(CCObject* pSender);

	void menuPlayClick(CCObject* pSender);

	CREATE_FUNC(SingleScene);
};

SingleScene.cpp

#include "SingleScene.h"

CCScene* SingleScene::runScene()
{
	SingleScene* scene = new SingleScene();
	scene->init();
	return scene;
}

bool SingleScene::init()
{
	//创建aboutbutton
	CCMenuItemImage *pAboutItem = CCMenuItemImage::create("btn-about-normal.png",
		"btn-about-selected.png",this,menu_selector(SingleScene::menuAboutClick));

	pAboutItem->setPosition(ccp(100,30));

	//创建menu
	CCMenu *pMenu = CCMenu::create(pAboutItem,NULL);
	pMenu->setPosition(CCPointZero);

	addChild(pMenu);

	return true;
}

类创建好了。我们来实现点击button后,在SingleScene.cpp中加入一个层。加入层的关键代码:

void SingleScene::menuAboutClick(CCObject* pSender){
	AboutLayer* pLayer_about = AboutLayer::create();
	addChild(pLayer_about,1,1);
}

至于层里面的显示内容大家自由发挥吧,有前几章的学习应该没什么问题~

执行效果例如以下,按下Aboutbutton后弹出一个层来。

接下来我们在AboutLayer.cpp上加入一个button,让我们按下button能够移除这个层。移除层的关键代码:

void AboutLayer::menuCloseCallback(CCObject* pSender)
{
	this->removeFromParentAndCleanup(true);
}

执行效果例如以下,点击右上角的关闭button会将about层移除掉。

相同的代码我再在PlayLayer里面实现一遍,这样看起来像不像游戏里的功能菜单的雏形啦?哈哈。

布景层的简单功能学习完毕了,想要了解很多其它功能在以后的学习中会有机会碰到。在这里有个小小的问题,大家应该会发现假设不停的按同一个button会产生非常多个相同的层,尽管他们在相同的位置肉眼看不出来。但他们确确实实是会存在的,为了解决问题我在加入层的方面里加了一句代码:

void SingleScene::menuAboutClick(CCObject* pSender){
	if (getChildByTag(1)!=NULL)
		removeChild(getChildByTag(1));
	AboutLayer* pLayer_about = AboutLayer::create();
	addChild(pLayer_about,1,1);
}

给层设置属性Tag为1,然后在加入层前将Tag为1的层先移除,尽管我认为这是个蛮笨的办法。只是眼下我对cocos2dx的了解也仅限于此呀!





时间: 2024-11-01 18:06:20

Cocos2d-x学习笔记(四) 布景层的加入移除的相关文章

laravel3学习笔记(四)

原作者博客:ieqi.net ==================================================================================================== 视图 Laravel3遵循MVC模式,视图层负责将控制器处理好的数据展示出来,view层相关代码文件保存在application/views目录下,并且以php结尾. 因为PHP本身就可以和HTML混写的特性,一般而言,PHP框架的View层某种程度上也可以作为模板使

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

NLTK学习笔记(四):自然语言处理的一些算法研究

自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结的自然语言中常用的一些基本算法,算是入个门了. 递归 使用递归速度上会受影响,但是便于理解算法深层嵌套对象.而一些函数式编程语言会将尾递归优化为迭代. 如果要计算n个词有多少种组合方式?按照阶乘定义:n! = n*(n-1)*...*1 def func(wordlist): length = le

Android学习笔记四:添加Source

问题描述 Source not foundThe JAR file D:\.....\sdk\platforms\android-20\android.jar has no source attachment. 问题原因及解决办法 1. 使用SDK Manager下载最新版本的Sources for Android SDK 一般文件下载目录默认在SDK下的sources文件中即 \adt-bundle-windows-x86_64-20130522\sdk\sources\android-20

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

WEB前端学习笔记 四

接上一篇,web学习笔记 四,在此感谢您对此篇笔记的认可,但转发时请注明文章出自网知博学. 2.0  html的语法格式 html的标签要写在尖括号中 :<> 在在英文输入法状态下,按住shift键然后再按它左侧的尖括号就可了, 先学习一个简单的h1标签,是个标题标签,在html中这样写: <h1>我在h1标签中,我就是标题</h1> 那么h1标签中所包裹的文字,就标记成标题了.通过浏览器的解析后在页面上显示出来的效果就是字体加粗,加黑,和word中的标题性质一样! 大