很长一段时间以来,我一直在研究一个简单的 2D Java 自上而下的射击游戏。到目前为止,我有一个 graphics2D 主菜单,它在用户按下回车键之前一直呈现。
我想要一个工作菜单系统,其中三个可点击区域(播放、选项、退出)可将您带到其他屏幕或菜单。我曾尝试用 swing 来做到这一点,但到目前为止还没有成功。
这是当前的绘图类。render 方法检查它应该绘制哪个菜单(int),然后继续所有需要的 g.draw...。
public class Draw extends Canvas {
private static final long serialVersionUID = 1L;
JFrame frame;
Canvas canvas;
JPanel panel;
private Font customFont;
BufferStrategy bufferStrategy;
public static int WIDTH = 640;
public static int HEIGHT = 640;
public static int menu = 0;
Game game;
@SuppressWarnings("unused")
private BufferedImage titleImage;
Info infoFrame;
public Draw(Game game) {
initFont();
this.game = game;
this.frame = new JFrame("A Hard CUBE Life");
panel = (JPanel) frame.getContentPane();
panel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
panel.setLayout(null);
this.canvas = new Canvas();
this.canvas.setBounds(0, 0, WIDTH, HEIGHT);
this.canvas.setIgnoreRepaint(true);
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
infoFrame = new Info(game);
this.infoFrame.setLocation(0, 540);
this.frame.add(this.infoFrame);
this.frame.pack();
this.frame.setResizable(false);
this.frame.setVisible(true);
panel.add(this.canvas);
this.canvas.createBufferStrategy(2);
this.bufferStrategy = this.canvas.getBufferStrategy();
this.canvas.requestFocus();
this.canvas.setBackground(Color.GRAY);
this.canvas.addKeyListener(new ButtonHandler(game));
try {
titleImage = ImageIO.read(new File("res/title.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void render() {
Graphics2D g = (Graphics2D) this.bufferStrategy.getDrawGraphics();
if (menu == 0) {
g.clearRect(0, 0, 640, 640);
g.setFont(customFont);
// g.drawImage(titleImage, 0, 0, canvas);
g.drawString("A Hard", 100, 100);
g.drawString("Cube's Life", 150, 150);
g.drawString("(Press Enter)", 225, 450);
g.setFont(customFont.deriveFont(20f));
g.drawString("Version: " + "2.1.1", 10, 530);
g.drawString("Designed and Programmed by: Micky Lindsay", 310, 530);
g.setColor(new Color(200, 35, 35));
g.fillRect(400, 100, 100, 100);
g.setColor(Color.BLACK);
g.setStroke(new BasicStroke(3.0F));
g.drawRect(420, 120, 15, 15);
g.drawRect(465, 120, 15, 15);
g.drawRect(430, 165, 40, 5);
g.setColor(Color.WHITE);
g.fillRect(100, 400, 25, 25);
g.setColor(Color.BLACK);
g.drawRect(110, 403, 5, 5);
g.setColor(Color.YELLOW);
g.fillRect(112, 365, 3, 3);
g.fillRect(112, 375, 3, 3);
g.fillRect(112, 385, 3, 3);
}
if (menu == 1) {
g.setStroke(new BasicStroke(1.0F));
Font font = new Font("Arial", 1, 15);
g.setFont(font);
g.clearRect(0, 0, WIDTH, HEIGHT);
for (Cube e : game.cubes) {
e.render(g);
}
for (Bullet b : game.bullets) {
b.render(g);
}
}
this.infoFrame.displayDetails();
if (menu == 2) {
g.setFont(new Font("Ariel", 1, 50));
g.setColor(Color.LIGHT_GRAY);
g.fillRect(125, 250, 360, 70);
g.setColor(Color.GRAY);
g.drawString("GAME OVER", 150, 300);
}
g.dispose();
this.bufferStrategy.show();
}
public void initFont() {
try {
// create the font to use. Specify the size!
customFont = Font.createFont(Font.TRUETYPE_FONT,
new File("res/Andy Bold.ttf")).deriveFont(50f);
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
// register the font
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(
"res/Andy Bold.ttf")));
} catch (IOException e) {
e.printStackTrace();
} catch (FontFormatException e) {
e.printStackTrace();
}
无论是否涉及摇摆,如何以最有效的方式完成这项工作?