本帖最后由 kongbaiyo 于 2015-2-5 10:26 编辑

====================前言====================

steam游戏平台上会显示游戏已玩的时长

今天就在MC里复原一个~


它会实时显示这张地图已经玩过的时间~

------------------视频------------------

http://www.bilibili.com/video/av1958673/
[bili=1958673]1[/bili]

======================原理解释======================




/time query gametime
query翻译成中文是询问的意思
这个指令可以获得整张地图从建立到现在所经过的gametick
gametick和现实生活中的秒的换算关系众所周知是
20 gametick = 1 second
通过/stats指令获取总游戏时间后
再经过计分板operation的运算即可获得总游戏时间的天数 小时数 分钟数和秒数



======================详细指令======================

首先是用/stats建立命令方块的运行结果和计分板的联系



位于x=914 y=56 z=-20处的 也就是它下面的命令方块内部的指令是:

----------------------------
/time query gametime
----------------------------

/stats命令将运行结果存入了time下的dtime玩家中

接下来将总gametick数除以20就是总秒数
总秒数存在tSec中,
首先让tSec的值等于dtime的值才能运算, 因为dtime和命令方块建立了连接,
其数值不能改变

------------------------------------------------------------------------------------
/scoreboard players operation tSec time = dtime time
------------------------------------------------------------------------------------

然后给tSec除以20
先把20这个数存在gt里 MC里是没办法直接运算的
注:MC计分板中的除是"整除"
除法运算过后只保留商数而舍弃余数 并非四舍五入



------------------------------------------------------------------------------------
/scoreboard players set gt time 20
/scoreboard players operation tSec time /= gt time
------------------------------------------------------------------------------------

这样得到的tSec就是总秒数

接下来算天数
一天是24*60*60秒
总秒数除以24*60*60 即可得到总天数


------------------------------------------------------------------------------------
/scoreboard players set d_day time 86400
/scoreboard players operation day time = tSec time
/scoreboard players operation day time /= d_day time
------------------------------------------------------------------------------------

然后是小时数
1小时是3600秒 同理


------------------------------------------------------------------------------------
/scoreboard players set d_hour time 3600
/scoreboard players operation hour time = tSec time
/scoreboard players operation hour time /= d_hour time
------------------------------------------------------------------------------------

重要:
只是这样算出的小时数是总小时数
如果游戏天数比1天多
那总小时数肯定是要大于24的了
这样看着非常不科学 因此我们要将总小时数
除以24求余数 得到的就是不足一天的小时数了
就像时钟一样


------------------------------------------------------------------------------------
/scoreboard players set d_hour2 time 24
/scoreboard players operation hour time %= d_hour2 time
------------------------------------------------------------------------------------

分钟数也同理啦



------------------------------------------------------------------------------------
/scoreboard players set d_min time 60
/scoreboard players operation min time = tSec time
/scoreboard players operation min time /= d_min time
/scoreboard players operation min time %= d_min time
------------------------------------------------------------------------------------

秒数这里有一点不同
总秒数直接求除以60后的余数即可~

------------------------------------------------------------------------------------
/scoreboard players operation sec time = tSec time
/scoreboard players operation sec time %= d_min time
------------------------------------------------------------------------------------

至此我们就获得了所有我们要显示的参数啦~
最后再将它们显示在牌子上~
用/blockdata实时更新牌子~

------------------------------------------------------------------------------------
/blockdata [x] [y] [z] {Text1:"{score:{name:\"假玩家名\",objective:\"变量名\"}}"}
------------------------------------------------------------------------------------

======================结语======================

关于/stats里的QueryResult的应用
就只有/time query和/gamerule了
这里是一个小应用~
欢迎大家继续讨论呀~
PS.我觉得这个应用挺炫酷的233

前置教程:[CBL·K_bai] "见光死"与"安检门"——/stats指令教程
http://www.mcbbs.net/thread-399876-1-1.html
[groupid=546]Command Block Logic[/groupid]