[Aberto] Grade 2D em Java - como fazer?

8 respostas
G

Olá, comunidade do GUJ.

Estou enfrentando um problema. Eu estou tentando criar uma grade. Uma simples grade, onde um jogo se basearia, em que o personagem pudesse se movimentar em cada quadrado da grade. a parte do movimento eu sei fazer. Mas o meu problema realmente é a grade. Pensei em usar GridLayout, mas isso iria sobrecarregar o aplicativo com tantos paineis ou botões para cada quadrado (pois estou pensando em uma grade 100x100). Pensei em uma tabela mas isso seria estranho e logo desisti da ideia. Ao meu ver a melhor opção seria desenhar linhas com um objeto Graphics, mas isso seria um pouco trabalhoso e não sei como recuperar a posição do jogador, porém não prejudicaria meu desempenho. Gostaria de saber se alguém poderia me confirmar se eu devo usar o modo de desenhar linhas com o objeto Graphics. E, se há alguma maneira mais fácil do que as que comentei aqui sobre como desenhar uma grade 2D em java.

Grato desde já, Gustavo Borba.

8 Respostas

D

Podes usar JTable tranquilamente. Fiz um jogo de ludo no terceiro semestre da faculdade usando JTable e não tive problemas. O que terias que ver era a complexidade e tal, porque são várias classes para se manipular, não é só a JTable em si.

Se não se importares de ver um código da minha época de iniciante, eu posto o jogo aqui :slight_smile:

G

Opa, cara! Seria ótimo se você postasse o código aqui ou me passase por mensagem privado, como tu achares melhor. Se possível, passe somente a parte em que você cria a grade. É possível saber em que célula o usuário clicou?

H

Podes usar JTable tranquilamente. Fiz um jogo de ludo no terceiro semestre da faculdade usando JTable e não tive problemas. O que terias que ver era a complexidade e tal, porque são várias classes para se manipular, não é só a JTable em si.

Se não se importares de ver um código da minha época de iniciante, eu posto o jogo aqui :slight_smile:

Por favor disponibilize sim o código.
Até eu fiquei curioso , vai servir pra quem tiver iniciando e puder usar tua solução em outros problemas…

D

Segue o jogo em anexo

G

Não sei se isso ajuda, mas eu criei minha própria versão, se alguém quiser. É uma classe bem simples, coloquei até os imports:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

/**
 * @autor Gustavo
 * @data 11.01.2011
 */

public class Grid extends JPanel {

    private int x, y, dist;

    public Grid(int x, int y, int dist) {
        this.x = x;
        this.y = y;
        this.dist = dist;

        this.setSize(x * dist + 15, y * dist + 38); ///-- Corrige a margem
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.black);
        g.fillRect(0, 0, this.getSize().width, this.getSize().height);

        g.setColor(Color.green);
        for(int i = 0; i < x; i++) {
            g.drawLine(0, i * dist, this.getSize().width, i * dist);
        }

        for(int i = 0; i < y; i++) {
            g.drawLine(i * dist, 0, i * dist, this.getSize().height);
        }
    }
}

Eu estou instanciando essa classe no meu JFrame assim (lembrando que esta minha classe é uma subclasse de um JFrame):

Grid grid = new Grid(10, 10, 50);
        this.getContentPane().add(grid);
        this.setSize(grid.getSize());

Só tenho um problema, eu queria que uma matriz bidimensional de booleanos se referissem as posições na grade. como por exemplo grade[0][0] = true; significa que ela está ocupada, e por isso no método paintComponent, a célula 0, 0 fosse pintada de branco. em como fazer isso?

Marky.Vasconcelos

Duas coisas.
1° - Não desenhe nesse Graphics diretamente, crie uma copia.

2° - Sempre chame super.paintComponent, ele é responsavel por limpar a area e ainda pintar a borda e essas coisas.

Seu código seria o seguinte:

public void paintComponent(Graphics g) {  
super.paintComponent(g);
 Graphics2D g2d = (Graphics2D) g.create();
         g2d.setColor(Color.black);  
         g2d.fillRect(0, 0, this.getSize().width, this.getSize().height);  
   
         g2d.setColor(Color.green);  
         for(int i = 0; i < x; i++) {  
             g2d.drawLine(0, i * dist, this.getSize().width, i * dist);  
         }  
   
         for(int i = 0; i < y; i++) {  
             g2d.drawLine(i * dist, 0, i * dist, this.getSize().height);  
         }
g2d.dispose();
}
G

Opa, valeu Marky!

Mas, você tem alguma ideia de como eu poderia relacionar uma matriz de booleanos que armazena a condição da célula (se ela está ocupado ou não) com essa grade feita com o objeto Graphics2D?

Grato desde já, Gustavo Borba.

Marky.Vasconcelos

Um pouco de lógica, uma matriz booleana tem o mesmo formato que sua grade, basta pensar um pouco.

Criado 11 de janeiro de 2011
Ultima resposta 12 de jan. de 2011
Respostas 8
Participantes 4