使用cocos制作一个简易的小闹钟
本文转载至 学习使用Cocos制作《闹钟》
使用的引擎版本是cocos2.1
具体开发过程指导
(1)Cocos Studio部分
1.打开Cocos工具,新建一个项目:
2.设置好相关的配置,点击完成,从而发布到Cocos Studio中:
3.Cocos Studio IDE介绍:
左上角的是开发常用的游戏元素、UI控件、容器等,可以像VS2013一样拖拽,并在右边设置对应的属性;左下角是资源导入,可以导入所需的图片背景;下面是时间戳,用于设置基于时间戳的动画,在Cocos2dx模板中默认是FPS=60。
4.导入下载的资源,一般我们只导入图片即可:
5.给场景添加精灵节点:
6.添加好相关的精灵到Clock节点中:
7.设置时针分针秒针的锚点重合:
8.保存clock.csd节点设计文件,返回到MainScene.csd中,把clock.csd节点拖动到合适的位置,并且设置其在MainScene.csd中的名称:
9.保存所有设计文件(*.csd),然后将其发布到VS2013中:
10.点击确定,打开VS2013工程,但是不要关闭CocosStudio工程:
(2)VS2013结合Cocos Studio部分
HelloWorld.h代码:
1 #ifndef __HELLOWORLD_SCENE_H__ 2 #define __HELLOWORLD_SCENE_H__ 3 4 #include "cocos2d.h" 5 6 class HelloWorld : public cocos2d::Layer 7 { 8 9 private: 10 // 获取 时、分、秒 的精灵对象 11 cocos2d::Sprite* hour; 12 cocos2d::Sprite* minute; 13 cocos2d::Sprite* second; 14 15 // 获取节点 16 cocos2d::Node* seekFromRootByName(cocos2d::Node* root, std::string& name); 17 18 public: 19 // there's no 'id' in cpp, so we recommend returning the class instance pointer 20 static cocos2d::Scene* createScene(); 21 22 // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone 23 virtual bool init(); 24 25 // implement the "static create()" method manually 26 CREATE_FUNC(HelloWorld); 27 28 void timeChanged(float dt); 29 30 }; 31 32 #endif // __HELLOWORLD_SCENE_H__
HelloWorld.cpp代码:
1 #include "HelloWorldScene.h" 2 #include "cocostudio/CocoStudio.h" 3 #include "ui/CocosGUI.h" 4 // 添加声音 5 #include "SimpleAudioEngine.h" 6 7 using namespace CocosDenshion; 8 9 USING_NS_CC; 10 11 using namespace cocostudio::timeline; 12 13 Scene* HelloWorld::createScene() 14 { 15 // 'scene' is an autorelease object 16 auto scene = Scene::create(); 17 18 // 'layer' is an autorelease object 19 auto layer = HelloWorld::create(); 20 21 // add layer as a child to scene 22 scene->addChild(layer); 23 24 // return the scene 25 return scene; 26 } 27 28 // on "init" you need to initialize your instance 29 bool HelloWorld::init() 30 { 31 ////////////////////////////// 32 // 1. super init first 33 if ( !Layer::init() ) 34 { 35 return false; 36 } 37 38 auto rootNode = CSLoader::createNode("MainScene.csb"); 39 40 addChild(rootNode); 41 42 // 获取 时、分、秒 的精灵对象 43 hour = dynamic_cast<Sprite*>(seekFromRootByName(rootNode, std::string("h"))); 44 minute = dynamic_cast<Sprite*>(seekFromRootByName(rootNode, std::string("m"))); 45 second = dynamic_cast<Sprite*>(seekFromRootByName(rootNode, std::string("s"))); 46 47 // 设置调度器,每1秒运行一次 48 schedule(schedule_selector(HelloWorld::timeChanged), 1.0); 49 50 return true; 51 } 52 53 Node* HelloWorld::seekFromRootByName(Node* root, std::string& name){ 54 55 if (!root){ // 如果节点为空,则返回空指针 56 return nullptr; 57 } 58 if (root->getName() == name){ // 如果root的名字是要找的节点的名字,则返回节点 59 return root; 60 } 61 62 // 获取所有子节点 63 const auto& arrayNode = root->getChildren(); 64 65 // 遍历子节点的数组 66 for (auto& child : arrayNode){ 67 // 将child转换为Node指针,dynamic_cast运算符可以在执行期决定真正的类型 68 Node* pNode = dynamic_cast<Node*>(child); 69 if (pNode){ // 判断是否为空,不为空执行以下代码 70 Node* res = seekFromRootByName(pNode, name); // 递归调用此函数 71 if (res) 72 return res; // 返回此节点 73 } 74 } 75 return nullptr; // 返回空指针 76 } 77 78 void HelloWorld::timeChanged(float dt){ 79 80 static int cnt = 0; 81 // 获取 时、分、秒 的角度 82 static float h = hour->getRotation(); 83 static float m = minute->getRotation(); 84 static float s = second->getRotation(); 85 86 s += 6.0; // 秒针每秒走了6.00° 87 m += 0.1; // 分针每秒走了0.1° 88 cnt = ++cnt % 12; // 让 cnt 在 1 - 12 中循环 89 if (cnt == 0){ 90 h += 0.1; // 时针每12秒走0.1° 91 hour->setRotation(h); // 改变时针的角度 92 } 93 minute->setRotation(m); // 改变分针的角度 94 second->setRotation(s); // 改变秒针的角度 95 96 // 播放音效 97 SimpleAudioEngine::getInstance()->playEffect("clock.mp3"); 98 99 }