nriot-utils
给我自己.为了完成它, 我专门跟着官网的教程走了一遍, 顺便还装了ts-loader
来加载Typescript代码.
虽然nriot-utils
非常简单, 只有那几个功能, 但是在对Webpack的配置上我还是花了很多时间. 你可以在这个博客的任何一个地方打开浏览器Devtools, 然后输入NUtils
, 就可以尝试nriot-utils
了(因为博客引入了它)
1 | npm i nriot-utils --save |
1 | const { NUtils } = require("nriot-utils"); |
这个幽灵的AI能控制幽灵的移动. 我让它先获取蛇头的坐标, 再获取幽灵自己的坐标, 然后通过比较x轴与y轴来确定相对的位置, 最后才来决定要转哪个方向.
但测试后, 我发现它跟得太紧了, 游戏难度大大增加, 那要怎么办呢?
我是这么做的: 在幽灵移动之前, 抽取随机数(-1, 0, 1), 加在幽灵要移动到的坐标上, 以此打乱幽灵的路径.
这样一来, 幽灵也就更像幽灵了, 游戏趣味大增.
]]>网上有许多人认为,轻灵才是这三个生物中的最佳选项,以至于在官方宣传片中,大片大片的弹幕都刷着轻灵的名字,更有甚者还会攻击其他的生物。轻灵是一个像恼鬼一样可以在空中飞舞的生物,它全身尽是蓝色,背上还有一对小翅膀。轻灵可以被音符盒发出的声音所召唤,给它一件东西,它还能帮你收集出更多这样的东西给你。或许是因为它的这个能力,网上有近半数的人都觉得这个生物是最好的。
值得肯定的是,轻灵确实很可爱,而且可以帮你找出指定的物品。但官方设计这个生物也是会考虑到它的游戏平衡性的,因此,这项能力也有所限制。
首先,它不能破坏方块、开箱子,找出指定的物品。试想一下,如果你给了你的轻灵一颗钻石,然后它就去帮你挖钻石、开宝箱,不久便弄到了一大堆。这么一想似乎还挺好的,但你想过这么做之后你还需要去挖矿吗?这个游戏的核心玩法就是挖矿,如果不用挖矿,那这个游戏还有灵魂吗?玩家还需要劳动吗?有句俗话说:“百行业为先,万恶懒为首”,如果你成天不努力,只靠着你的轻灵给你送钻石,那你玩这个游戏还有什么意义?在这个游戏中,玩家的本业便是挖矿。失去了挖矿,游戏便不再有可玩性了。那这么说,它收集物品的能力就是假的了?不是的,它只能收集以掉落物形式存在的物品。
其次,它还只能收集一定范围内的指定物品。这么看来,它就只能替你捡起你身边的掉落物了。或许在某些场景下,这个功能是有一定用处的,但在原版生存的情况下,我认为这么做就没有多大意义了。如果你想要捡起周围的树苗掉落物,你不直接去捡,而是叫轻灵帮你去捡,这岂不是脱裤子放屁——多此一举?
所以说,如果Mojang官方不给它添加别的功能,那么它除了当宠物,其实也没什么大用了。那铜傀儡怎么样呢?为什么支持铜傀儡呢?
铜傀儡也是一个很耐看的生物,它有“正常”和“生锈”两种状态。正常情况下,它全身呈铜金色;生锈时,呈铜绿色。它头顶有一个小天线,身材矮矮胖胖的,会随时间推移而逐渐变为生锈状态。同样的,它也有一个能力,就是随机点击周围的铜按钮。
有人说:不就是随便点周围的铜按钮吗,这能有什么用啊?如果你是这么想的,那你就大错特错了!它最关键的能力,便是这“随机”二字,按照这个思路,如果铜按钮下有红石机关或者命令方块,那么便可以实现一定的随机性功能,如:抽奖箱、随机分配等等。又有人说:要实现这个功能,以前的特性就足够了,哪还需要铜傀儡?是的,没有铜傀儡也是可以实现随机的,但是实现的方法很复杂,有的利用了投掷器的投掷角度偏移,有的利用了计分板的UUID,还有的利用了随机玩家选择器“@r”。但奈何这些方法都比较复杂,如果没用一定的基础,会比较难理解(这里不针对指令老玩家)。如果有铜傀儡的话,那么这个逻辑就变得简单多了:只需要在在一堆铜按钮中放一个铜傀儡,按钮下放一些要执行的指令方块,这样不就行了?
而且,就外观设计来看,铜傀儡是要比轻灵好看得多的。轻灵像恼鬼一样飘来飘去的,配色也与周围环境的颜色格格不入,会显得格外突兀——想想:一片绿色中有一点蓝色,这样会好看吗?而铜傀儡的颜色能和周围的颜色很好地相处,不会有其他碍眼的地方。生锈的铜傀儡也很有摆设的价值,它放在墙壁的架子上再合适不过了,甚至还会有些古老的艺术气息。
铜傀儡的能力或许没有那么强大,但在我看来,轻灵的功能才是最无用的。大多投票给轻灵的人有很多都是因为懒得收集材料、物品、矿物才投的,却没有考虑到这个生物的实际功能作用。官方添加这个生物或许只是想增添游戏性,而不是给玩家在游戏中偷懒用的。如果你连在游戏里都会偷懒,那么你在生活中也或多或少会有些懒惰的想法或行为。
写这篇文章,目的不仅是想说铜傀儡比轻灵更好的原因,还有一点是想告诫那些懒惰的人们:懒惰,是靠不住的!
]]>于是我迅速提交了一个修复这个bug的PR, 不久之后就被合并了.
在Github中, Pull Request里其实也藏着挺多东西的:
首先, 提交PR前你需要先Fork然后下载源码. 这里要用git clone https://github.com/your_name/repo_name
指令下载源码, 因为这么做的话系统会自动生成.git
文件夹, 方便后面的提交操作.
接着, 修改源码, 通过git push
提交代码.
然后在Github进入你Fork到的仓库中, 此时你应该能看到你刚刚提交的东西(如果没看到, 那你应该好好检查一下上面的步骤), 点击Pull Requests, 创建一个新的PR即可.
最后你就可以在官方仓库的Pull Requests里看到你提交的PR了.
顺带一提, 提交了PR之后你首先要等的是reviewer来审核通过你的代码, 最后才能被合并. 还有, 不要提交错误或者垃圾PR, 这样会浪费reviewer们的时间!!
]]>最近我在Github上给nodejs.org的网站源码提了一个Pull Request, 大致内容是添加网页深色模式. 所以你如果在浏览器开启了深色模式, 那么你访问nodejs.org时就能看到我添加的样式.
我发出PR之后, 很快就有管理员来审核. PR合并之后, 他们还有人来帮优化我原本写的样式.
就在昨天, 有个人来这里提了一个issue, 说切换到深色模式之后, 网站内跳转页面时会闪烁一下.
于是我把这个bug修复, 并重新提了一个Pull Request.
修复这个bug的思路是: 想办法让那段深色模式的js脚本在css加载之前被加载.
我具体这么做: 新建一个js文件, 把切换深色模式的脚本写进去, 而原本写那段脚本的地方留下一些必须要在css和dom加载之后才执行的代码(添加点击事件之类的), 最后在<head>
标签中添加这个新js的引入.
这个主题说实话其实很耐看, 我以前用的那个主题我现在看感觉挺丑的. 感觉换来换去还是默认的好看啊!!
在这基础上进行了一些小小的修改, 发个博客纪念一下.
]]>首先是游戏内的快捷键, 快捷键功能本来很早就想做的, 但因为各种原因拖到了现在才做.
其次是游戏内左上角的那个图标. 那里原本是用于显示存档的图标的, 但是我觉得没什么用, 于是就用ICraft的图标稍微改一下, 替换了上去.
最后是”检查更新”的功能. 我以前在关于页面放了一个”检查更新”的链接, 链接的地址是到ICraft的Releases列表. 现在我觉得这个”检查更新”就应该点击之后直接检查, 而不是让用户自己手动去检查.
我通过调用Github API来实现”检查更新”的功能. Github API中, 可以查询一个仓库的Releases列表, 于是我就调用这个API, 获取列表的第一个值, 并且用当前的版本号与这个值的版本号作比较, 以此实现这个功能.
以上就是这次的改动.
]]>最近刷B站的时候看到了一个反mc的人发的视频, 点进去他的主页看到他开了一个网站: https://yinbing.space
于是我心情激动地就点了进去, 没想到在那个网站注册和登录的时候发生了一些奇怪的事情.
在我登录账号的时候, 点击登录按钮便会提示”网络错误”, 重新试过几次都是这样, 所以我就抱着试试的心态打开了devtools
.
下好断点, 调试了几次之后, 我终于发现了问题之所在!
原来是他的源码中, 发起了一个xhr post请求, 而这个请求发送过去之后收到了一个错误的responseText.
这个responseText里面是json格式的, 但是在最后结尾的地方漏掉了一个大括号, 于是导致了报错.
至于为什么会报”网络错误”, 是因为在那个xhr对象的onload函数里面, 有一个try catch语句, try语句中使用了JSON.parse
来将那个responseText转换为object
形式. 但恰好那个responseText有格式错误, 所以执行了catch语句中的代码.
这个错误的根源或许在服务端中, 服务端给客户端代码返回了一个错误的东西而导致它报错. 要想修复它, 最好的办法就是在服务端中好好地找一找有没有什么地方是错的.
]]>Deed是我的朋友, 他参与了ICraft的测试工作. 今天我把我最新开发好的源码拿给他调试的时候, 他那里弹出了一条ERR:
Error: Can't find module 'nriot-logger'
我看了之后, 发现这是在package.json的模块列表中没有nriot-logger
这一项, 这是由于我在下载这个模块的时候没有在命令后面写上--save
导致的. 不过之后我马上就在列表里把漏掉的这项给加上了.
游戏界面的nav条上有显示当前方块一项, 但之前我只让它显示方块名称, 而实际上在玩的时候, 看名称其实是没办法一下反应过来是什么方块的. 因此我让它在那个位置显示当前方块的贴图, 便轻松地解决了这个非常不好的问题.
游戏界面我做了很大的更改, 但仍然有许多问题, 如果你有什么建议或者问题, 可以在ICraft-App Repo的issues里面提出来.
接下来, 我在游戏中添加了昼夜更新(daynight), 其实这个更新我自己觉得没那么好, 但是以我的水平似乎也只能这样了…… 还是要继续努力啊!
]]>之前多人游戏玩家显示的bug也被修复了, 因为我在客户端脚本中没有正确处理服务端发来的信号, 而导致玩家列表中会出现重复的玩家对象, 才导致了这个bug的产生.
为了修复这个bug, 我在客户端脚本中接收服务端信号的部分稍做了修改, 在原本接收服务器玩家列表的部分添加了一句“清空本地玩家列表数据”, 以此避免列表中出现重复对象.
接下来, 我还修复了玩家退出服务器后没有保存坐标位置的bug.
这个bug要修复其实很简单, 只需要在playerMove事件中添加坐标信息存储, 以及在服务端中添加玩家坐标信息存储即可.
在此之后, 我每天如果有对ICraft源码做出改动的话, 都会发布一条开发日志的.
]]>由于Android手机是基于Linux开发的, 所以只要有方法, 就可以把手机当作服务器来使用.
那该如何做呢?
我先在手机上下载了Termux, 这款应用是一款终端应用, 可以通过它和一些Linux指令来进行更深的操作.
打开Termux, 看到的是一个黑乎乎的界面, 接下来配置一下ssh远程连接, 就可以用电脑更方便地操作这台手机了.
1 | # 下载openssh软件包 |
接着, 在电脑里的cmd窗口中输入: ssh root@{刚刚看到的ip地址} -p 8022
这样, 就在电脑上连接并登录上了手机的终端了.
下一步要安装java环境.
安装java环境有两种方式, 一种是直接用wget获取jdk, 另一种是用pkg指令下载安装java软件包, 我选择了后者:
1 | pkg install openjdk-17 |
接下来, 就是下载MC服务端了. 我在官网下载了1.17版本的服务端jar包, 下载好之后简单配置了一下. 然后输入下面的指令来启动服务器:
1 | java -Xmx2048M -Xms2048M -jar server.jar nogui |
上面的命令中, 我给MC服务端分配了2GB的运行内存, 如果你想要让更多玩家一起来玩你的服务器, 那你可以自己调大这个数字(即命令中的Xmx2048
和Xms2048
).
为了让其他玩家加入服务器, 你还需要一个公网IP或者是一个内网穿透工具. 因为我没有公网IP, 所以我果断选择了后者.
我在这里使用了Sakurafrp, 如果你实在找不到合适的内网穿透工具, 不妨试试它
最后, 打开Minecraft, 进入服务器, 就可以和朋友一起玩了.
这也代表着一台旧手机重获了新生
你可以去 这里 看看
或者去这个项目的 Github仓库 看看
简单地说, 这个生成器的使用方法非常简单
你可以在输入框中输入你要生成的函数, 然后点击生成即可
如果你想要保存某个函数, 你可以直接在书签栏中添加:
https://nin.red/using/function-painting/?fx={你想添加的函数}
如果你好奇这个游戏的操作原理, 那么你可以去这个工程的 Github仓库 看看, 或者继续往下看.
在源代码 lib.js 中, 你可以在 setCommand()
方法中找到下面的代码:
1 | // command 是要设置的指令名称 |
代码解释
将要设置的指令定义为全局变量, 接着为这个全局变量设置getter.
这样, 当你在控制台输入指令时, getter便会执行刚刚设置的程序.
]]>Demo: 查看demo
插件截图:
话说这已经不是我第一次开博客了吧….awa