繁体   English   中英

我的JFrame不会绘制任何选项

[英]My JFrame doesn't draw a string of options

在我的游戏中,我有不同的状态,第一个状态是主菜单。 但是,由于我的未知原因,它不会绘制该主菜单。

主要代码:

package Game.Window;

import java.awt.BorderLayout;

import javax.swing.JFrame;

public class Window {
    public static void main(String[] args){
        JFrame frame = new JFrame("TITLE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLayout(new BorderLayout());
        frame.add(new Game(), BorderLayout.CENTER);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

游戏代码:

package Game.Window;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

import Game.Framework.GameStateManager;

public class Game extends JPanel implements Runnable, KeyListener{
    private static final long serialVersionUID = 1L;

    public static final int WIDTH = 800;
    public static final int HEIGHT = WIDTH/12*9;

    private Thread thread;
    private boolean isRunning = true;

    private int FPS = 60;
    private long targetTime = 1000/FPS;

    private GameStateManager gsm;

    public Game(){
        setPreferredSize(new Dimension(WIDTH, HEIGHT));

        start();
    }
    private void start(){
        isRunning = true;
        thread = new Thread(this);
        thread.start();
    }
    public void run() {
        long start, elapsed, wait;

        gsm = new GameStateManager();

        while(isRunning){
            start = System.nanoTime();

            tick();
            repaint();

            elapsed = System.nanoTime();
            wait = targetTime - elapsed/1000000;

            if(wait <= 0){
                wait = 5;
            }
            try{
                Thread.sleep(wait);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    public void tick(){
        gsm.tick();

        // Shows Current FPS: System.out.println(FPS);
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);

        g.clearRect(0, 0, WIDTH, WIDTH);

        gsm.draw(g);
    }
    public void keyPressed(KeyEvent e) {
        gsm.keyPressed(e.getKeyCode());
    }
    public void keyReleased(KeyEvent e) {
        gsm.keyReleased(e.getKeyCode());
    }
    public void keyTyped(KeyEvent e) {

    }
}

GameStateManager代码:

package Game.Framework;

import java.awt.Graphics;
import java.util.Stack;

import Game.States.MainMenu;

public class GameStateManager {

    private Stack<GameState> states;

    public GameStateManager(){
        states = new Stack<GameState>();
        states.push(new MainMenu(this));
    }

    public void tick(){
        states.peek().tick();
    }

    public void draw(Graphics g){
        states.peek().draw(g);
    }

    public void keyPressed(int k){
        states.peek().keyPressed(k);
    }

    public void keyReleased(int k){
        states.peek().keyReleased(k);
    }
}

游戏状态码:

package Game.Framework;

import java.awt.Graphics;

public abstract class GameState {

    protected GameStateManager gsm;

    public GameState(GameStateManager gsm){
        this.gsm = gsm;
        init();
    }
    public abstract void init();
    public abstract void tick();
    public abstract void draw(Graphics g);
    public abstract void keyPressed(int k);
    public abstract void keyReleased(int k);
}

和主菜单代码:

package Game.States;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import Game.Framework.GameState;
import Game.Framework.GameStateManager;
import Game.Window.Game;

public class MainMenu extends GameState{

    private String[] options = {"New Game", "Load Game", "Options", "Exit"};
    private int currentSelection = 0;

    public MainMenu(GameStateManager gsm) {
        super(gsm);
    }
    public void init() {}

    public void tick() {

    }
    public void draw(Graphics g) {
        for(int i = 0; i < options.length; i++){
            if(i == currentSelection){
                g.setColor(Color.GREEN);
            }else{
                g.setColor(Color.BLACK);
            }
            g.setFont(new Font("Arial", Font.PLAIN, 24));
            g.drawString(options[i], Game.WIDTH/2-50, 50*i*30);
        }
    }
    public void keyPressed(int k) {

    }
    public void keyReleased(int k) {

    }
}

但是,我可以从游戏代码的65行绘制矩形。

您的数学似乎有点错误。

g.drawString(options[i], Game.WIDTH/2-50, 50 * i + 30); //add, not multiply^

其他几件事

class MainMenu extends GameState{

    //declare font once
    private static final Font ARIAL_24 = new Font("Arial", Font.PLAIN, 24);

    private String[] options = {"New Game", "Load Game", "Options", "Exit"};
    private int currentSelection = 0;

    public MainMenu(GameStateManager gsm) {
        super(gsm);
    }
    public void init() {}

    public void tick() {

    }
    public void draw(Graphics g) {
        for(int i = 0; i < options.length; i++){
            //simple ternary operator can replace what was here before.
            g.setColor(i == currentSelection ? Color.GREEN : Color.BLACK);

            //since this never changes make it static and final
            //avoid recreating objects in a paint method, or when not neccesary
            g.setFont(ARIAL_24); 
            g.drawString(options[i], Game.WIDTH/2-50, 50 * i + 30);
        }
    }
    public void keyPressed(int k) {

    }
    public void keyReleased(int k) {

    }
}

我认为您想从上到下绘制这些字符串,因此在MainMenu代码第32行中,“ y”的值应为“ 50 * i + 30”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM