1

我只是想为大学制作一个游戏,这是一个玩家用键盘导航以穿过迷宫的球。我唯一坚持的是我的背景是迷宫的图像,当我添加“球”时,它会重新绘制背景(默认颜色,无图像),当我注释掉油漆和油漆组件时,迷宫背景又回来了,但当然没有球。

我是 java 新手,我已经搜索过这个,但看不到我已经拥有的代码的好灵魂。它是 setOpaque 吗?isOpaque?....不透明甚至是正确的方向吗?

一旦我得到这个......我完全理解使用碰撞检测来检测与迷宫“墙”的碰撞

试图弄清楚这一点,刚接触java,会让一个成年人哭泣。

main.java

public class Main{

public static void main (String[] args){

    //System.out.println("Start of the Game");

    GameFrame game1 = new GameFrame();
}

JavaGame.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import java.io.File;
import java.io.IOException;


public class GameFrame extends JFrame{        

private int frameWidth = 240, frameHeight =315;
    int x, y;
    private Image dbImage;
    private Graphics dbg;

//Below is the constructor        

public GameFrame(){          

        super("OperationMaze!");
        addKeyListener(new AL());
        setResizable(false);
        //setTitle("OperationMaze!2");
        //setSize(250, 302);
        setSize(frameWidth, frameHeight); //Set height and width
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            


            //Because of opening file, there needs to be a try catch just incase there is an error opening.
            //Plus java won't let you unless you try catch.
    try{

                setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("C:/Documents and Settings/brando/My Documents/NetBeansProjects/GameFrame/src/maze.jpg")))));

    }   catch (IOException e) {
                e.printStackTrace();                    
                }       


        //Show the frame


        setVisible(true);
        //setOpaque(false);    
        y = 35;
        x = 15;
}

    public void paint(Graphics g) {

       dbImage = createImage(getWidth(), getHeight());
       dbg = dbImage.getGraphics();
       paintComponent(dbg);
       g.drawImage(dbImage, 0, 0, this);           
    }

    public void paintComponent(Graphics g) {                

        g.fillOval(x, y, 15, 15);
        //g.setOpaque(false);

        repaint();        
    }   

   // private void setOpaque(boolean b) {
   //     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

   // }

    public class AL extends KeyAdapter { 

        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if(keyCode == e.VK_LEFT) {
                if(x <= 5)
                    x = 5;
                else 
                    x += -5;
            }
            if(keyCode == e.VK_RIGHT) {
                if(x >= 230)
                    x = 230;
                else
                    x += +5;
            } 
            if(keyCode == e.VK_UP) {
                if(y <= 23)
                    y=23;
                else
                    y += -5;
            } 
            if(keyCode == e.VK_DOWN) {
                if(y >= 277)
                    y = 277;
                else
                    y += +5;
            } 
    }
    }
}
4

1 回答 1

2

好的,让我们看看这里出了什么问题:

当我添加“球”时,它会重新绘制背景(默认颜色,无图像)

在这种情况下,当您使用自定义paint方法时,您不会调用super.paint(g),因此不会绘制JLabelwith 。Image

Image您创建的空白:

dbImage = createImage(getWidth(), getHeight());

Graphics提供了一个方便的 drawImage 重载方法,允许您指定宽度和高度,从而避免这样做。)

结果:没有背景图像。

当我注释掉油漆和油漆组件时,迷宫背景又回来了,但当然没有球。

现在Swing正在调用默认paint实现,以确保绘制所有子组件,但现在您没有调用您的fillOval方法,净结果:背景 Image,没有球。

接下来在哪里:

为了让 Swing 完成自定义绘制的工作,您需要重写 paintComponent而不是直接调用它。但是,这不能在顶级容器中完成,例如JFrame. 在新组件中对a 进行子类化JComponent和覆盖paintComponent将允许 Swing 调用该方法,而无需您直接执行。添加@Override将允许编译器检查您是否确实覆盖了该方法。当您打算绘制 时Image,您可以简单地加载Image并保存参考,以便在需要绘制时使用:

dbImage = ImageIO.read(new File("MyImage.jpg"));

然后在您的新JComponent课程中:

@Override
protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   g.drawImage(dbImage, 0, 0, getWidth(), getHeight(), this);
   g.fillOval(x, y, 15, 15);
}
于 2013-03-13T13:58:29.967 回答