Cocos2d-x教程第(1)讲-让我们来学习一些传说中的概念

转载 2013年12月05日 00:20:01

 该文章适合所有想学Cocos2d-x的朋友,但最适合的人群是游戏开发经验及Cocos2d-x使用经验不多的朋友。

1.1 我的Cocos2d-x版本 

      笔者在写这边文章时,最新的Cocos2d-x版本是2.30,不过还仅仅是测试版;但由于笔者懒惰,使用的是2.14版本,同时建议读者使用2.14以上版本(2.15,2.20),这些版本都不会太过古老,不会使各位读者产生一种沧桑久远的感觉。

1.2 开发环境

     很多关于Cocos2d-x的教程都是在Windows平台上讲解的,除了Windows平台,也可以在Mac平台下学习。由于笔者是学iOS出身,所以使用的就是Mac平台,Mac平台下有一款很好的开发工具——Xcode。

1.3 常用游戏元素

      1.场景

      场景类在Cocos2d-x中用CCScene表示,单独的一个场景实际上只是一个空壳,里面什么东西都没有,我们需要向里面加入层,精灵,菜单等元素。我们都玩过一些手机或电脑游戏,在进入游戏之前,都会有一个开始界面,里面有开始游戏,读取存档,游戏设置等选项,每当你选择了一个选项,都会跳转到相应的界面,比如点击了开始游戏就会跳转到游戏的界面,那么开始的界面实际上就是一个场景,游戏界面是另外一个场景,而开始游戏以及游戏设置这些按钮不过是添加到场景中的一些元素。我们可以脑残的认为,游戏里面每一次的画面跳转就是一个场景,当然实际中也并不完全是这样。

     2.导演

     一个游戏中会包含很多个场景,那么如何有效的管理这些场景确实是一个麻烦,Cocos2d-x中提供了一个CCDirector类来负责管理他们,CCDirector也被称为导演类,有加载场景,切换场景等功能。

    2.1 加载场景 

    刚进入游戏的时候,必须有一个初始的场景,加载初始场景的方式代码清单如下所示:

    CCDirector::sharedDirector()->runWithScene(pScene);

    runWithScene只在加载第一个场景的时候使用

    2.2 切换场景

    如果我们想要做一个游戏,点击开始游戏之后切换到游戏的场景,就需要使用如下方法代码:

    CCDirector::sharedDirector()->replaceScene(pScene);

    2.3 场景切换的特效

    CCDirector::sharedDirector()->replaceScene(CCTransitionSlideInT::create(2.0f,theOtherScene::scene()));

    CCTransitionSlideInT是Cocos2d-x提供的一个场景类,这个场景类又包含了子场景,通过CCTransitionSlideInT的create函数就可以创建具备该动画的场景。create函数共有两个参数 (float t ,CCScene* scene),其中2.0f是动画播放的时间,theOtherScene::scene()是将要显示的场景类。

    Cocos2d-x的场景切换特效有很多种,这些特效是通过派生自CCScene的CCTransitionScene系列场景特效类实现的,大家可以自行尝试或查看官方Demo的SceneTest部分

    2.4场景的推进和弹出

    我们之前所做的场景切换用到的是replaceScene函数,该函数在进行场景切换时,会使旧的场景释放掉,即释放该场景所占用的内存空间,当你再次访问到该场景时场景会重新加载。但是有些时候我们切换场景的时候并不希望它被释放掉,而是保留现场,以便于一会我们再切换回来,此时我们可以用到另外两种场景切换方式:推进和弹出。

    推进场景的代码如下所示:
    CCDirector::sharedDirector->pushScene(theOtherScene::scene());

    使用pushScene函数后,theOherScene的场景会覆盖之前的场景,之前的场景会被暂停,但是却不会释放。如果想要使新场景被释放,回到旧场景,可以使用如下方法实现:

    CCDirector::sharedDirector()->popScene();

    3.层

    一个复杂的场景中会包括很多个层,举个例子来说,比如我们玩的某些页游,我们会发现人物在动的过程中背景会不断的滚动,但是游戏中的按钮是一直处于屏幕上固定的位置的,这就是层的使用。游戏中的背景和按钮并不在同一个层当中,所以他们所做的动作是互不干扰的。

    创建一个层的代码如下所示:

    CCLayer * layer=CClayer::create();

    向一个场景中添加层可以使用addChild方法,先添加的层会被置于后添加层的下面

    this->addChild(layer); //将layer层添加到了当前场景上

    this->addChild(layer,1) //与上面代码的功能相同,只不过该重载函数多了一个参数,该参数的功能是指定层的次序,值越大的层越靠上

    4.精灵

    4.1纹理

    在了解精灵之前,我们需要先知道纹理的概念。简单的来说,纹理实际上就是一张图片,这张图片被精灵给显示出来。由于Cocos2d-x使用了3D绘图库OpenGL,而纹理正式3D游戏中绘制到物体表面上的图案,比如山体、地表上面都是刷上去的纹理,所以尽管Cocos2d-x是二维引擎,却也涉及到纹理。

     4.2创建精灵

     正如我们之前所说,精灵是由一个纹理创建的,所以精灵就是一张显示在屏幕上的图片,比如我们在飞行射击游戏中所看见的敌机,包括角色本身的飞机,都是由精灵来实现的。但是我们却不能说敌人是一个精灵,因为精灵只是敌机类中的一个属性。

    下面我们来创建一个精灵,创建精灵的方式不止一种,最简单的方式就是直接用一张图片素材来创建一个精灵:

     CCSprite * sprite = CCSprite::create("CloseNormal.png");     //用一张名为CloseNormal的png格式图片创建一个精灵对象sprite

     CCSize size =CCDirector::sharedDirector()->getWinSize();  //获得屏幕的大小 

     sprite->setPosition(ccp(size.width/2,size.height/2));            //设置精灵的位置,我们将位置设置成了屏幕的中间,即x,y分别为宽,高的一半。ccp(x,y)是一个宏,类似于CCRectMake

     this->addChild(sprite);                                                       //将精灵添加到层上

