废话
本来部门计划今天下午全部门去搞团建的,主要活动是开卡丁车、桌游等项目,可惜天不从人愿,早晨有点下雨,好不容易盼到中午晴天,结果Leader又一个通知,说今天事情太多,活动改期到下周了,我勒个去的,废话不多说,进去正题。
概述
今天练习的内容主要是在Cocos2D开发中,对菜单的运用以及场景切换,中间还涉及到对于CCSprite对象的一些操作和schedule的简单应用。
正文
首先用create_project.py
建立一个基础项目,然后分别建立两个CCLayer的子类。
StudyCocos2D.h1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
#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
|
这是一个最简单的头文件,相比上一篇只多了一个私有方法void onStartClick(CCObject *obj)
,其作用后面再说明。
StudyCocos2D.cpp1 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
|
#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); }
|
以上代码生成场景如下
StudyCocos2D::init()
方法中完成了建立,菜单项的工作,使用CCMenuItemFont
类建立一个基于文字的菜单,在CCMenuItemFont::create(const char *, CCObject, selector)
方法中完成了一个文字菜单项的建立,第一个参数是显示在菜单中的文字,第二个参数是作用于哪一个对象,第三个则是指定响应触发动作的方法。
void StudyCocos2D::onStartClick(CCObject *obj)
方法完成了点击菜单后的操作,首先建立从RotatingIcon
类中创建一个场景,然后用CCDirector::replaceScene(CCScene *)
方法将显示的场景替换成新的场景。
iconScene->autorelease()
方法的调用,会使本场景不在使用时自动释放。
RotatingIcon.h1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
#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
|
RotatingIcon.cpp1 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
|
#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); } }
|
这里声明并定义了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();
。
结束
今天练习的内容非常简单,就是实现了菜单、场景切换和图标定位及旋转的功能,这些都是基础的概念和元素,需要很好的掌握其用法。