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;
}
时间: 2025-01-18 02:34:38

cocos2d制作时钟的相关文章

如何利用iframe标签以及Javascript制作时钟?

如何利用iframe标签以及Javascript制作时钟? 如何制作一个时钟呢?效果如下图所示: 这里的时钟会不停的走,但是下面的页面是不会变得,这样就实现了我们想要的效果了.下面我将分为以下几个方面来讲: javascript中的Date引用类型 几种效果不佳的实例 <iframe>标签 最终效果不错的实例 如果大家想直接看最终不错的效果实例,可以直接点击这里. 第一部分:Date引用类型 1.日期对象可以直接使用new操作符和Date构造函数构造.代码如下: 1 var date=new

如何用iframe标签以及Javascript制作时钟?

如何利用iframe标签以及Javascript制作时钟? 如何制作一个时钟呢?效果如下图所示: 这里的时钟会不停的走,但是下面的页面是不会变得,这样就实现了我们想要的效果了.下面我将分为以下几个方面来讲: javascript中的Date引用类型 几种效果不佳的实例 <iframe>标签 最终不错的效果实例 如果大家想直接看最终不错的效果实例,可以直接点击这里. 第一部分:Date引用类型 1.日期对象可以直接使用new操作符和Date构造函数构造.代码如下: var date=new Da

cocos2d 制作fnt 批量缩放png ios 批量制作图标 gamedevkit 支持windows, mac

0.制作了一个简单软件 这个软件有4个功能: 批量缩放png图片 根据美术给的数字小图等,制作fnt字体文件供cocos2d使用 批量制作ios 图标和android 图标(只需传入一张图片) 截图制作,传入5张IPhone6+的截图,生成IPhone5,IPhone6的截图(这个功能没什么用,不过当你个人开发制作20+个游戏的时候,就能省点力) 下面是具体功能介绍...当然这个软件暂定为收费. 1. cocos2d 制作fnt 文件 2.批量缩放png图片 我之前蛋疼地做了一个游戏,使用了两套

css3制作时钟

制作时钟之前需要了解几点知识: 一.圆上点坐标的计算 二.时钟上时针.分针.秒针的换算 我们观察一下时钟,首先想到的是与角度有关.再有是,秒针,分针,时针之间的进位关系. 比如说h时m分s秒,时针.分针.秒针此时此刻的角度:(-90,是因为rotateZ角度旋转规则,默认是从水平开始,逆时针为+,顺时针为-) ds  =  s*6-90; dm =  m*6+(s/60*6)-90; dh  =  h*30+(m/60*30)-90; 我们都知道1s = 1 / 60min,1min = 1 /

89canvas制作时钟

这是用HTML5的canvas制作的一个钟表,包含表盘.时针.分针.秒针及它们的运动:另外还添加了自动读时间的功能.```html:run<!doctype html><html><head> <style> #clock{ display:block; background:url("") no-repeat; margin: 0 auto; } </style></head><body><ca

JavaScript制作时钟特效

需求说明:制作显示年.月.日.星期几并且显示上午(AM)和下午(PM)的 12进制的时钟,具体效果如下所示: 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <meta http-equiv="Content-Type" content="text/h

(C/C++学习)12.获取系统时间制作时钟

说明:通过调用函数来获取系统当前时间,并制作一个数字式的时钟,时钟的显示包括年.月.日.小时.分以及秒,通过系统屏幕的刷新来对不断更新的时间进行屏幕的显示. 一.对相关函数的学习 1.time_t time(time_t *second): a.头文件:<time.h> b.该函数返回自纪元1970-01-01 00:00:00 起经过的秒数,这是一个很大的数,若 second 不为NULL,则返回值将自动存储在该指针中. 注意:此处的 time_t 以及 __time32_t 都是 long

利用JS函数制作时钟运行程序

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>时钟</title> <script type="text/javascript"> function toDouble(num)//不满两位,空位补零 { if(num<10) { return '0'+num;//一

canvas 制作时钟效果

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABuQAAAM7CAYAAACyYvapAAAgAElEQVR4AezdCXhcV3338b8s2ZIty/IiO3a8xY4dExIHQslKQmIoCZAQSGhfytuylEBbCoUWKCnQt4hSlgClLVASCoSdAkkckhDIQnBC9jgbcRbifbdsy7KtzZYsS+9zZMY+Gt2Ze+fOOf+5c+93niePztw55/8753POyEI