我正在开发一个用Java编写的基于文本的冒险游戏,想知道是否有一种方法可以强制使用某种终端字体,以确保某些字符以一致的方式间隔以“绘制”事物例如关卡地图和UI元素。
从SO上的一些研究中,我看到System.out无法使用指定的字体,它实际上取决于最终用户的控制台/终端字体设置。
我已经实现了一个bash脚本,以在启动过程中获取用户终端当前调整大小的行数,并将这些值写入到我的Java代码随后读取的文件中。
有没有一种方法可以通过Java或游戏启动脚本在游戏加载之前让最终用户的终端使用某种字体?有没有人用自己的基于文本的游戏来处理此类问题?最好只是告知最终用户,最好使用某种字体(等距,无衬线字体)以获得最佳游戏体验?
答案 0 :(得分:0)
实际上这很容易。您应该做的是使用JTextPane或JTextArea创建自己的控制台窗口,然后将打印流重定向到该窗口。这是一个示例:
import javax.swing.*;
import java.awt.*;
import java.io.OutputStream;
import java.io.PrintStream;
class Example {
public static void main(String[] args) {
ConsoleWindow printWindow = new ConsoleWindow().fixPosition();
PrintStream stream = new PrintStream(new CustomOutputStream(printWindow.jTextArea));
System.setOut(stream);
System.setErr(stream);
System.out.println("This is a custom console window.");
}
}
class CustomOutputStream extends OutputStream {
private JTextArea textArea;
CustomOutputStream(JTextArea textArea) {
this.textArea = textArea;
}
@Override
public void write(int b) {
textArea.append(String.valueOf((char) b));
textArea.setCaretPosition(textArea.getDocument().getLength());
}
}
class ConsoleWindow {
private JFrame frame = new JFrame();
private JPanel panel = new JPanel();
JTextArea jTextArea = new JTextArea();
private JScrollPane jScrollPane = new JScrollPane(jTextArea);
ConsoleWindow() {
new Thread(() -> {
setupFrame();
setupPanels();
setupTextArea();
setupScrolling();
makeVisible();
}).start();
}
private void setupFrame() {
frame.setSize(854, 480);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setContentPane(panel);
frame.setLayout(null);
}
private void setupPanels() {
panel.setSize(panel.getParent().getSize());
panel.setLayout(new GridLayout());
panel.add(jScrollPane);
}
private void setupTextArea() {
jTextArea.setFont(new Font("Ariel", Font.PLAIN, 20)); // TERMINAL FONT
jTextArea.setBackground(Color.BLACK); // TERMINAL COLOR
jTextArea.setForeground(Color.GREEN); // TEXT COLOR
}
private void setupScrolling() {
}
private void makeVisible() {
frame.setVisible(true);
}
ConsoleWindow fixPosition() {
jScrollPane.getHorizontalScrollBar().setValue(0);
jScrollPane.getVerticalScrollBar().setValue(0);
return this;
}
}