• 使用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 }
  • 相关阅读:
    C++ 值传递、指针传递、引用传递
    typedef与#define的区别
    const与#define的区别
    头文件重复引用
    多态
    ng双向数据绑定
    angular响应式编程
    angular的一些问题
    npm install 权限的问题
    typescript的入门
  • 原文地址:https://www.cnblogs.com/dudu580231/p/4531012.html
Copyright © 2020-2023  润新知