1.4 九妹和按钮控件   

     九妹CCScale9Sprite 实际上只是图片的一种,可以支持任意拉伸,最大程度的避免失真,为开发者节省资源与空间。

     Cocos2d-x里面的按钮是CCControlButton,而我们在HelloWorld里面看到的右下角的那个按钮实际上是一个菜单 CCMenu。

     在使用CCScale9Sprite和CCControlButton之前,我们需要引入一个头文件cocos-ext.h,并使用extension命名空间:

     #include "cocos-ext.h"

     using namespace cocos2d::extension;

     下面来看一下九妹和按钮的搭配使用,代码如下:

     CCScale9Sprite * btnNormal =CCScale9Sprite::create("button.png");  //创建一个正常状态下的按钮图片

     CCScale9Sprite * btnClickDown =CCScale9Sprite::create("buttonHighlighted.png"); //单机状态下的按钮图片

     CCLabelTTF * title =CCLabelTTF::create("Button","Ok",30); //创建一个标签作为按钮标题

     CCControlButton * controlBtn=CCControlButton::create(title,btnNormal); //创建按钮,按钮的大小会根据标题自动调整

     controlBtn->setBackgroundSpriteForState(btnClickDown,CCControlStateSelected); //设置按钮按下时的图片

     controlBtn->setPosition(ccp(200,200));//设置按钮位置

     this->addChild(controlBtn);//将按钮添加到层上

     此时的运行项目后我们已经可以看到屏幕上的按钮,但是点击按钮之后并不会执行任何事件,如果想实现按钮的单击事件,我们就需要给CCControlButton添加一个事件监听 

     controlBtn->addTargetWithActionForControlEvents(this,cccontrol_selector(HelloWorld::touchDown),CCControlEventTouchDown);

     这段代码的作用是,当点击按钮时,会执行touchDown函数,该函数需要手动添加,在HelloWorld.h文件中

     void touchDown(CCObject * pSender,CCControlEvent event);

     HelloWorld.cpp文件中实现这个函数

     void HelloWorld::touchDown(CCObject * pSender,CCControlEvent event){          

     CCLOG("touchDown");  //在屏幕上打印touchDown

}


     在下一节内容中我们将以一个时钟的例子展开讲解。

