在开关中添加图像 - PaintComponent Override
Adding a Image Within a switch - PaintComponent Override
我正在尝试向我正在制作的游戏中添加一个小的 burger.jpg img。只要 'f'(food) 在 Switch 中传递,就应该添加汉堡。我在我的代码中实现这个有问题。
我最初只是填充一个橙色矩形 g2.fillRect()
,但我想用实际图像替换它。我试过缩放图像并添加它,但它没有显示出来。如果我在 for 循环的末尾替换 g2.fillRect
,它会使每个方块成为汉堡,而不仅仅是 'f'
我该怎么做?
private class Game extends JPanel {
BufferedImage img = null;
@Override
public void paintComponent(Graphics g2) {
super.paintComponent(g2);
try {
img = ImageIO.read(new File("src/burger.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
BufferedImage otherImage = new BufferedImage(50, 50,
BufferedImage.TYPE_INT_RGB);
Graphics g = otherImage.createGraphics();
int width = getWidth() / game.getBoardWidth();
int height = getHeight() / game.getBoardHeight();
char[] symbols = game.toString().toCharArray();
int x = 0;
int y = 0;
for (char c : symbols) {
switch (c) {
case 'Q':
g2.setColor(Color.BLACK);
break;
case 'H':
g2.setColor(Color.GREEN);
break;
case 'f':
//g2.setColor(Color.ORANGE);
g2.drawImage(img, x, y, width, height, null);
break;
case '-':
g2.setColor(Color.WHITE);
break;
case '\n':
y += height;
x = 0;
}
//g2.drawImage(img, x, y, width, height, null);
g2.fillRect(x, y, width, height);
x += width;
}
}
}
尚未测试,但这就是您的程序中正在发生的事情:
- 获得符号
- if (
'f'
) 然后 drawImage
然后 fillRect
你想要的是:
- 获得符号
- if(
'f'
) 那么 drawImage
否则 fillRect
所以你比较:
if (symbol == 'f') {
g2.drawImage(img, x, y, width, height, null);
} else {
g2.fillRect(x, y, width, height);
}
或者我会做的是:
switch (c) {
case 'Q':
g2.setColor(Color.BLACK);
g2.fillRect(x, y, width, height);
break;
case 'H':
g2.setColor(Color.GREEN);
g2.fillRect(x, y, width, height);
break;
case 'f':
//g2.setColor(Color.ORANGE);
g2.drawImage(img, x, y, width, height, null);
break;
case '-':
g2.setColor(Color.WHITE);
g2.fillRect(x, y, width, height);
break;
case '\n':
y += height;
x = 0;
}
并注释掉或删除最后一次调用:
g2.fillRect(x, y, width, height);
提示:
try {
img = ImageIO.read(new File("src/burger.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
这些行应该在构造函数中,而不是在 paintComponent
方法中,Swing 会多次调用它,这样做可能会减慢或阻塞/冻结您的应用程序,直到它完成读取。
此外,您没有使用 otherImage
变量,因此您也可以删除它...
我正在尝试向我正在制作的游戏中添加一个小的 burger.jpg img。只要 'f'(food) 在 Switch 中传递,就应该添加汉堡。我在我的代码中实现这个有问题。
我最初只是填充一个橙色矩形 g2.fillRect()
,但我想用实际图像替换它。我试过缩放图像并添加它,但它没有显示出来。如果我在 for 循环的末尾替换 g2.fillRect
,它会使每个方块成为汉堡,而不仅仅是 'f'
我该怎么做?
private class Game extends JPanel {
BufferedImage img = null;
@Override
public void paintComponent(Graphics g2) {
super.paintComponent(g2);
try {
img = ImageIO.read(new File("src/burger.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
BufferedImage otherImage = new BufferedImage(50, 50,
BufferedImage.TYPE_INT_RGB);
Graphics g = otherImage.createGraphics();
int width = getWidth() / game.getBoardWidth();
int height = getHeight() / game.getBoardHeight();
char[] symbols = game.toString().toCharArray();
int x = 0;
int y = 0;
for (char c : symbols) {
switch (c) {
case 'Q':
g2.setColor(Color.BLACK);
break;
case 'H':
g2.setColor(Color.GREEN);
break;
case 'f':
//g2.setColor(Color.ORANGE);
g2.drawImage(img, x, y, width, height, null);
break;
case '-':
g2.setColor(Color.WHITE);
break;
case '\n':
y += height;
x = 0;
}
//g2.drawImage(img, x, y, width, height, null);
g2.fillRect(x, y, width, height);
x += width;
}
}
}
尚未测试,但这就是您的程序中正在发生的事情:
- 获得符号
- if (
'f'
) 然后drawImage
然后fillRect
- if (
你想要的是:
- 获得符号
- if(
'f'
) 那么drawImage
否则fillRect
- if(
所以你比较:
if (symbol == 'f') {
g2.drawImage(img, x, y, width, height, null);
} else {
g2.fillRect(x, y, width, height);
}
或者我会做的是:
switch (c) {
case 'Q':
g2.setColor(Color.BLACK);
g2.fillRect(x, y, width, height);
break;
case 'H':
g2.setColor(Color.GREEN);
g2.fillRect(x, y, width, height);
break;
case 'f':
//g2.setColor(Color.ORANGE);
g2.drawImage(img, x, y, width, height, null);
break;
case '-':
g2.setColor(Color.WHITE);
g2.fillRect(x, y, width, height);
break;
case '\n':
y += height;
x = 0;
}
并注释掉或删除最后一次调用:
g2.fillRect(x, y, width, height);
提示:
try {
img = ImageIO.read(new File("src/burger.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
这些行应该在构造函数中,而不是在 paintComponent
方法中,Swing 会多次调用它,这样做可能会减慢或阻塞/冻结您的应用程序,直到它完成读取。
此外,您没有使用 otherImage
变量,因此您也可以删除它...