cocos2d-html5版日历组件
根据一as3版本给改编成成了js版的。as3版本的地址: http://download.csdn.net/detail/fengye513/2722289
胜利项目做的差不多了,由于项目用的是c++,并没有动态更新逻辑的需求,所以也就没有写什么js或者lua脚本,全部c++,涉及到付费或者分享之类特殊处理,objc和java还是写了不少。话不多说,现在游戏里增加了一个会不定期更新的活动模块,逻辑部分和UI部分都会实事改动,一开始想要写lua,但是由于引擎版本差异,引擎代码被改动过等原因,放弃了lua binding的方式,于是就用到了webView这个东东,直接嵌入页面到游戏中,搞定了objc与js互调,java与js互调之后,利用cocosx-html5引擎开些了。
活动嘛,少不了签到,签到,肯定是在日历上签咯。
共三个类,类名没怎么改,还是用as那老兄的命名
DayObject :日历上每一天的数据
DateShape : 日历上每一天的视图
SuperCalendar : 日历容器 new一个SuperCalendar并addChild到你想要它出现的地方,然后调用setData()方法传递年,月,日,就可以了,
支持跳月,跳年就没写了,如果你需要的话可以看看原本的as代码里有。
上代码:
/**
* @anthor JiaDing
*
*/ var DayObject = cc.Class.extend({ innerText:null,//几号
isToady:false,//是否是当天
isMark:false,//是否签到 init:function ()
{ return true; } }); DayObject.create = function()
{
var obj = new DayObject();
if(obj && obj.init())
{
return obj;
}
return null;
};
/**
* @anthor JiaDing
*
*/ var DateShape = cc.Sprite.extend({ _label:null,
_lis:null,
_Obj:null, init:function (val)
{
var ready = false;
if (this._super())
{
// winSize = cc.Director.getInstance().getWinSize(); this._lis = [];
this._Obj = val; var markInfo = null;
if(this._Obj.isMark)
{
markInfo = "(已签)";
}
else
{
markInfo = "(未签)";
}
this._label = cc.LabelTTF.create(this._Obj.innerText+markInfo, "Arial", 25); if(this._Obj.isToady)
{
this._label.setColor(cc.c3b(255,0,0));
}
else
{
this._label.setColor(cc.c3b(255,255,255));
} this.addChild(this._label); ready = true;
}
return ready; } }); DateShape.create = function(val)
{
var shape = new DateShape();
if(shape && shape.init(val))
{
return shape;
}
return null;
}; DateShape.prototype.remove = function()
{
this.removeAllChildren(true);
this._label = null;
this._lis = null; }
/**
* @anthor JiaDing
*
*/ var SuperCalendar = cc.Layer.extend({ daysMonth:null,
thisYear:0,
thisMonth:0,
thisDay:0,
day:null,
dayObj:null,
dateSprite:null, inputDate:null,
today:null,
todayTitleInfo:null, init:function ()
{
var bRet = false;
if (this._super())
{ this.daysMonth = [31,28,31,30,31,30,31,31,30,31,30,31];//正常的月份日期
this.day = new Array(42);
this.dayObj = new Array(42); bRet = true;
}
return bRet; },
setData:function(y,m,d)
{
this.thisYear = y;
this.thisMonth = m;
this.thisDay = d;
this.today = this.thisYear + "-" + this.thisMonth + "-" + this.thisDay;
this.updateCalendar();
},
updateCalendar:function ()
{
if(this.dateSprite != null)
{
this.dateSprite.removeAllChildren(true);
this.removeChild(this.dateSprite);
this.dateSprite = null;
}
var iRemove=0;
// document.write(this.dateSprite);
if(this.dateSprite == null)
{
this.dateSprite = cc.Sprite.create();
this.addChild(this.dateSprite);
} var y = this.thisYear;
var m = this.thisMonth;
var d = this.thisDay; if(!(y <= 9999 && y >= 1000 && m > 0 && m < 13 && d > 0)){
//日期初始化
this.thisYear = 2013
this.thisMonth = 7;
this.thisDay = 10;
} this.todayTitleInfo = this.thisYear + "年 " + this.thisMonth + "月"; y = this.thisYear;
m = this.thisMonth;
d = this.thisDay;
this.daysMonth[1] = (0 == y%4 &&(y%100!=0 || y%400==0)) ? 29:28;
var w = new Date(y,m-1,1).getDay(); var prevDays = m==1? this.daysMonth[11] : this.daysMonth[m-2];
var i;
for(i=(w-1);i >= 0;i--){
this.day[i] = y + "-" + (m-1) + "-" + prevDays;
if(m == 1){
this.day[i] = (y-1) + "-" + 12 + "-" + prevDays;
}
prevDays--;
}
for(i=1;i <= this.daysMonth[m-1];i++){
this.day[i+w-1] = y + "-" + m + "-" + i;
}
for(i=1;i<42-w-this.daysMonth[m-1]+1;i++){
this.day[this.daysMonth[m-1]+w-1+i] = y + "-" + (m+1) + "-" + i;
if(m==12){
this.day[this.daysMonth[m-1]+w-1+i] = (y+1) + "-" + 1 + "-" + i;
}
} for(i=0;i<42;i++)
{
var a = this.day[i].split("-");
this.dayObj[i] = DayObject.create();
this.dayObj[i].innerText = a[2];
this.dayObj[i].isToady = false; //非本月份,不显示日期
if(i < w)
{
continue;
}
if(i >= w+this.daysMonth[m-1])
{
continue;
} //今天日期
if(this.day[i] == this.today)
{
this.dayObj[i].isToady = true;
} var dateShape = DateShape.create(this.dayObj[i]);
dateShape.setPositionX((i % 7) * 115);
//cocos2d的世界里越往下y越小,所以要(6-i)
dateShape.setPositionY( Math.floor((6-i) / 7) * 40 ); this.dateSprite.addChild(dateShape); }
},
jumpToPrevMonth:function()
{
this.thisDay = 1;
if(this.thisMonth == 1)
{
this.thisYear--;
this.thisMonth = 13;
}
this.thisMonth--;
this.updateCalendar();
},
jumpToNextMonth:function()
{
this.thisDay = 1;
if(this.thisMonth == 12)
{
this.thisYear++;
this.thisMonth = 0;
}
this.thisMonth++;
this.updateCalendar();
},
jumpToToday:function()
{
this.thisYear = 2013;
this.thisMonth = 7;
this.thisDay = 10;
this.today = this.thisYear + "-" + this.thisMonth + "-" + this.thisDay; //今天("yyyy-dd-mm")
this.updateCalendar();
}
}); SuperCalendar.create = function()
{
var layer = new SuperCalendar();
if(layer && layer.init())
{
return layer;
}
return null;
};
cocos2d-html5版日历组件的更多相关文章
- jmgraph前端画图组件(html5版)
原文:jmgraph前端画图组件(html5版) jmgraph是一个基于html5的WEB前端画图组件. 前端画图对象控件化,支持鼠标和健盘事件响应,可对单个控件样式设定,支 ...
- HTML5版的String Avoider小游戏
HTML5版的String Avoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,从游戏起始点移动鼠标到终点位置,鼠标移动 ...
- 9款精致HTML5/jQuery日历时钟控件源码下载(源码请见百度云) 链接:http://pan.baidu.com/s/1geIXe75 密码:7m4a
现在的网页应用越来越丰富,我们在网页中填写日期和时间已经再也不用手动输入了,而是使用各种各样的日期时间选择控件,大部分样式华丽的日期选择和日历控件都是基于jQuery和HTML5的,比如今天要分享的这 ...
- input的type属性引申的日历组件
HTML5规范里只规定date新型input输入类型,并没有规定日历弹出框的实现和样式.所以,各浏览器根据自己的设计实现日历.目前只有谷歌浏览器完全实现日历功能.相信这种局面很快就会结束,所有的浏览器 ...
- 基于Vue2-Calendar改进的日历组件(含中文使用说明)
一,前言 我是刚学Vue的菜鸟,在使用过程中需要用到日历控件,由于项目中原来是用jQuery写的,因此用了bootstarp的日历控件,但是配合Vue实在有点蛋疼,不够优雅…… 于是网上搜了好久找到了 ...
- 微信小程序横版日历,tab栏
代码地址如下:http://www.demodashi.com/demo/14243.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- 日历组件 原生js
自己基于原生js编写的日历组件 git地址: https://github.com/lihefen/calendar.git demo : https://lihefen.github.io/cale ...
- 免费的HTML5版uploadify送上
相信有不少同学用过uploadify这一款文件上传插件,它支持多文件选择.能显示进度条.可配置性高,总体来说是比较好用的.官网有两个版本供下载,分别是flash版和HTML5版.不过令人惋惜的是,HT ...
- HTML5拓扑图形组件设计之道(一)
HT for Web(http://www.hightopo.com/guide/readme.html)提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表 ...
随机推荐
- [转载]Windows 7笔记本创建wifi热点供手机上网教程
用智能手机的朋友会发现这样一个问题,智能手机比普通手机上网更耗流量.这是因为智能手机应用(软件)丰富,而且大部分应用都会自动联网.为此,许多人每月包了上百M的流量套餐,但用的时候还是小心翼翼,生怕流量 ...
- css3内容溢出属性
overflow是css2.0的属性,css3中新增了overflow-x和overflow-y属性. overflow-x主要是用来定义对水平方向内容溢出的剪切,而overflow-y主要是用来定义 ...
- js继承实例
第一种方法:对象冒充(临时属性) 借用临时属性,指向超类,末了删除 function Person(name,gender){ this.name=name; this.gender=gender; ...
- 【STL】-deque的用法
初始化: #include <deque> deque<float> fdeque; 算法: fdeque.push_front(f); fdeque.push_back(f) ...
- SQlServer 从系统表 sysobjects 中获取数据库中所有表或存储过程等对象
[sysobjects] 一.概述 系统对象表. 保存当前数据库的对象,如约束.默认值.日志.规则.存储过程等,该表中包含该数据库中的表 存储过程 视图等所有对象 在sqlserver2005,sql ...
- 网易云课堂 OCP
数据库DBA任务: 管理数据库可用性 设计并创建数据库 管理物理结构 管理基于设计的存储 管理安全性 网络管理 备份与恢复 数据库调整与优化 关系型数据库(RDBMS) 多个表数据之间存在着关系 关系 ...
- Python开发入门与实战1-开发环境
1.搭建Python Django开发环境 1.1.Python运行环境安装 Python官网:http://www.python.org/ Python最新源码,二进制文档,新闻资讯等可以在Pyth ...
- objective-c strong导致内存泄漏简单案例
例如: @interface Test:NSObject{ id __strong obj_; } -(void) setObject:(id __strong)obj; @end @implemen ...
- 创建MySQL数据库和表(一)
一.启动MySQL服务 1.在Windows操作系统的“服务”中启动,找到你安装MySQL的起的服务名称,我本机服务名的是MySQL. 2.在命令行中用命令启动: A.启动MySQL服务:net st ...
- 2013年7月份第3周51Aspx源码发布详情
批量重命名文件工具源码 2013-7-19 [VS2010]功能介绍:这是一个新型的文件重命名,主要用了TreeView(树形视图)来选择文件夹,批量进行文件重命名.其中,有"编号在前,编 ...