好吧,这听起来像是一个疯狂的想法 - 但我有兴趣用纯Java模拟一个20世纪80年代风格的roguelike game文本界面,即使用Swing或类似的东西。
这大致是它需要做的事情:
任何人都知道有一个好的现有解决方案可以实现这个目标吗?或者我是不是从头开始一起黑客攻击?
P.S。我想要纯Java的原因是它可以在沙盒applet中运行。所以像jcurses这样的JNI解决方案被遗憾地排除了......
答案 0 :(得分:9)
根本不疯狂,这是我在Legerdemain中实施的方法:http://roguelikefiction.com
我使用二维数组字符(char [] [])和相应的java.awt.Color [] []对象数组来跟踪颜色。您可以将这些数组推送到一个继承自JPanel(后者又是JFrame的一部分)的类中,并在面板的paintComponent()回调中执行所有绘制。
Curses / JNI方法没有任何问题,尽管如果你使用Swing路由,你会得到各种很棒的Unicode字形。 Legerdemain使用五六百个。
答案 1 :(得分:4)
对于这类项目,我发现必须严格区分游戏模型和视图。这个简单的example表示整体架构,这个更复杂的game扩展了这个概念。好处是视图可以与游戏本身分开进行,游戏本身并不关心听取视图的样子。
对于符号,Unicode字形可能是一个吸引人的选项,如example中所述。
答案 2 :(得分:3)
提供固定大小的固定网格 大小字符作为“屏幕”(例如 100 * 75)
string [] screen = new string [75],然后用100个空格填充每个:)。
使用适当的等宽字体, 理想情况下有很多有趣的 符号
请参阅此链接以获取一些好的链接:http://cg.scs.carleton.ca/~luc/mono.html
允许设置前景和 每个背景字符颜色 单独的角色位置
您可以通过使用允许像JEditorPane一样呈现HTML的控件来获得这些文本效果。这样您就可以将特殊关键字定义为“特殊关键字”。 (好吧有点弃用,但应该适用于你的情况。如果你将'游戏状态'存储为普通字符串(数组),但在输出它之前渲染html,这将是最简单的。
允许打印字符串或 在任何地方的个人角色 屏幕(应该覆盖 屏幕上已有的内容 这些地方的缓冲区)
如果您在上一个问题中遵循我的建议而不是将您的游戏状态作为普通字符串数组,那么您只需找到您的行的字符串,找到使用string.substring(length)+“A”+ string.substring( startindex:length + 2,string.length - (length + 2));建立你的新游戏状态。
答案 3 :(得分:2)
我曾经(几年前)开始编写类似这样的东西(Swing中的终端实现)。 我得到的结论是,我可以显示带有ANSI转义序列的文本,用于光标移动和颜色,但没有实现任何输入。如果你有兴趣,我会把它挖出来。
答案 4 :(得分:2)
由于你正在谈论流氓和基于角色的界面,以便完成过去的旅行,为什么不google for Curses C实现并使用JNI进行View。您的模型和控制器是常规Java。几乎每个平台都有Curses个实现。
答案 5 :(得分:1)