简单游戏的背景图片?

时间:2012-08-22 23:15:25

标签: java image swing background-image

我一直在关注Java Game Programming for Beginners教程系列,并希望通过应用背景图片进行实验。不幸的是,当我通过paintComponent方法渲染它时,它会随着我的精灵移动(虽然连续一个单位而不是五个);当我通过paint方法渲染它时,我得到一个奇怪的,闪烁的框,它与setBackground (color)的{​​{1}}属性中指定的颜色相匹配,并且它的精灵与前一个实例的精灵相同(在JFrame内)。

我如何编码图像以保持静态,因为背景应该是?

代码:

paintComponent

图片:

rendered through 'paint' rendered through 'paintComponent'

1 个答案:

答案 0 :(得分:6)

您是随机复制/粘贴代码吗?这就是它的样子。这段代码有很多奇怪的方面,我没有记录它们(可能是一个很好的代码审查)。该示例使用异步方法加载图像(为了获取动画图像,动画)。使用ImageIO.read(URL)以同步方式加载静态图像。

以下是一些简短的提示:

  1. 到部署时,图像很可能成为嵌入式资源,File对象无法访问。将它们添加到运行时类路径并通过URL访问它们。
  2. 应在EDT上启动和更改Swing GUI(请参阅对main()的更改)。
  3. 始终在方法开头调用super.paint(g);(或paintComponent(g))。
  4. 不要延伸框架,不要绘制到顶级组件。而是扩展面板并覆盖paintComponent()。将面板添加到框架中。
  5. 代码

    import java.awt.*;
    import java.awt.event.*;
    import java.net.URL;
    import javax.swing.*;
    
    public class JavaGame extends JPanel {
    
        int x, y;
        private Image dbImage;
        private Graphics dbg;
        Image ghost;
        Image bg;
    
        public class AL extends KeyAdapter {
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
    
                if (keyCode == e.VK_LEFT) {
                    if (x <= 8)
                        x = 8;
                    else
                        x += -5;
                }
                if (keyCode == e.VK_RIGHT) {
                    if (x >= 235)
                        x = 235;
                    else
                        x += +5;
                }
                if (keyCode == e.VK_UP) {
                    if (y <= 18)
                        y = 18;
                    else
                        y += -5;
                }
                if (keyCode == e.VK_DOWN) {
                    if (y >= 235)
                        y = 235;
                    else
                        y += +5;
                }
            }
    
            public void keyReleased(KeyEvent e) {
            }
        }
    
        public JavaGame() throws Exception {
            // Load images
            //ImageIcon i = new ImageIcon(
                //  "C:/Users/Taylor/workspace/Java game/src/ghost.png");
            URL urlGhost = new URL("http://1point1c.org/gif/thum/plnttm.gif");
            ghost = Toolkit.getDefaultToolkit().createImage(urlGhost);
    
            //ImageIcon j = new ImageIcon(
                //  "C:/Users/Taylor/workspace/Java game/src/bg.png");
            URL urlBG = new URL("http://pscode.org/media/stromlo2.jpg");
            bg = Toolkit.getDefaultToolkit().createImage(urlBG);
    
            setFocusable(true);
    
            // Game properties
            addKeyListener(new AL());
            x = 150;
            y = 150;
    
            ActionListener al = new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    repaint();
                }
            };
            Timer timer = new Timer(50,al);
            timer.start();
        }
    
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(bg, 0, 0, null);
    
            //dbImage = createImage(getWidth(), getHeight());
            //dbg = dbImage.getGraphics();
            //paintComponent(dbg);
            g.drawImage(dbImage, x, y, this);
    
            g.setColor(Color.WHITE);
            g.drawImage(ghost, x, y, this);
    
            //repaint();
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    try {
                        JFrame f = new JFrame("Java Game");
                        f.setSize(500, 500);
                        f.setResizable(false);
                        f.setVisible(true);
                        f.setBackground(Color.GRAY);
                        f.setContentPane(new JavaGame());
                        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }