我只是想为大学制作一个游戏,这是一个玩家用键盘导航以通过迷宫的球。我唯一坚持的是我的背景是一个迷宫的图像,当我添加“球”它重新绘制背景(defualt颜色,没有图像)当我评论出油漆和油漆组件时,迷宫背景又回来了,但当然没有球。
我是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;
}
}
}
}
答案 0 :(得分:2)
好的,让我们看看这里出了什么问题:
当我添加“球”时,它会重新绘制背景(默认颜色,没有图像)
在这种情况下,当您使用自定义paint
方法时,不会调用super.paint(g)
,因此JLabel
Image
不会被绘制。< / p>
您做创建的Image
为空:
dbImage = createImage(getWidth(), getHeight());
(Graphics
提供convenient overloaded method of drawImage,允许您指定宽度和高度,以避免这样做。)
结果:没有背景图片。
当我注释掉油漆和油漆组件时,迷宫背景又回来了,但当然没有球。
现在Swing
正在调用默认的paint
实现,该实现可确保绘制所有子组件,但现在您没有调用fillOval
方法,最终结果为:后台{{1} ,没有球。
下一步:
要允许Swing执行自定义绘制工作,您需要覆盖 Image
而不是直接调用它。但是,这不能在像paintComponent
这样的顶级容器中完成。在该新组件中对JFrame
进行子类化并覆盖JComponent
将允许Swing调用该方法,而无需直接执行。添加paintComponent
将允许编译器检查 确实覆盖了该方法。当您打算绘制@Override
时,您只需加载Image
并保存参考,以便在需要绘制时使用:
Image
然后在新的基于dbImage = ImageIO.read(new File("MyImage.jpg"));
的课程中:
JComponent