2015-04-19 19:07 1466人阅读 评论(0) 收藏 举报
 分类:
Lua(29)   cocos2d(38) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间显示问题说白了就是时差问题(下面代码片断是以lua脚本写的)。
一般来说,游戏中时间是以游戏服务器时间为准。游戏登录时,会从服务器接收一个时间,普遍方案是接收一个时间戳,然后客户端自己维护这个时间戳。有时,客户端会进行这个时间的显示:
local ServerTimeStamp = XXXXXXXX  --这个是服务端发给客户端维护的时间戳
local ServerTimeZone = XXXX      --这个是服务端时间的时区差值(也是由服务端发给客户端)
local CurrentDateTime = os.date("*t",ServerTimeStamp)
print("year="..CurrentDateTime.year)
print("month="..CurrentDateTime.month)
print("day="..CurrentDateTime.day)
print("hour="..CurrentDateTime.hour)
print("min="..CurrentDateTime.min)

print("sec="..CurrentDateTime.sec)

如果你的游戏服务端时间的时区是东八区,且跑上面代码的机子的时区也是东八区,你可能会非常乐意地看到,打印出来的时间与服务端时间是一致的;但是用来跑上面代码的机子的时区不是东八区,如一个日本人使用他机子来跑你的程序(他的机子时区是东九区),这时会看到打印出来的时间比这游戏服务端的时间快了1个小时,这肯定是错误的。

为什么会这样?
原来上面调用os.date()时会把当前设备的时区也关联上去。所以在东八区设备下跑完全是正确的。但你不可能指定别人使用固定时区的机子来跑你的程序吧,那怎办呢?
-- Compute the difference in seconds between local time and UTC.
local function get_timezone()
  local now = os.time()
  return os.difftime(now, os.time(os.date("!*t", now)))
end
local localTimeZone = get_timezone()
local timeZoneD = ServerTimeZone - localTimeZone  --计算出服务端时区与客户端时区差值
local CurrentDateTime = os.date("*t",ServerTimeStamp + timeZoneD)
这时你会发现,无论你使用东八区、东九区或者其它时区的机子去跑,它都正确地打印出这个服务器的时间。
扩展一下来说,只要你做了这个时区的差值处理,无论服务器的时区是哪个,无论客户端的时区是哪个,客户端都能正确地显示服务器的时间。
再扩展一下来说,无论是哪个cocos2dx的版本,无论是使用哪个游戏引擎框架,都应该在处理时间上做类似上面的时区处理,让客户端能够正确地显示服务端的时间。

Lua游戏时区问题的更多相关文章

  1. Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解

    这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...

  2. lua游戏开发实践指南学习笔记1

    本文是依据lua游戏开发实践指南做的一些学习笔记,仅用于继续自己学习的一些知识. Lua基础 1.  语言定义: 在lua语言中,标识符有非常大的灵活性(变量和函数名),只是用户不呢个以数字作为起始符 ...

  3. Lua游戏逆向及破解方法介绍

    Lua游戏逆向及破解方法介绍   背景介绍 随着手游的发展,越来越多的Cocos-lua端游开发者转移到手游平台.Lua脚本编写逻辑的手游也是越来越多,如梦幻西游.刀塔传奇.开心消消乐.游龙英雄.奇迹 ...

  4. [Lua游戏AI开发指南] 笔记零 - 框架搭建

    一.图书详情 <Lua游戏AI开发指南>,原作名: Learning Game AI Programming with Lua. 豆瓣:https://book.douban.com/su ...

  5. Lua游戏开发之时区问题

    目前大部分游戏都采用了Lua语言进行功能开发,在进行多语种发行的时候就会遇到时区显示的问题.以韩国版本为例,场景如下: 1.服务器处于固定的位置,比如放在首尔机房: 2.玩家所处的位置不确定,可能在韩 ...

  6. cocos IDE 编译lua 游戏程序的环境配置

    因为毕业设计需要用cocosIDE编译一个apk在手机上跑,所以搭建这个环境还是需要的. ps:是针对win系统的. 需要的工具: 1.cocosIDE:点击链接 (ps:据说这个软件设计有点反人类, ...

  7. 读Lua游戏开发实践指南

    11月11日开读,到今天正好一个月. 起因是被裁员之后,发现很多公司都在使用lua编写cocos2d-x游戏,原因是上手快,技术人员比较便宜. 如果引擎封装比较好,几乎在lua里写写基本逻辑就行了,不 ...

  8. 第一个Cocos2d-x Lua游戏

    我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容.创建工程我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实 ...

  9. 《Lua游戏开发实践指南》读后感

    书籍地址:http://book.douban.com/subject/20392269/ 一句话点评该书:想用Lua作游戏脚本开发的同学值得一读! (一)本书特点 市面专门讲Lua的中文书籍非常少, ...

随机推荐

  1. SQL 查看数据库的列数

    查询表名为History的所有列名 1 select name from syscolumns where id=object_id('History') 查询表名为History的所有列名个数   ...

  2. 建表过程-列名&列类型&修改表小试题C

    #新增数据 INSERT INTO goods VALUES(10,'豆豆','男',85.2,'2016-12-14',5000.36,'2016-12-14 12:05:06','高') INSE ...

  3. Oracle连接与会话

    连接(connection):连接是从客户端到oracle数据库实例的一条物理路径. 会话(session):会话是数据库实例中存在的一个逻辑实体. case1:一个连接可以有多个会话 SQL> ...

  4. ubuntu 14.04下spark简易安装

    java安装 首先需要上oracle的网站下载 在lib目录下建立一个jvm文件夹 sudo mkdir /usr/lib/jvm 然后解压文件到这个文件夹 sudo tar zxvf jdk-8u4 ...

  5. 用 Blend 给Windows Phone 应用创建 示例数据

    前言  创建 示例数据(Sample Data) 是提高程序开发效率的一个很有效方法,有了它,我们调UI的时候就不必每次都运行应用,然后在手机上观看页面效果了,配合 “AlignmentGrid.pn ...

  6. 【maven】pom.xml报错:Cannot detect Web Project version.

    新建的maven项目 报错如下: Cannot detect Web Project version. Please specify version of Web Project through &l ...

  7. tp中使用分页技术

    1 public function showList() { $m_ld = D ( 'guangxi_ld' ); $page = I ( 'get.p', 1 ); // 在配置中获取分页值 $p ...

  8. MyEclipse创建Maven工程

    先要在MyEclipse中对Maven进行设置:

  9. files list file for package 'xxx' is missing final newline

    #!/usr/bin/python # 8th November, 2009 # update manager failed, giving me the error: # 'files list f ...

  10. Oldboy-Homework-Week1

    关于Python全栈开发第一周所讲的一些回忆(会陆续添加) 一.一些简单的命令.概念 1.print(""):输出 2.变量 3.input():输入 4.while循环.if.e ...