首页 > 代码库 > cocos2d制作时钟
cocos2d制作时钟
http://blog.csdn.net/u012945598/article/details/16946283
总结:一个SCENE,三个LAYER代表三个指针,每个LAYER加载一个精灵(实际图片)
大多数情况都是background申明成一个layer,在background里面建立一个新的SCENE返回给主函数。
本人通过将background设置成scene,背景图片用一个精灵来表示,然后将精灵直接加到这个scene中。addchild的参数都是node,而layer和scene都是node的子类,因此加载到背景和场景都一回事。
同时,三个指针时、分、秒也可以作为精灵直接加载到scene中。
但是个人觉得几乎所有情况还是把精灵放在布景里面处理,布景多了一个触屏等动作处理函数。
auto* scene = clockBackgroundScene::create();
// run
director->runWithScene(scene);
create函数会自动调用init,因此只需要重写子类clockBackgroundScene的init即可
//// clockBackgroundScene.h// Clock_1//// Created by mzy1992 on 13-11-25.////#ifndef __Clock_1__clockBackgroundScene__#define __Clock_1__clockBackgroundScene__#include <iostream>#include "cocos2d.h"#include "hourHand.h"#include "secondHand.h"#include "minuteHand.h"USING_NS_CC;class clockBackgroundScene : public CCLayer{public: virtual bool init(); static CCScene * scene(); //创建场景对象的方法 CREATE_FUNC(clockBackgroundScene); void MutUpdate(float aa);//自定义的update函数public: hourHand * m_hour; //创建hourHand类的对象 minuteHand * m_minute; secondHand * m_second;public: int nHour; //当前的系统时间 int nMinute; int nSecond;};#endif /* defined(__Clock_1__clockBackgroundScene__) */
//// clockBackgroundScene.cpp// Clock_1//// Created by mzy1992 on 13-11-25.////#include "HelloWorldScene.h"CCScene * clockBackgroundScene::scene(){ clockBackgroundScene * layer = clockBackgroundScene::create(); CCScene * scene = CCScene::create(); scene->addChild(layer); return scene;}bool clockBackgroundScene::init(){ CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //获取屏幕大小 CCSprite * clockBk = CCSprite::create("background.jpg"); //创建一个精灵 clockBk->setPosition(ccp(winSize.width / 2, winSize.height / 2));//设置背景精灵的坐标 clockBk->setScale(0.5f); //将精灵缩小为原来的0.5倍 this->addChild(clockBk); //将时钟背景添加到屏幕上 m_minute = minuteHand::create(); //创建分针对象// m_minute->bindSprite(CCSprite::create("fen.png"));//初始化也可以放在m_minute的init方法内// m_minute->setPosition(ccp(winSize.width / 2, winSize.height / 2)); this->addChild(m_minute); m_second = secondHand::create(); m_second->bindSprite(CCSprite::create("miao.png")); m_second->setPosition(ccp(winSize.width / 2, winSize.height / 2)); this->addChild(m_second); m_hour = hourHand::create(); //创建时针对象 m_hour->bindSprite(CCSprite::create("shi.png")); //调用hourHand类中的bindSprite方法绑定精灵对象 m_hour->setPosition(ccp(winSize.width / 2, winSize.height / 2)); this->addChild(m_hour); //获取当前的系统时间 struct tm *tm; time_t timep;#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) time(&timep);#else struct timeval tv; gettimeofday(&tv, NULL); timep = tv.tv_sec;#endif tm = localtime(&timep); nHour = tm->tm_hour; nMinute = tm->tm_min; nSecond = tm->tm_sec; // CCLog("%d-%d-%d", nHour, nMinute, nSecond); //打印出来对比一下获取的时间是否有误// nHour = 12; //当前时// nMinute = 5; //当前分// nSecond = 5; //当前秒 this->schedule(schedule_selector(clockBackgroundScene::MutUpdate), 1.0f); //每隔一秒钟调用一次MutUpdate方法 return true;}void clockBackgroundScene::MutUpdate(float aa){ static int mRotation = nMinute * 6; //分针初始角度 static int sRotation = nSecond * 6; //秒针初始角度 static int hRotatio; /*小时的计数不同于分和秒,分和秒一个周期都是60,而小时数在一天之中是从1-24,我们需要将获取到的时间先转换 成12时制,再将其按照比例变成60为周期的数,即给当前小时*5 */ if (nHour>12){ //当 当前时间大于上午12点时 hRotatio = (nHour - 12) * 5 * 6 + (mRotation / 72) * 6; /*将其转换成12时制 并*5变成以60为周期的数,因为60对应360度,所以应换算成度数应再*6, 换算完成后还应该加上分针走过的偏转角,由于分针走360度,时针走30度,所以分针每走72度时针走6度*,故用分针旋转角除以72后再乘以6 */ } else{ //当前时间小于或等于12点 hRotatio = (nHour)* 5 * 6 + (mRotation / 72) * 6; } m_second->setRotation(sRotation); //重新设置秒针的位置,另其角度顺时针旋转6度,即走一秒钟 m_minute->setRotation(mRotation); //重置分针位置 m_hour->setRotation(hRotatio); //重置时针位置 if (sRotation >= 360){ //当秒针走了一圈(360度)时 sRotation = 0; //秒针旋转角归零 mRotation += 6; //分针转6度,即走了一分钟 m_minute->setRotation(mRotation); //重置分针指针位置 if (mRotation % 72 == 0){ //每当分针转到72的倍数时 hRotatio += 6; //时针转六度 m_hour->setRotation(hRotatio); //重置时针位置 if (mRotation >= 360){ //当分针转了一圈时 mRotation = 0; //分针旋转角归零 } } } sRotation += 6;}
hourhand.h:
#ifndef __Clock_1__hourHand__#define __Clock_1__hourHand__#include <iostream>#include "cocos2d.h"USING_NS_CC;class hourHand :public CCLayer{public: virtual bool init(); CREATE_FUNC(hourHand); CCSprite * getSprite(); //获取精灵对象 void bindSprite(CCSprite * sprite); //绑定精灵对象private: CCSprite * m_sprite;};#endif /* defined(__Clock_1__hourHand__) */
//// hourHand.cpp// Clock_1//// Created by mzy1992 on 13-11-25.////#include "hourHand.h"CCSprite * hourHand::getSprite(){ return this->m_sprite;}void hourHand::bindSprite(CCSprite * sprite){ m_sprite = sprite; m_sprite->setAnchorPoint(ccp(0, 0.5)); /*设置精灵锚点为(0,0.5),因为默认锚点为(0.5,0.5)是指针的中心,但是指针旋转时并不是沿着 中心旋转的,而是以它的尾部重点旋转,所以需要更改他的锚点为x是0,y是0.5,即宽的一半*/ m_sprite->setScale(0.2f); //将精灵大小扩大0.2倍 m_sprite->setRotation(-90); //将精灵逆时针旋转90度 因为时针初始方向是指向3的,旋转后让他指向12 this->addChild(m_sprite); //将精灵添加到当前层}bool hourHand::init(){ return true;}
cocos2d制作时钟
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。