如何使用GridLayout在网格上添加不同的对象?

时间:2014-05-05 17:17:00

标签: java object jpanel jlabel

所以基本上我正在尝试制作类似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);
}

}

1 个答案:

答案 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);
        }
    }
}