如何在另一个上绘制图像?

时间:2014-12-09 22:37:47

标签: java 2d-games

所以我正在为一个班级的项目工作。我一直在努力解决这个问题。下面的代码是一个开始屏幕,当按下回车键时(当atTitle变为假时)我希望它绘制下一个图像。问题是我无法想到它在下一个图像变为假时绘制的方法。我尝试过使用ifs和whiles。主要问题是你显然在if语句中添加了另一个public void paintComponent。我无法将Graphics g变量带到KeyPressed方法。 我被卡住了。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    AffineTransform at = new AffineTransform();
    g2.setTransform(at);
    if (atTitle == true) {
        g.drawImage(titlescreen, 0, 0, this);
        if (start_visible == true) {
            g.drawImage(start_symbol, -70, 30, this);
            jf.addKeyListener(this);
        }
    }
}

public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}

public void keyPressed(KeyEvent e) {
    //int keyCode = e.getKeyCode();
    if (atTitle == true) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            atTitle = false;
            System.out.println("It Works.");
        }
    }
}

2 个答案:

答案 0 :(得分:0)

如果你使用JPanel,你应该:

panel.setFocusable(true);
panel.requestFocusInWindow();

Referenced here

您也可以在按键中调用panel.revalidate()和/或panel.repaint()。

也许试图完全远离JPanel和Swing(不适合游戏,但适用于表单),只需使用带有Window,Frame和Canvas的graphics2D功能,如之前的评论所示。

答案 1 :(得分:0)

您需要致电repaint并等待系统调用paint功能。你不应该保留graphic对象并在函数中使用它不是paint的子函数

作为一个简单的画布组件,你可以使用这个

class Game extends Canvas implements Runnable {
        private Thread thread;
        public Game(){
            thread = new Thread(this);
            thread.start();
        }
        @Override
        public void paint(Graphics g) {
            // paint your game
        }
        public void stop(){
            thread = null;
        }
        @Override
        public void run() {
            while (thread == Thread.currentThread()){
                long ti = System.currentTimeMillis();
                repaint();
                long ti2 = System.currentTimeMillis();
                long waitTime = 60 - (ti2-ti);
                if (waitTime > 0){
                    try {
                        Thread.sleep(waitTime);
                    } catch (Exception e){

                    }

                }
            }
        }
    }