Cocos2D-X learning 3 (CCScene and CCMenu)

废话

本来部门计划今天下午全部门去搞团建的,主要活动是开卡丁车、桌游等项目,可惜天不从人愿,早晨有点下雨,好不容易盼到中午晴天,结果Leader又一个通知,说今天事情太多,活动改期到下周了,我勒个去的,废话不多说,进去正题。

概述

今天练习的内容主要是在Cocos2D开发中,对菜单的运用以及场景切换,中间还涉及到对于CCSprite对象的一些操作和schedule的简单应用。

正文

首先用create_project.py建立一个基础项目,然后分别建立两个CCLayer的子类。

StudyCocos2D.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//
// StudyCocos2D.h
// StudyCocos2D
//
// Created by Toby Lee on 14-3-28.
//
//

#ifndef __StudyCocos2D__StudyCocos2D__
#define __StudyCocos2D__StudyCocos2D__

#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;

class StudyCocos2D: public CCLayer {
private:
void onStartClick(CCObject *obj);
public:
static CCScene * scene();
virtual bool init();
CREATE_FUNC(StudyCocos2D);
};

#endif /* defined(__StudyCocos2D__StudyCocos2D__) */

这是一个最简单的头文件,相比上一篇只多了一个私有方法void onStartClick(CCObject *obj),其作用后面再说明。

StudyCocos2D.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//
// StudyCocos2D.cpp
// StudyCocos2D
//
// Created by Toby Lee on 14-3-28.
//
//

#include "StudyCocos2D.h"
#include "RotatingIcon.h"

CCScene * StudyCocos2D::scene()
{
CCScene *scene = CCScene::create();
CCLayer *layer = StudyCocos2D::create();
scene->addChild(layer);

return scene;
}

bool StudyCocos2D::init()
{
if (!CCLayer::init()) {
return false;
}
CCMenuItemFont *menuItem = CCMenuItemFont::create("START GAME", this, menu_selector(StudyCocos2D::onStartClick));

CCMenu *menu = CCMenu::create(menuItem, NULL);
this->addChild(menu);

return true;
}

void StudyCocos2D::onStartClick(cocos2d::CCObject *obj)
{
CCScene *iconScene = RotatingIcon::scene();
iconScene->autorelease();
CCDirector::sharedDirector()->replaceScene(iconScene);
}

以上代码生成场景如下
场景1

StudyCocos2D::init()方法中完成了建立,菜单项的工作,使用CCMenuItemFont类建立一个基于文字的菜单,在CCMenuItemFont::create(const char *, CCObject, selector)方法中完成了一个文字菜单项的建立,第一个参数是显示在菜单中的文字,第二个参数是作用于哪一个对象,第三个则是指定响应触发动作的方法。
void StudyCocos2D::onStartClick(CCObject *obj)方法完成了点击菜单后的操作,首先建立从RotatingIcon类中创建一个场景,然后用CCDirector::replaceScene(CCScene *)方法将显示的场景替换成新的场景。
iconScene->autorelease()方法的调用,会使本场景不在使用时自动释放。

RotatingIcon.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//
// RotatingIcon.h
// StudyCocos2D
//
// Created by Toby Lee on 14-3-28.
//
//

#ifndef __StudyCocos2D__RotatingIcon__
#define __StudyCocos2D__RotatingIcon__

#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;

class RotatingIcon: public CCLayer {
private:
void rotatingIcon(float t);
public:
static CCScene * scene();
virtual bool init();
CREATE_FUNC(RotatingIcon);
};

#endif /* defined(__StudyCocos2D__RotatingIcon__) */
RotatingIcon.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//
// RotatingIcon.cpp
// StudyCocos2D
//
// Created by Toby Lee on 14-3-28.
//
//

#include "RotatingIcon.h"

CCScene * RotatingIcon::scene()
{
CCScene *scene = CCScene::create();
CCLayer *layer = RotatingIcon::create();
scene->addChild(layer);
return scene;
}

bool RotatingIcon::init()
{
if (!CCLayer::init()) {
return false;
}

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

CCSprite *icon = CCSprite::create("Icon-72.png");
icon->setPosition(ccp(winSize.width/2, winSize.height/2));
this->addChild(icon);

schedule(schedule_selector(RotatingIcon::rotatingIcon));
return true;
}

void RotatingIcon::rotatingIcon(float t)
{
CCArray *childNodes = this->getChildren();
if (childNodes->count() > 0) {
CCSprite *icon = (CCSprite *)childNodes->objectAtIndex(0);
icon->setRotation(icon->getRotation() + 1);
}
}

场景2
这里声明并定义了RotatingIcon类,在此类中需要说明的是,在Cocos2D中,精灵的锚点在该精灵的中心,如一个包含图片的CCSprite对象,在没有明确设置锚点及坐标时,会显示在场景的左下角,且只显示四分之一,因此,对于精灵对象一般都需要明确指定其坐标。
在以上的代码中,使用CCDirector::getWinSize()得到游戏显示区域的大小,之后就可以在下面的ccp(winSize.width/2, winSize.height/2)中计算出场景的中心,经过此设置后,图片将显示在整个场景的中心,其中ccp(__X__, __Y__)是一个宏,这个宏可以用来产生一个CCPoint对象。
schedule定义了一个执行计划,在以上代码中的调用方式,可以在程序在每一帧都执行一次指定的方法。
void RotatingIcon::rotatingIcon(float t)方法中,程序首先获取当前场景的子元素,此调用将返回一个CCArray对象。在获取到第一个子元素后,直接对该元素的旋转角度进行加1的操作,以实现图标不间断旋转的功能。

最后,在AppDelegate.cpp文件中,将建立场景的那一行代码修改为CCScene *pScene = StudyCocos2D::scene();

结束

今天练习的内容非常简单,就是实现了菜单、场景切换和图标定位及旋转的功能,这些都是基础的概念和元素,需要很好的掌握其用法。