[RESOLVIDO] Matriz em um AWT Canvas

Bom dia. Estou fazendo um jogo de batalha naval com o SWING. Nele o programa lê um arquivo com os seguintes dados: altura, largura, matriz das posições preenchida e quantidade de barcos. O problema é que a matriz que o mause captura está inversa da que está no arquivo e eu não sei o que fazer. Alguem poderia me ajudar?
Segue o código:

Frame:

import Model.ArcMap;
import java.awt.BorderLayout;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;

public class GameFrame extends JFrame {

	private GameCanvas canvas;
	// CanvasThread updateScreenThread = new CanvasThread(canvas);
	private ArcMap archive;
	private int width;
	private int hight;
	public static final int AREA = 60;

	public GameFrame(ArcMap archve) {
		this.archive = archve;
		this.width = archve.getArcWidth();
		this.hight = archive.getArcHeight();

		canvas = new GameCanvas(archive);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setLayout(new BorderLayout());
		setTitle("Stellar Battle");
		add(BorderLayout.CENTER, canvas);
		setResizable(false);

		// Define largura e altura da janela principal
		setSize(AREA * width, canvas.AREA * hight);
		setLocationRelativeTo(null);

		// setVisible(true);

		// Inicia Thread com timer para redesenhar a tela.
		// updateScreenThread.start();

		canvas.addMouseListener(new MouseListener() {

			@Override
			public void mouseReleased(MouseEvent e) {
				int x = e.getX();
				int y = e.getY();

				int x_pos = x / canvas.AREA;
				int y_pos = y / canvas.AREA;
				
				System.out.println(canvas.getShot(x_pos, y_pos));

				//canvas.setShot(x_pos, y_pos);
				
				//canvas.oque();

			}

			@Override
			public void mouseClicked(MouseEvent e) {
			}

			@Override
			public void mousePressed(MouseEvent e) {
			}

			@Override
			public void mouseEntered(MouseEvent e) {
			}

			@Override
			public void mouseExited(MouseEvent e) {
			}

		});
	}
	
	

}

Canvas:

import Model.ArcMap;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.Buffer;
import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

public class GameCanvas extends Canvas {

	public static final int AREA = 40;

	private int margin = 0;

	private int rows;
	private int cols;
	private ArcMap achive;

	private int[][] explosionMatrix = new int[rows][cols];

	public GameCanvas(ArcMap archive) {
		this.achive = archive;
		this.rows = archive.getArcHeight();
		this.cols = archive.getArcWidth();
		explosionMatrix = archive.getArcMatrix();
		
		
		setSize(AREA * rows, AREA * cols);
		// setSize(AREA, AREA);

	}
	
	

	
	
	
	//@Override
	public void paint(Graphics g) {

		int lenthI = rows;
		int lenthJ = cols;

		g.setColor(new Color(131, 209, 232));

		g.fillRect(0, 0, cols * AREA, rows * AREA);

		g.setColor(Color.white);

		for (int i = 0; i < cols ; i++) {
			g.drawLine(i * AREA, 0, i * AREA, AREA * rows);
			for (int j = 0; j < rows; j++) {
				g.drawLine(0, j * AREA, AREA * cols, j * AREA);
			}
		}
		this.oque();

		
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
			System.out.print(explosionMatrix[i][j]);
			}
			System.out.println("");
		}

		// Prepare an ImageIcon
		ImageIcon icon = new ImageIcon("images/ondas_1.jpg");
		ImageIcon iconShot = new ImageIcon("images/explosion.png");
		// Prepare an Image object to be used by drawImage()
		final Image img = icon.getImage();
		final Image imgShot = iconShot.getImage();
		this.oque();

		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				g.drawImage(img, i * AREA, j * AREA, AREA, AREA, null);
				if (explosionMatrix[i][j] == 1) {
					g.drawImage(imgShot, i * AREA, j * AREA, AREA, AREA, null);
				}
			}

		}
		this.oque();

	}

	
	public void setShot(int x, int y) {
		explosionMatrix[x][y] = 1;
	}
	public int getShot(int x, int y) {
		return explosionMatrix[x][y];
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public int getCols() {
		return cols;
	}

	public void setCols(int cols) {
		this.cols = cols;
	}

	public int[][] getExplosionMatrix() {
		return explosionMatrix;
	}

	public void setExplosionMatrix(int[][] explosionMatrix) {
		this.explosionMatrix = explosionMatrix;
	}
	
	public void oque() {
		System.out.println("");
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
			System.out.print(explosionMatrix[i][j]);
			}
			System.out.println("");
		}
	}
	

}

O problema é que vc está se confundindo com linha/coluna e x/y, linha é y e coluna é x. O vetor explosionMatrix está como [linha|y][coluna|x], então:

public void setShot(int x, int y) {
	explosionMatrix[y][x] = 1;
}
public int getShot(int x, int y) {
	return explosionMatrix[y][x];
}
System.out.println(canvas.getShot(x_pos, y_pos));

ou

public void setShot(int linha, int coluna) {
	explosionMatrix[linha][coluna] = 1;
}
public int getShot(int linha, int coluna) {
	return explosionMatrix[linha][coluna];
}
System.out.println(canvas.getShot(y_pos, x_pos));
1 curtida

Mas o meu vetor ta x = linha e y = coluna.

Diego eu acabei descobrindo que meu canvas esta sendo desenhado como uma matriz transposta. E eu n estendo o por que.

Preste atenção nos significados dos termos “linha” e “coluna”, linha corre de cima para baixo igual a y, coluna corre da esquerda para a direita igual a x.

Ou seja, seu vetor é [linha|y][coluna|x] ou [coluna|x][linha|y]? isso precisa ficar claro, pois coluna é sempre equivalente a x e linha é sempre equivalente a y.

O arquivo me dá uma altura e uma largura. Tô usando altura como linha e largura como coluna. Nisso, uso sempre um vetor [linha][coluna].

então é [y][x], o evento do mouse usa x/y então é necessário converter para linha/coluna, onde linha equivale a y e coluna equivale a x:

			// int x_pos = x / canvas.AREA;
			// int y_pos = y / canvas.AREA;
			int col_pos = x / canvas.AREA;
			int row_pos = y / canvas.AREA;
			
			System.out.println(canvas.getShot(row_pos, col_pos));

			//canvas.setShot(row_pos, col_pos);
			
			//canvas.oque();

Se ainda tiver dúvidas, então faça o exercício, obtenha a linha/coluna e x/y do quadrado em verde da tabela:

image

O vermelho está feito.

Diego, muito obrigado pela a paciência e dedicação!! Consegui entender e arrumar o meu código!! Sucesso ahah