所以基本上我正在尝试制作类似2D迷宫的游戏,您可以自己创建地图或加载预制地图。在点击相应的JButton之后,通过给出新的所需对象的坐标来更改地图的图块,该对象可以是墙,草,敌人,炸弹,武器,英雄等。我的问题是:到目前为止,我一直在使用JLabel将草的图像放在地图中,因为它们是英雄可以移动的“基本图块”,然后我正在尝试将这些图像更改为自定义不同类的对象,所以当英雄移动到其中一个时,它会触发不同的动作,但看起来JLabel只能包含文本或图像,那么我应该怎么做呢?这是代码(对不起,这是西班牙语):
public class Tablero extends JFrame {
private int numFilas;
private int numColumnas;
private int numMuros;
public Tablero(final int numFilas, final int numColumnas, final int numMuros) {
this.numFilas = numFilas;
this.numColumnas = numColumnas;
this.numMuros = numMuros;
JFrame tablero = new JFrame();
JPanel contenedor = new JPanel();
final JLabel[][] casilla = new JLabel[60][60];
tablero.setSize(1280, 720);
contenedor.setSize(1280, 720);
tablero.add(contenedor);
for (int x = 0; x < this.numFilas; x++) {
for (int y = 0; y < this.numColumnas; y++) {
casilla[x][y] = new JLabel();
casilla[x][y].setIcon(new ImageIcon("C:\\Users\\Andres\\Desktop\\Programación orientada a objetos\\Juego\\build\\classes\\juego\\pasto.png"));
contenedor.add(casilla[x][y]);
}
}
JOptionPane.showMessageDialog(null, "Cree a continuación el héroe");
int coorX = Integer.parseInt(JOptionPane.showInputDialog("Digite la coordenada en x del héroe: "));
int coorY = Integer.parseInt(JOptionPane.showInputDialog("Digite la coordenada en y del héroe: "));
int lives = Integer.parseInt(JOptionPane.showInputDialog("Digite la cantidad de vidas del héroe: "));
final Heroe heroe = new Heroe(coorX, coorY, lives);
JButton añadirMuros = new JButton("Añadir muros");
contenedor.add(añadirMuros);
añadirMuros.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
Muro[] muros = new Muro[numMuros];
for (int i = 0; i < numMuros; i++) {
int coorX = Integer.parseInt(JOptionPane.showInputDialog("Digite la coordenada en x del muro # " + i + 1));
int coorY = Integer.parseInt(JOptionPane.showInputDialog("Digite la coordenada en y del muro # " + i + 1));
muros[i] = new Muro(coorX, coorY, heroe);
casilla[coorX][coorY] = new JLabel();
}
System.out.println("Clicked! muros");
}
});
JButton añadirBombas = new JButton("Añadir bombas");
contenedor.add(añadirBombas);
JButton añadirPistolas = new JButton("Añadir pistolas");
contenedor.add(añadirPistolas);
JButton añadirBallestas = new JButton("Añadir ballestas");
contenedor.add(añadirBallestas);
JButton añadirEnemigos = new JButton("Añadir enemigos");
contenedor.add(añadirPistolas);
JButton determinarEntrada = new JButton("Determinar entrada");
contenedor.add(determinarEntrada);
JButton determinarSalida = new JButton("Determinar salida");
contenedor.add(determinarSalida);
tablero.setVisible(true);
tablero.setResizable(true);
tablero.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
答案 0 :(得分:0)
是的,JLabel只能包含文本或ImageIcon。
您可以使用JPanel直接绘制图像。您的Wall和Enemy课程可以在JPanel上绘制自己的表示。
这是来自game I put together的GameImages和GuessingGamePanel。 GuesssingGamePanel从GameImages类中绘制图像。
package com.ggl.guessing.game.view;
import java.awt.Dimension;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
public class GameImages {
private Image backgroundImage;
private Image victoryImage;
public GameImages() {
readBackgroundImage();
readVictoryImage();
}
private void readBackgroundImage() {
Image image = null;
try {
URL url = getClass().getResource("/v8k3reduced.jpg");
image = ImageIO.read(url);
} catch (IOException e) {
e.printStackTrace();
}
this.backgroundImage = image;
}
private void readVictoryImage() {
Image image = null;
try {
URL url = getClass().getResource("/r7f8reduced.jpg");
image = ImageIO.read(url);
} catch (IOException e) {
e.printStackTrace();
}
this.victoryImage = image;
}
public Image getBackgroundImage() {
return backgroundImage;
}
public Dimension getPreferredSize() {
return new Dimension(backgroundImage.getWidth(null),
backgroundImage.getHeight(null));
}
public Image getVictoryImage() {
return victoryImage;
}
}
package com.ggl.guessing.game.view;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
import com.ggl.guessing.game.model.GuessingGameModel;
public class GuessingGamePanel extends JPanel {
private static final long serialVersionUID =
-2429103448910749064L;
private boolean guessed;
private Dimension guessesPanelDimension;
private GameImages gameImages;
private GuessesPanel guessesPanel;
private GuessingGameFrame frame;
private GuessingGameModel model;
public GuessingGamePanel(GuessingGameFrame frame,
GuessingGameModel model, GameImages gameImages,
Dimension guessesPanelDimension) {
this.frame = frame;
this.model = model;
this.gameImages = gameImages;
this.guessesPanelDimension = guessesPanelDimension;
this.guessed = false;
createPartControl();
}
private void createPartControl() {
this.setLayout(null);
this.setPreferredSize(gameImages.getPreferredSize());
guessesPanel = new GuessesPanel(frame, model);
Dimension gp = guessesPanelDimension;
Dimension tp = gameImages.getPreferredSize();
int x = (tp.width - gp.width) / 2;
int y = (tp.height - gp.height) / 2;
guessesPanel.getPanel().setBounds(x, y, gp.width, gp.height);
this.add(guessesPanel.getPanel());
}
public void setGuessed(boolean guessed) {
this.guessed = guessed;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(gameImages.getBackgroundImage(), 0, 0, null);
if (guessed) {
g.drawImage(gameImages.getVictoryImage(), 0, 0, null);
}
}
}