Java 为简单GUI游戏创建登录系统扩展画布

Java 为简单GUI游戏创建登录系统扩展画布,java,swing,user-interface,canvas,awt,Java,Swing,User Interface,Canvas,Awt,我创建了一个类似于pacman的游戏,它扩展了画布并实现了Runnable。编译和运行游戏时,游戏显示“请按enter开始”屏幕,然后游戏立即开始 我想创建一个简单的登录系统,允许用户创建用户名和密码。然后可以使用该用户名登录并开始游戏 我得到了一个使用JDialog的示例登录系统,但该登录仅作为一个单独的项目工作。如果包含在游戏中,则不会显示 这是因为Canvas是awt对象,而JDialog、JPanels等是swing对象吗 让登录系统工作的最简单方法是什么 (我是编程新手,因此正在寻找一

我创建了一个类似于pacman的游戏,它扩展了画布并实现了Runnable。编译和运行游戏时,游戏显示“请按enter开始”屏幕,然后游戏立即开始

我想创建一个简单的登录系统,允许用户创建用户名和密码。然后可以使用该用户名登录并开始游戏

我得到了一个使用JDialog的示例登录系统,但该登录仅作为一个单独的项目工作。如果包含在游戏中,则不会显示

这是因为Canvas是awt对象,而JDialog、JPanels等是swing对象吗

让登录系统工作的最简单方法是什么

(我是编程新手,因此正在寻找一个简单的解决方案) 以下是主类中的代码:

public class Game extends Canvas implements Runnable, KeyListener {
private boolean isRunning = false;
private static boolean gameStart = false;
public static final int WIDTH = 640, HEIGHT = 480;
public static final int boxWidth = 400, boxHeight = 250;
public static final int xx = Game.WIDTH / 2 - boxWidth / 2;
public static final int yy = Game.HEIGHT / 2 - boxHeight / 2;
public static final String TITLE = "Simple Strategic Game";
private Thread thread;
public static Player player;
public static Level level;
public static final int START_SCREEN = 0, GAME = 1;
public static int STATE = -1;
public boolean isEnter = false;
private int time = 0;
private int targetFrames = 30;
private boolean showText = true;

public Game(){
    Dimension dimension = new Dimension(Game.WIDTH, Game.HEIGHT);
    setPreferredSize(dimension);
    setMinimumSize(dimension);
    setMaximumSize(dimension);
    addKeyListener(this);
    STATE = START_SCREEN;   
}

private synchronized void start(){
        if(isRunning) return;
        isRunning = true;
        thread = new Thread(this);
        thread.start();
}

public synchronized void stop(){
    if(isRunning) return;
    isRunning = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private void tick(){

    if(STATE == GAME){
    player.tick();
    level.tick();
    } else if(STATE == START_SCREEN){
        time++;
        if(time == targetFrames){
            time = 0;
            if(showText){
                showText = false;   
            }else{
                showText = true;
            }
        }
        if(isEnter){
            isEnter = false;
            player = new Player(Game.WIDTH/2, Game.HEIGHT/2);                   //Starts player in middle of screen
            level = new Level("/map/map.png");
            STATE = GAME;
        }
    }
}

private void render(){
    BufferStrategy bs = getBufferStrategy();
    if(bs == null)
    {
        createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.black);
    g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT);
    if(STATE == GAME){
    player.render(g);
    level.render(g);
    }else if(STATE == START_SCREEN){
        g.setColor(new Color(120,157,213));
        g.fillRect(xx, yy, boxWidth, boxHeight);

        g.setColor(Color.white);
        g.setFont(new Font(Font.DIALOG, Font.BOLD, 19));
        if(showText) g.drawString("Press Enter to start the Game", xx+60, yy+100);

    }
    g.dispose();
    bs.show();  
}

@Override
public void run() {
    requestFocus();
    int fps = 0;
    double timer = System.currentTimeMillis();
    long lastTime = System.nanoTime();
    double targetTick = 60.0;
    double delta = 0;
    double ns = 1000000000 / targetTick;

    while(isRunning){
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;

        while (delta >= 1){
            tick();
            render();
            fps++;
            delta--;
        }
        if(System.currentTimeMillis() - timer >= 1000){
            System.out.println(fps);
            fps = 0;
            timer += 1000;
        }
    }
    stop();
}

public static void main(String[] args){
    Game game = new Game();
    JFrame frame = new JFrame(Game.TITLE);
    frame.add(game);
    frame.setResizable(false);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    game.start();   
}

@Override
public void keyPressed(KeyEvent e) {
    if(STATE == GAME){
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) player.right = true;
        if(e.getKeyCode() == KeyEvent.VK_LEFT) player.left = true;
        if(e.getKeyCode() == KeyEvent.VK_UP) player.up = true;
        if(e.getKeyCode() == KeyEvent.VK_DOWN) player.down = true;
    } else if(STATE == Game.START_SCREEN){
        if(e.getKeyCode() == KeyEvent.VK_ENTER){
            isEnter = true;
        }
    }
}

@Override
public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_RIGHT) player.right = false;
    if(e.getKeyCode() == KeyEvent.VK_LEFT) player.left = false;
    if(e.getKeyCode() == KeyEvent.VK_UP) player.up = false;
    if(e.getKeyCode() == KeyEvent.VK_DOWN) player.down = false;
}
@Override
public void keyTyped(KeyEvent e) {}
}

你想让我们为你编码吗?只是想建议我应该使用什么工具。我尝试了swing工具,但无法使其工作..“我尝试了swing工具,但无法使其工作..”然后你应该集中精力修复它。任何其他工具都将面临同样的挑战。“我得到了一个使用JDialog的示例登录系统,但该登录仅作为一个单独的项目工作。”问题显然是IDE将您用作它的从属对象。暂时把它放在一边,学习如何编写Java代码。感谢andrew,我将继续学习基础知识
静态
静态
无处不在-
静态
不是跨对象通信解决方案,您需要开始思考如何不依赖它