关闭

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

527人阅读 评论(0) 收藏 举报
分类:

 该文章适合所有想学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

}


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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:354384次
    • 积分:4691
    • 等级:
    • 排名:第6619名
    • 原创:28篇
    • 转载:519篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论