Cocos2d-x教程(1)-让我们来学习一些传说中的概念

该文章适合所有想学Cocos2d-x的朋友,但最适合的人群是游戏开发经验及Cocos2d-x使用经验不多的朋友。 1.1 我的Cocos2d-x版本        笔者在写这边文章时,最新...
  • houjun1988325
  • houjun1988325
  • 2014年09月22日 16:50
  • 259

Cocos2d-x教程(1)-让我们来学习一些传说中的概念

该文章适合所有想学Cocos2d-x的朋友,但最适合的人群是游戏开发经验及Cocos2d-x使用经验不多的朋友。 1.1 我的Cocos2d-x版本        笔者在写这边文章时,最新的Cocos...
  • u012945598
  • u012945598
  • 2013年11月25日 11:05
  • 4671

BLE-NRF51822教程1-常用概念

1:主机如何知道外围设备的存在:          外围设备广播信息。 主机主动扫描,外围设备回复扫描响应以告知主机。 2:可发现模式:由广播中的flag标志设置。          有限可发...
  • kiasur
  • kiasur
  • 2016年03月09日 10:06
  • 632

【2556】传说中的数据结构 sdutOJ

 传说中的数据结构 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述       在大学...
  • jiangyongy
  • jiangyongy
  • 2014年08月11日 15:28
  • 514

让我们从机器学习谈起

让我们从机器学习谈起 导读:在本篇文章中,将对机器学习做个概要的介绍。本文的目的是能让即便完全不了解机器学习的人也能了解机器学习,并且上手相关的实践。当然,本文也面对一般读者,不会对...
  • u013521220
  • u013521220
  • 2017年03月14日 15:26
  • 222

cocos2d-x中的一些概念

cocos2d-x,导演类,场景类,层,精灵,
  • zcl1804742527
  • zcl1804742527
  • 2016年09月02日 17:19
  • 93

读书、学习是为了让我们成为更出色的人同时做自己喜欢的事

前天第一次上算法设计与分析这门课,老师一开始没有给我们讲课程的大纲。而是从读书、好奇心、教育等话题谈起。 孩子,我要求你读书用功,不是因为我要你跟别人比成绩,而是因为,我希望你将来会拥有选择的权利,选...
  • zpf_nevergiveup
  • zpf_nevergiveup
  • 2017年02月23日 11:24
  • 336

RFID学习(一)概念、分类

现代社会智能卡已经渗透到生活的方方面面,公交卡、考勤卡、身份证、手机卡等等数不胜数。     智能卡按使用时是否和读卡器接触可分为接触式智能卡和非接触式智能卡,接触式智能卡上有6-8个触点,使用时插...
  • zhouqiyao2009
  • zhouqiyao2009
  • 2014年07月24日 14:40
  • 508

PAT-B 1007. 素数对猜想

题目内容: 让我们定义 dnd_n 为:dn=pn+1−pnd_n = p_{n+1} - p_n,其中 pip_i 是第ii个素数。显然有 d1=1d_1=1 且对于n>1n>1有 d...
  • plank_root
  • plank_root
  • 2016年04月27日 19:24
  • 374

机器学习基本概念-1

Learning algorithmML中的算法无疑都是学习型的算法,那么什么才是学习型算法(learning algorithm)呢? 机器学习大牛Bengio给出的解释是: A m...
  • Gavin__Zhou
  • Gavin__Zhou
  • 2016年08月27日 23:13
  • 1197
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Cocos2d-x教程第(1)讲-让我们来学习一些传说中的概念
举报原因:
原因补充:

(最多只允许输入30个字)