杀戮尖塔Mod中RawPatch的探索
在做杀戮尖塔Mod的时候,Patch是个常用工具,用来在原版游戏里面各处插入代码。不过最经常用的都是PrefixPatch、InsertPatch、PostfixPatch这种直接在特定地方插入代码,最多用用InstrumentPatch,像RawPatch几乎不会用到。但如果要做一些复杂的功能,只插入一些代码完成不了的时候,就需要使用RawPatch了。 使用方法 和其他Patch类似,RawP […]
在做杀戮尖塔Mod的时候,Patch是个常用工具,用来在原版游戏里面各处插入代码。不过最经常用的都是PrefixPatch、InsertPatch、PostfixPatch这种直接在特定地方插入代码,最多用用InstrumentPatch,像RawPatch几乎不会用到。但如果要做一些复杂的功能,只插入一些代码完成不了的时候,就需要使用RawPatch了。 使用方法 和其他Patch类似,RawP […]
在8月中,我玩上了《杀戮尖塔(Slay the Spire)》这个游戏,它是个卡牌Rouge-like游戏。通关之后,看着早期卡牌的灵魂画风,突然产生了一种我也能行的感觉,做Mod之魂在熊熊燃烧。因为我不擅长绘画,所以很多时候都光有想法不会去实现的,这次觉得行,就开始吧。 从有想法到发布到Steam创意工坊用了不到两个月时间,写这个文章就是总结一下我为了做Mod实际做了什么,什么花了较多的时间。如 […]
现在用到CoreMod的地方比较少了,大部分功能都不需要用CoreMod修改原本的Minecraft代码,而是能用钩子或者类继承的方式完成。不过还是有很多地方需要它,我自己的一个CoreMod仍然需要修改原本的代码,现在Minecraft都已经1.16.1了,Minecraft Forge也支持到了1.15.2。而1.13版本CoreMod机制做了次大改,我之前为1.12.2做的CoreMod都不 […]
这里已经和PHP+MySQL没什么关系了。我有一些自己写的服务器也需要迁移,索性就也用Docker吧。 首先是创建目录,将相关的文件都放进去,并创建Dockerfile: 在Dockerfile里输入内容: 因为这是个Java程序,所以Docker的来源要是包含Java运行时才行,这里我选用了openjdk:8-alpine,应该是最小,功能最少的一个,不过够用了。接下来的RUN和COPY语句在容 […]
简介 记录日志在很多情况下都是必需的。但很多时候,日志与逻辑的代码混杂,让人难以阅读代码。如果能将记录日志与代码逻辑分离,就可以在满足日志需求的同时,让代码更加简明了。可以使用aspectj来达到这一目的。 aspectj提供了面向切面编程的功能。他可以“切开”原本的代码,并在切面上插入另一些代码,达到更改代码的目的。这个功能正适合于记录日志的场景。 在项目中使用aspectj 因为aspectj […]
Java,或者说JDK自带了以下性能分析工具。如已经安装了Java,则可以在cmd下使用以下命令来分析Java的运行状态。 jcmd:打印一个 Java 进程的类,线程以及虚拟机信息。适合用在脚本中。使用 jcmd – h 来查看使用方法。 jconsole:提供 JVM 活动的图形化展示,包括线程使用,类使用以及垃圾回收(GC)信息。 jhat:帮助分析内存堆存储。 jmap:提供 […]
前言 大约是一周半前,女朋友说她想要练习写Java。我想了一下,觉得要练一种编程语言,不如就用那种语言写点东西,在实践中学到这种语言的用法。于是我就提出,不如做一个NES模拟器吧。既练习了Java,又复习了一些底层相关的课程,又可以用来玩,岂不是一举三得?她欣然接受。然而,我没想到的是,编写模拟器并非如此简单,其中的坑非常多。 收集文档 毕竟是20多年前的主机,NES的相关资料并不难找,在网上搜一 […]
先看如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class InitializationTest { abstract class Base { method() def method(): Unit } class Subclass extends Base { val obj = new Object override def method(): Unit = { println(obj) } } @Test def doTest(): Unit = { new Subclass() } } |
以doTest为入口,这个程序的输出是: null 和期望不一样啊! 原因是Scala以整个类中的内容为构造方法,执行顺序是从基类到子类。运行method时,obj还没有初始化,于是就返回了null。 因为obj不可变,所以这里也不能直接初始化。真正的解决方法是使用lazy关键字,它可以让成员在第一次使用时被初始化。 […]
Java Swing的默认主题很丑,有时候我们想让它和Windows或者Linux主题一致,这样看起来和Windows或Linux的窗体一样。 要完成这件事其实很简单,只需要在主函数中加入如下代码即可:
1 2 3 4 5 |
try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } |
前段时间有需要用到生成GIF动画的地方,搜索了一下,但是并没有发现有库来做这件事情,见得比较多的是由Kevin Weiner编写的AnimatedGifEncoder.java。其作者授权所有人可以以任何方式使用这份代码,但是需要注意代码中所使用的LZW算法由Unisys掌握专利权。不过鉴于此专利在2006年就已经在大部分国家及地区过期了,所以现在应该可以放心地使用了。 AnimatedGifEn […]