= 创作分享 =
技术讨论
DIY基于ComputerCraft和ProjectRed的时钟
odixus

DIY基于ComputerCraft和ProjectRed的时钟

odixus 于 2018-3-9 23:08 ( 6年前 ) [教程] [复制链接] [显示全部楼层] [打印]
本贴模组名片
电脑 (Computer Craft)
[h1=简介][ban:title_menu]ComputerCraft 是一款为 Minecraft 世界增加了电脑、显示器、有线或无线网络、机器人、打印机以及其他电脑外设的模组。所有相关设备和红石信号都可以很轻松地使用 Lua 语言进行编程操作。你可以通过电脑控制红石信号(甚至支持 RedPower2 重置版的捆绑线缆..
本帖最后由 odixus 于 2018-3-9 23:42 编辑

ComputerCraft是一个非常优秀的MOD,可是竟然没有多少人为它写教程!好吧,我先扔一个。



  由于太阳能的广泛使用,按时作息就变得很重要了。如果你的工厂是建设在地表,那么这没有问题;但是如果你的工厂建在地下,那么如何得知当前游戏中的时间呢?MC自带的钟表可以看到时间,但是它并不精确,而且放在物品栏中会占据宝贵的空间。有些MOD提供了时间显示,但是怎么也不如自己动手做一个有趣。这里是通过ComputerCraft(电脑MOD)和ProjectRed(红石计划)自制一个漂亮、可靠的时钟。这是基础版本,大家可以在此基础上设置定时提醒、自动执行等更高级的功能。

  老规矩,先上图:
2018-03-09_22.05.20.png

一、环境:我使用的版本是MineCraft 1.7.10 + ComputerCraft 1.75 + ProjectRed 4.7.0pre12.95。

二、知识预备:请至少先看一遍ComputerCraft的教程,虽然是E文,但是讲得很清楚。最好有一点点编程基础。

三、硬件准备:
  首先,请做2个分段显示门。这东东有16个不同颜色的输入线,对应16个不同的笔画。准备一些集束线缆当作数据线。再做一台高级电脑作为主机。好了,需要的东西齐全了!
  然后,按如图所示摆放:
2018-03-09_22.40.03.png

  • 显示门是有方向的,如果方向不对,请用红石计划中的螺丝刀右键点击以调整方向。
  • 为避免两个显示门的数据线连接在一起,可以在中间用隔板断开,也可以采用两种不同颜色的集束线缆。两根集束线缆分别接在高级电脑的顶面和左面。如果你的走线需要接在电脑的其它侧面,则需要在下面的程度代码中做相应修改。
  • 为了美观,可以用半砖和立柱把前面挡上,就是我放的第一图的效果了。至此,硬件准备完成!

四、软件准备
  请右键点击电脑,打开电脑。如果这是一台新电脑,请一定要先输入:
  1. label set timer
复制代码
  这个命令的作用是为电脑命名。timer是电脑名字,可以换成自己喜欢的名字。只有命名后的电脑才是可以编程的!命名后,可以输入命令"id"看到当前电脑的id( 一个数字),这个在后面会用到。现在假定这台电脑的id是1。
  然后键入:
  1. edit startup
复制代码
  启动内置的程序编辑器:
2018-03-09_22.48.59.png
  然后输入下面的代码。如果不愿意手工输入,也可以随便键入点什么,然后按Ctrl,保存然后退出,再到电脑的游戏存档中,查找你的存档目录下的子目录:computer\1,应该会看到文件startup。这个文件就是刚刚编辑器建立的程序文件。用文本编辑器打开它,然后把下面的代码粘贴进去,保存退出:
  1. local function numLow(n)
  2.   local l = {["0"]=16128,["1"]=12288,["2"]=23296,["3"]=30976,["4"]=29696,["5"]=27904,["6"]=28416,["7"]=15360,["8"]=32512,["9"]=32000}
  3.   return l[n]
  4. end

  5. local function numHigh(n)
  6.   local h = {["0"]=63,["1"]=48,["2"]=91,["3"]=121,["4"]=116,["5"]=109,["6"]=111,["7"]=56,["8"]=127,["9"]=125}
  7.   return h[n]
  8. end

  9. local thetime, now, hour, min
  10. while true do
  11.   thetime = os.time()
  12.   now = string.reverse(textutils.formatTime(thetime,true))
  13.   min = numLow(string.sub(now,1,1)) + numHigh(string.sub(now,2,2))
  14.   hour = numLow(string.sub(now,4,4))
  15.   if #now > 4 then
  16.     hour = hour + numHigh(string.sub(now,5,5))
  17.   else
  18.     hour = hour + numHigh("0")
  19.   end
  20.   redstone.setBundledOutput("top",min)
  21.   redstone.setBundledOutput("left",hour)
  22.   sleep(0.1)
  23. end
复制代码
  好了。回到游戏,打开高级电脑,输入"startup",就可以看到当前时间了。简单吧?因为我们编辑的文件是startup,因此这个程序会在每次进入游戏的时候,被高级电脑自动运行,除非你手动关掉这台高级电脑。

发表于 2018-3-9 23:08:50 | 显示全部楼层 |阅读模式

回复 | 举报

该帖共收到 10 条回复!
NoName德里奇
是…是编程大佬!
后排膜一下
更休落魄耽杯酒,亦莫猖狂爱咏诗。
        今日捉将官里去,这回断送老头皮!

发表于 2018-3-9 23:38:37 | 显示全部楼层

回复 | 举报

QQ酱37436
楼主强势!照着代码自己研究了一下。不太清楚第2行和第7行的具体含义(CC wiki 上的用法和楼主不一样...)能具体解释一下吗?
发表于 2018-9-3 12:13:40 | 显示全部楼层

回复 | 举报

QQ酱37436
QQ酱37436 发表于 2018-9-3 12:13
楼主强势!照着代码自己研究了一下。不太清楚第2行和第7行的具体含义(CC wiki 上的用法和楼主不一样...)能 ...

@odixus
发表于 2018-9-3 12:14:31 | 显示全部楼层

回复 | 举报

odixus
QQ酱37436 发表于 2018-9-3 12:13
楼主强势!照着代码自己研究了一下。不太清楚第2行和第7行的具体含义(CC wiki 上的用法和楼主不一样...)能 ...

  这两行是用来控制“分段显示门”上的各个笔画,最终形成数字的。
  首先说一下分段显示门的控制方法。每个分段显示门有16个可显示笔画,对应集束线缆的16根线。电脑通过redstone函数库中的setBundledOutput函数来控制这16根线。这个函数有两个参数,第一个是方向,第二个是0~65535之间的一个数字。65535换算成二进制就是1111111111111111,刚好是16位,一位对应一画。因此,只要电脑能输出一个适合的数字,分段显示门就必定能显示一个正确的结果。分段显示门有两种显示模式,一种是双8显示,另一种是“米”字加外框的单字显示。这两种方式可以通过螺丝刀切换。只要摸清楚了电脑输出的每一个二进制位与笔画的对应,那么想显示什么就很容易了。
  在我上面的这个例子中,分段显示门实际上是倒着放的。标准的放置方向是数字线接口向上,但是这不利于布线,而且我也用不到数字右下角的小数点,因此就干脆倒着放了。在这种情况下显示数字,用到的笔画就和正向时不会一样,因此可能我的各个数字与wiki中不一样。但这没关系,你完全可以一个个试呀,拿张纸标记出每一画代表的数字,再拿个计算器换算二进制和十进制,一会儿就能搞定。我就这么干的,嗯嗯!
发表于 2018-9-3 13:47:20 | 显示全部楼层

回复 | 举报

odixus
QQ酱37436 发表于 2018-9-3 12:13
楼主强势!照着代码自己研究了一下。不太清楚第2行和第7行的具体含义(CC wiki 上的用法和楼主不一样...)能 ...

wiki中用到了colors.white+colors.black这样的写法,其实就是对应了集束线缆中各个颜色线缆的值。你直接在lua里输入colors.white,返回值就是1。因此输出colors.white和输出1是完全一样的。我上面的各个数字就是每个笔画的信号颜色的数值之和,当然你如果愿意写成colors.blue+colors.pink+……这样的形式也完全可以。
发表于 2018-9-3 13:58:14 | 显示全部楼层

回复 | 举报

QQ酱37436
odixus 发表于 2018-9-3 13:58
wiki中用到了colors.white+colors.black这样的写法,其实就是对应了集束线缆中各个颜色线缆的值。你直接 ...

会了会了!谢谢楼主!
发表于 2018-9-4 12:51:31 | 显示全部楼层

回复 | 举报

SMSQO
楼主,我把写好的一些文件放到了一个文件夹里,怎么样才能让所有的电脑都能引用这个文件夹里的内容啊?
因为用shell.run([路径])尝试过没有效果
(比如shell.run("E:\\CC_include\\tester_2")运行后会提示 文件不存在;试图在CC电脑里输入edit E:\\CC_include\\tester_2会在该电脑所在的文件夹里新建一个名为"E"的文件夹,里面有包含着tester_2文件的CC_include文件夹,这样别的电脑就不能引用这个文件了...)
发表于 2018-12-1 18:27:44 | 显示全部楼层

回复 | 举报

odixus
SMSQO 发表于 2018-12-1 18:27
楼主,我把写好的一些文件放到了一个文件夹里,怎么样才能让所有的电脑都能引用这个文件夹里的内容啊?
因 ...

  首先,你要理解每个电脑能够访问的目录,仅限于存档下的computer\<电脑id>这个目录。也就是说每个电脑的空间是相对独立的,不会允许游戏里的电脑直接访问你的硬盘。至于能被公共访问的目录,仅限mod目录里的computerCraft.jar里面的assets/computercraft/lua/rom下的文件。
  如果你写了一些东西想被共用,那么或是把它复制到每一个电脑的目录下(用批处理可以很容易实现这一点),或是把它打包到mod文件包中。
  也许会有更好的方法,但我目前还没有发现。
发表于 2018-12-3 10:00:57 | 显示全部楼层

回复 | 举报

odixus
SMSQO 发表于 2018-12-1 18:27
楼主,我把写好的一些文件放到了一个文件夹里,怎么样才能让所有的电脑都能引用这个文件夹里的内容啊?
因 ...

  对了,有一个折衷的办法。软盘驱动器对于所有的电脑都是可以访问的,放到软盘上应该可以实现共享。对于所有电脑,只要引用/disk/***就可以了
发表于 2018-12-3 10:04:55 | 显示全部楼层

回复 | 举报

12下一页
百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表