9

好的,这听起来像是一个疯狂的想法——但我有兴趣在纯 Java 中模拟 1980 年代风格的roguelike 游戏文本界面,即使用 Swing 或类似的。

以下是它大致需要做的事情:

  • 提供固定大小字符的固定大小网格作为“屏幕”(例如 100*75)
  • 使用合适的等宽字体,最好有很多有趣的符号
  • 允许为每个字符位置单独设置前景色和背景色
  • 允许在屏幕的任何位置打印字符串或单个字符(这应该覆盖这些位置的屏幕缓冲区中已经存在的任何内容)

任何人都知道可以实现这一点的良好现有解决方案吗?还是我坚持从头开始破解一个?

ps我想要纯Java的原因是它可以在沙盒小程序中运行。所以像jcurses这样的JNI解决方案很遗憾被排除在外......

4

6 回答 6

9

一点也不疯狂,这是我在 Legerdemain 中实现的方法:http: //roguelikefiction.com

我使用了一个二维字符数组 (char[][]) 和对应的 java.awt.Color[][] 对象数组来跟踪颜色。您可以将这些数组推入一个继承自 JPanel 的类(它又是 JFrame 的一部分),并在面板的 paintComponent() 回调中完成所有绘图。

Curses/JNI 方法也没有什么问题,尽管如果你走 Swing 路线,你会得到各种很棒的 Unicode 字形。Legerdemain 使用了五六百个。

于 2011-02-04T12:00:42.570 回答
4

对于此类项目,我发现严格分离游戏模型和视图至关重要。这个简单的例子暗示了整体架构,这个更复杂的游戏扩展了这个概念。好处是视图可以与游戏本身分开发展,这并不关心收听视图的样子。

对于符号,Unicode 字形可能是一个吸引人的选项,如本示例中所建议的那样。

于 2011-02-02T21:03:07.517 回答
3

提供固定大小字符的固定大小网格作为“屏幕”(例如 100*75)

string[] screen = new string[75],然后用 100 个空格填充每个 :)。

使用合适的等宽字体,最好有很多有趣的符号

请参阅此链接以获取一些好的链接:http ://cg.scs.carleton.ca/~luc/mono.html

允许为每个字符位置单独设置前景色和背景色

您可以通过使用允许呈现 HTML 的控件(如 JEditorPane)来获得这些文本效果。这样您就可以将特殊关键字定义为“特殊关键字”。(好吧,这有点过时,但应该适合您的情况。如果您将“游戏状态”存储为普通字符串(数组),但在输出之前渲染 html,这将是最简单的。

允许在屏幕的任何位置打印字符串或单个字符(这应该覆盖这些位置的屏幕缓冲区中已经存在的任何内容)

如果您在上一个问题中遵循了我的建议,而不是将游戏状态作为普通字符串数组,那么您只需找到您的行的字符串,找到 use string.substring(length) + "A" + string.substring(startindex: length + 2, string.length - (长度 + 2)); 来构建你的新游戏状态。

于 2011-02-02T21:02:32.197 回答
2

我曾经(几年前)开始编写类似这样的代码(Swing 中的终端实现)。我已经到了可以显示带有 ANSI 转义序列的文本以用于光标移动和颜色的地步,但没有实现任何输入。如果你有兴趣,我会挖出来。

于 2011-02-02T20:51:19.303 回答
2

既然您正在谈论基于流氓和字符的界面,以便完成过去的旅程,您为什么不谷歌搜索 Curses C 实现并使用 JNI 进行查看。您的模型和控制器是普通的 Java。几乎每个平台都有一个Curses实现。

于 2011-02-02T21:15:51.170 回答
1

我最终实现了一个简单的 Swing 控制台,灵感来自这里的许多答案(谢谢大家!)

对于那些感兴趣的人,它可以在这里获得:

基于 Swing 的 Java 文本控制台

于 2011-02-10T23:11:29.347 回答