Java 简单游戏的背景图像?

Java 简单游戏的背景图像?,java,image,swing,background-image,Java,Image,Swing,Background Image,我一直在关注教程系列,并希望通过应用背景图像进行实验。不幸的是,当我通过paintComponent方法渲染它时,它会随着我的精灵一起移动(虽然是连续一个单位,而不是五个单位);当我通过paint方法渲染它时,我得到一个奇怪的、闪烁的框,它与JFrame的setBackground(color)属性中指定的颜色相匹配,并且它与精灵一起移动,与前一个实例相同(在paintComponent中) 我如何对图像进行编码,使其保持静态,就像背景一样 代码: public类JavaGame扩展JFrame

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

我如何对图像进行编码,使其保持静态,就像背景一样

代码:

public类JavaGame扩展JFrame{
int x,y;
私有镜像dbImage;
专用图形数据库;
影像鬼;
图像背景;
公共类AL扩展了KeyAdapter{
按下公共无效键(按键事件e){
int keyCode=e.getKeyCode();
if(keyCode==e.VK_左){
如果(x=235)
x=235;
其他的
x+=+5;
}
if(keyCode==e.VK\u UP){
如果(y=235)
y=235;
其他的
y+=+5;
}
}
公共无效密钥已释放(密钥事件e){
}
}
公共JavaGame(){
//加载图像
ImageIcon i=newImageIcon(“C:/Users/Taylor/workspace/javagame/src/ghost.png”);
ghost=i.getImage();
ImageIcon j=新的ImageIcon(“C:/Users/Taylor/workspace/Java game/src/bg.png”);
bg=j.getImage();
//游戏属性
addKeyListener(新AL());
setTitle(“Java游戏”);
设置大小(500500);
可设置大小(假);
setVisible(真);
挫折背景(颜色:灰色);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x=150;
y=150;
}
公共空间涂料(图g){
g、 drawImage(bg,0,0,null);
dbImage=createImage(getWidth(),getHeight());
dbg=dbImage.getGraphics();
油漆组件(dbg);
g、 drawImage(dbImage,x,y,this);
}
公共组件(图形g){
g、 setColor(Color.WHITE);
g、 drawImage(鬼,x,y,this);
重新油漆();
}
公共静态void main(字符串[]args){
新JavaGame();
}
图片:


你是随机复制/粘贴代码的吗?这就是它看起来的样子。该代码有太多奇怪的方面,我没有将它们全部记录下来(可能是代码审查的好方面)。该示例使用异步方法加载图像(为了获得动画图像,制作动画)。使用
ImageIO.read(URL)
以同步方式加载静态图像

以下是一些简短的提示:

  • 部署时,映像可能会成为嵌入式资源,并且无法通过
    文件
    对象访问。请将它们添加到运行时类路径,然后通过URL访问它们
  • Swing GUI应该在EDT上启动和更改(请参阅对
    main()
    的更改)
  • 始终在方法开始时调用
    super.paint(g);
    (或
    paintComponent(g)
  • 不要扩展框架,不要绘制顶层组件。而是扩展面板并覆盖
    paintComponent()
    。将面板添加到框架
  • 代码
    import java.awt.*;
    导入java.awt.event.*;
    导入java.net.URL;
    导入javax.swing.*;
    公共类JavaGame扩展了JPanel{
    int x,y;
    私有镜像dbImage;
    专用图形数据库;
    影像鬼;
    图像背景;
    公共类AL扩展了KeyAdapter{
    按下公共无效键(按键事件e){
    int keyCode=e.getKeyCode();
    if(keyCode==e.VK_左){
    如果(x=235)
    x=235;
    其他的
    x+=+5;
    }
    if(keyCode==e.VK\u UP){
    如果(y=235)
    y=235;
    其他的
    y+=+5;
    }
    }
    公共无效密钥已释放(密钥事件e){
    }
    }
    publicJavaGame()引发异常{
    //加载图像
    //ImageIcon i=新的ImageIcon(
    //“C:/Users/Taylor/workspace/Java game/src/ghost.png”);
    URL urlGhost=新URL(“http://1point1c.org/gif/thum/plnttm.gif");
    ghost=Toolkit.getDefaultToolkit().createImage(urlGhost);
    //ImageIcon j=新的ImageIcon(
    //“C:/Users/Taylor/workspace/Java game/src/bg.png”);
    URL urlBG=新URL(“http://pscode.org/media/stromlo2.jpg");
    bg=Toolkit.getDefaultToolkit().createImage(urlBG);
    设置聚焦(真);
    //游戏属性
    addKeyListener(新AL());
    x=150;
    y=150;
    ActionListener al=新的ActionListener(){
    已执行的公共无效行动(行动事件ae){
    重新油漆();
    }
    };
    定时器=新定时器(50,al);
    timer.start();
    }
    公共组件(图形g){
    超级组件(g);
    g、 drawImage(bg,0,0,null);
    //dbImage=createImage(getWidth(),getHeight());
    //dbg=dbImage.getGraphics();
    //油漆组件(dbg);
    g、 drawImage(dbImage,x,y,this);
    g、 setColor(Color.WHITE);
    g、 drawImage(鬼,x,y,this);
    //重新油漆();
    }
    公共静态void main(字符串[]args){
    SwingUtilities.invokeLater(新的Runnable(){
    公开募捐{
    试一试{
    JFrame f=新的JFrame(“Java游戏”);
    f、 设置大小(500500);
    f、 可设置大小(假);
    f、 setVisible(真);
    f、 挫折背景(颜色:灰色);
    f、 setContentPane(新JavaGame());
    f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }捕获(例外e){
    e、 printStackTrace();
    }
    }
    });
    }
    }
    
    通常,在拍摄屏幕截图时,应编辑它们,使其仅包括
    public class JavaGame extends JFrame{
    
    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(){
        //Load images
        ImageIcon i = new ImageIcon("C:/Users/Taylor/workspace/Java game/src/ghost.png");
        ghost = i.getImage();
    
        ImageIcon j = new ImageIcon("C:/Users/Taylor/workspace/Java game/src/bg.png");
        bg = j.getImage();
    
        //Game properties
        addKeyListener(new AL());
        setTitle("Java Game");
        setSize(500, 500);
        setResizable(false);
        setVisible(true);
        setBackground(Color.GRAY);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        x = 150;
        y = 150;
    }
    
    public void paint(Graphics g){
        g.drawImage(bg, 0, 0, null);
    
        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paintComponent(dbg);
        g.drawImage(dbImage, x, y, this);
    }
    
    public void paintComponent(Graphics g){
        g.setColor(Color.WHITE);
        g.drawImage(ghost, x, y, this);
    
        repaint();
    }
    
    
    public static void main(String[] args) {
        new JavaGame();
    
    }
    
    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();
                    }
                }
            });
        }
    }