【问题标题】:How to draw an image over another?如何在另一个上绘制图像?
【发布时间】:2015-02-08 00:15:09
【问题描述】:

所以我正在为一个班级做一个项目。我已经为这个问题苦苦挣扎了一段时间。下面的代码是一个开始屏幕,当按下回车键时(当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.");
        }
    }
}

【问题讨论】:

  • 与其走这条路,你需要看看场景图并了解它们是如何运作的。这将需要一些前期投资,但从长远来看,如果你追求制作一款真正的游戏,这将是完全值得的。 (看一看:docs.oracle.com/javafx/2/scenegraph/jfxpub-scenegraph.htm
  • 这似乎很有趣,我可能会看看它,因为它看起来是件好事。但目前我有时间限制。
  • 即使您不使用 javafx 场景图,您仍然需要在 paintComponent 方法中构建需要渲染的对象图;然后keyPressed 事件可以修改该图形并调用一个方法来指示画布重新绘制。

标签: java 2d-games


【解决方案1】:

如果您使用 JPanel,您应该:

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

Referenced here

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

也许尝试完全远离 JPanel 和 Swing(不适合游戏,但适合表单),只使用带有 Window、Frame 和 Canvas 的 graphics2D 功能,如先前评论中所建议的那样。

【讨论】:

    【解决方案2】:

    您需要调用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){
    
                        }
    
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2021-12-19
      • 2012-06-15
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      相关资源
      最近更新 更多