布景层类也就是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的了解也仅限于此呀!




最新文章

  1. CSS设置DIV背景色渐变
  2. 初探JavaScript(三)——JS带我"碰壁"带我飞
  3. Rest.Ler PHP API Server解决方案
  4. Can not issue data manipulation statements with executeQuery() 异常处理
  5. 后台子线程(非主线程)更新UI引起的警告
  6. 简单图解设置MYSQL可以通过其他机器远程访问,开启远程访问权限
  7. 2016年11月26号随笔(关于oracle数据库)
  8. 《OpenGL着色语言》理解点记录三
  9. ksh和bash区别
  10. R-大数据分析挖掘(5-R基础回顾)
  11. iOS:iOS开发中用户密码保存位置
  12. bzoj2002
  13. 二、C# 数据类型
  14. Backbone的 listenTo 和 on
  15. 原生Java代码拷贝目录
  16. Unity3D-RayMarch-几何图元-3添加阴影
  17. 『TensotFlow』转置卷积
  18. Nginx实现数据库端口转发
  19. xdoj新生现场赛1269——带有限制条件的bfs 寻找最短路径
  20. CPU load高而使用率低的问题分析

热门文章

  1. linux系统mysql密码修改脚本
  2. 理解点击屏幕的事件响应--->对- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法的理解
  3. 【Luogu】P2488工作安排(费用流)
  4. [BJOI2006][bzoj1001] 狼抓兔子 [最小割]
  5. .config 中特殊字符的处理
  6. iOS之UITraitCollection
  7. webpack最佳入门实践系列(2)
  8. VMWare VMNet 8 的配置使用
  9. sql2008百万级数据排除重复信息
  10. 【HDOJ5519】Kykneion asma(状压DP,容斥)