学了这么久Cocos2d-X,今天终于可以做出一个简单的小游戏了,游戏非常简单,通过菜单项控制精灵运动
在做游戏前,先学一个新概念
调度器(scheduler):
Cocos2d-x调度器为游戏提供定时事件和定时调用服务。所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处:
- 每当Node不再可见或已从场景中移除时,调度器会停止。
- Cocos2d-x暂停时,调度器也会停止。当Cocos2d-x重新开始时,调度器也会自动继续启动。
- Cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险。
使用调度器时用到的一些函数:
// 让帧循环调用this->update(float dt)函数
// scheduleUpdate();
// 让帧循环去调用制定的函数,时间还是1/60秒
// schedule(schedule_selector(T19Update::MyScheduleFunc));
// 定时器,每隔2秒调用T19Update::MyScheduleFunc函数
// schedule(schedule_selector(T19Update::MyScheduleFunc),2.0f);
// 有限次数的定时器,当次数定义得很大时,也认为是无限的,实际次数是制定参数的+1
schedule(schedule_selector(T19Update::MyScheduleFunc),1.0f,3,2.0f);
// 只调度一次的定时器
// scheduleOnce(schedule_selector(T19Update::MyScheduleFunc),5.0f);
// 停止一个以参数为回调函数的定时器
unschedule(schedule_selector(T19Update::MyScheduleFunc));
// 停止update调度
unscheduleUpdate();
// 停止所有的调度
unscheduleAllSelectors();
熟悉了调度器的概念后就开始我们今天的重头戏,一个简单的游戏
然后定义一个Update类
#ifndef _Update_H_ #define _Update_H_ #include "cocos2d.h" USING_NS_CC; class Update : public CCLayer { public: static CCScene* scene(); CREATE_FUNC(Update); bool init(); void update(float dt); CCSprite* _sprite; void Handle(CCObject* sender); //表示方向 int _direction; //窗口的大小 CCSize winSize; }; #endif
#include "Update.h" CCScene* Update::scene() { CCScene* s = CCScene::create(); Update* layer = Update::create(); s->addChild(layer); return s; } bool Update::init() { //初始化父类 CCLayer::init(); //得到窗口的大小 winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标 CCPoint center = ccp(winSize.width / 2,winSize.height / 2); //让帧循环调用this->update(float dt)函数 scheduleUpdate(); //创建精灵 _sprite = CCSprite::create("green_edit.png"); addChild(_sprite); //设置精灵的位置 _sprite->setPosition(center); //创建菜单项 CCMenuItemFont* up = CCMenuItemFont::create("up",this,menu_selector(Update::Handle)); CCMenuItemFont* down = CCMenuItemFont::create("down",menu_selector(Update::Handle)); CCMenuItemFont* left = CCMenuItemFont::create("left",menu_selector(Update::Handle)); CCMenuItemFont* right = CCMenuItemFont::create("right",menu_selector(Update::Handle)); CCMenuItemFont* Stop = CCMenuItemFont::create("Stop",menu_selector(Update::Handle)); //创建菜单 CCMenu* menu = CCMenu::create(up,down,left,right,Stop,NULL); addChild(menu); //对齐菜单项 menu->alignItemsVertically(); //设置菜单项的ID up->setTag(1); down->setTag(2); left->setTag(3); right->setTag(4); Stop->setTag(0); //标记方向 _direction = -1; return true; } void Update::Handle(CCObject* sender) { CCNode* node = (CCNode*)sender; //得到菜单项的ID,ID对应的是精灵移动的方向 _direction = node->getTag(); } void Update::update(float dt) { // _direction == 1表示精灵向上移动 if(1 == _direction) { //精灵向上移动 //50表示一秒钟移动50个像素 _sprite->setPositionY(_sprite->getPositionY() + dt * 100); } // _direction == 2表示精灵向下移动 if(2 == _direction) { //精灵向下移动 //50表示一秒钟移动50个像素 _sprite->setPositionY(_sprite->getPositionY() - dt * 100); } // _direction == 3表示精灵向左移动 if(3 == _direction) { //精灵向左移动 //50表示一秒钟移动50个像素 _sprite->setPositionX(_sprite->getPositionX() - dt * 100); } // _direction == 4表示精灵向右移动 if(4 == _direction) { //精灵向右移动 //50表示一秒钟移动50个像素 _sprite->setPositionX(_sprite->getPositionX() + dt * 100); } // _direction == 4表示精灵停止移动 if(0 == _direction) { } }
执行结果: