使用cocos制作一个简易的小闹钟

使用cocos制作一个简易的小闹钟

本文转载至 学习使用Cocos制作《闹钟》

使用的引擎版本是cocos2.1

具体开发过程指导

(1)Cocos Studio部分

1.打开Cocos工具,新建一个项目:

闹1.jpg

2.设置好相关的配置,点击完成,从而发布到Cocos Studio中:

闹2.jpg

3.Cocos Studio IDE介绍:

闹3.jpg

左上角的是开发常用的游戏元素、UI控件、容器等,可以像VS2013一样拖拽,并在右边设置对应的属性;左下角是资源导入,可以导入所需的图片背景;下面是时间戳,用于设置基于时间戳的动画,在Cocos2dx模板中默认是FPS=60。

4.导入下载的资源,一般我们只导入图片即可:

闹4.jpg

闹5.jpg

闹6.jpg

5.给场景添加精灵节点:

闹7.jpg

闹8.jpg

6.添加好相关的精灵到Clock节点中:

闹9.jpg

7.设置时针分针秒针的锚点重合:

闹10.jpg

8.保存clock.csd节点设计文件,返回到MainScene.csd中,把clock.csd节点拖动到合适的位置,并且设置其在MainScene.csd中的名称:

闹11.jpg

9.保存所有设计文件(*.csd),然后将其发布到VS2013中:

闹12.jpg

10.点击确定,打开VS2013工程,但是不要关闭CocosStudio工程:

闹13.jpg


(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 }
原文地址:https://www.cnblogs.com/dudu580231/p/4531012.html