Graphics e seleção de string

Olá, Pessoal.

É o meu primeiro post no fórum e gostaria de saber se alguém pode me ajudar. Preciso de um diagrama de letras para um jogo. Utilizei a classe Graphics e o método drawString para desenhar as letras. Meu problema é que preciso selecionar com o mouse e retornar essas letras. No entanto, vi que não há nenhum método em Graphics para isso. Alguém tem alguma sugestão?

Oi mel, td bem!!!

como esta seu programa? so pra ter uma ideia, mas ha principio vc tera que usar uma actionEvent pra fz isso, mas gostaria de dar uma olhada pra ter certeza

abrçs

[quote=Alessandro_Alves]Oi mel, td bem!!!

como esta seu programa? so pra ter uma ideia, mas ha principio vc tera que usar uma actionEvent pra fz isso, mas gostaria de dar uma olhada pra ter certeza

abrçs[/quote]

Oi!

Essa é o método que uso para “criar” o diagrama de letras:

[code]private ImageIcon criarImagem() {

	BufferedImage buffer = new BufferedImage( 400, 400, BufferedImage.TYPE_INT_RGB );
	Graphics g = buffer.createGraphics();
	
	int tamanhoDiagrama = Math.min(getSize().height/atorJogador.retornarColunas(),getSize().width/atorJogador.retornarLinhas());
	System.out.println(tamanhoDiagrama);
	
	g.setFont(new Font("SansSerif", Font.BOLD, tamanhoDiagrama/2));

	 FontMetrics fm = g.getFontMetrics();
	 int offset = fm.getAscent();

	for (int r = 0; r <= atorJogador.retornarColunas()-1; r++){
	    for (int c = 0; c <= atorJogador.retornarLinhas()-1; c++){
		g.drawString(String.valueOf(atorJogador.retornarLetra(r, c)), tamanhoDiagrama * c,tamanhoDiagrama * r + offset);
	    }
	}
	
	return new ImageIcon( buffer );
}
[/code]

Mel, seguinte vc ja ouviu falar do metodo mouseEvent, la vc podera implementar esse metodo, para que no momento em que a pessoa clicar numa letra pra retorna a letra selecionada pra uma String ow um char, dai vc mostraria numa JLabel a letra selecionada.

naum sei se eh isso que vc esta querendo mas da uma olhada no metodo que eu te falei

abrçs precisando estamos ae!!!

[quote=Alessandro_Alves]Mel, seguinte vc ja ouviu falar do metodo mouseEvent, la vc podera implementar esse metodo, para que no momento em que a pessoa clicar numa letra pra retorna a letra selecionada pra uma String ow um char, dai vc mostraria numa JLabel a letra selecionada.

naum sei se eh isso que vc esta querendo mas da uma olhada no metodo que eu te falei

abrçs precisando estamos ae!!![/quote]

Oi!
Foi ótima sua dica! Era realmente isso que eu precisava. Ainda não implementei, porque primeiro preciso “criar” o diagrama. Ainda está dando um erro estranho. :slight_smile:

Ok, espero ter ajudado

abrçs

Oi!

Só de curiosidade, que jogo é?
Para que você está desenvolvendo? Gosto pessoal, faculdade ou algum trabalho?

Quanto ao seu problema, acho que a solução é mesmo a que o colega falou. Dependendo do jogo, também pode ser uma boa olhar na biblioteca JInput.

Oi, Vini!

O jogo é o Caça-Palavras. É um trabalha da faculdade que pretendo aperfeiçoar :slight_smile:

Essa classe me ajudaria como? :slight_smile:

Para o seu caso, talvez não seja vantagem mesmo. Só o mouse listener e/ou o mouse motion listener já são suficientes. Eu mesmo usei os próprios listeners no Vikanoid.

O JInput é uma biblioteca que lida com diferentes tipos de entrada, incluindo joysticks.

Legal, bom saber de mais gente desenvolvendo jogos por aí. Depois de pronto, posta aqui no GUJ! :slight_smile:

Quando terminar, eu posto aqui :slight_smile:
Valeu pela ajuda, pessoal! Ainda tenho muito que fazer :slight_smile:
Ainda tenho um outro probleminha com relação a interface. Quando o jogador selecionar no diagrama, o mouse deverá “riscar” a palavra, como fazemos no caça-palavras convencional. Ainda não tenho a mínima idéia de como farei isso. Se souberem de alguma coisa, pode avisar:)

O objeto Graphics que você obtém com o BufferedImage tem o método drawLine.

Você ainda pode selecionar a largura da linha com o setStroke.

Oi Pessoal!

Ainda estou com um problema no meu jogo. Quando o jogador seleciona com o mouse uma string no diagrama, eu preciso armazenar essa string e formar uma palavra. Com essa palavra eu faço uma busca numa lista de palavras e, caso eu a encontre, eu devo “riscar” essa palavra da lista. O problema é que o Graphics não tem nenhum método getString() que eu possa utilizar. Como solução, tentei criar um hashmap que recebe, na criação do diagrama, a posicao e a letra. A cada movimento do mouse, eu busco a posicao dentro desse hashmap, que me devolve a letra corresponde, e então eu armazeno. Só que não está funcionando. O que estou fazendo de errado?

Acho que o jeito mais fácil é gravar todas as letras numa matriz NxM.

Depois, converta as coordenadas dessa matriz na tela para desenhar as letras.
Defina um espaço fixo entre elas (como é realmente num caça palavras), digamos de 15x15 pixels. Então, o indice 0x0 da sua matriz virará a coordenada 0,0, o 1x1 virará a coordenada 15,15, o 1x2 a coordenada 15x30 e assim por diante.

Assim, fica fácil de converter a posição do clique de volta num índice de sua matriz. E saber que letra está por lá. :slight_smile:

[quote=ViniGodoy]Acho que o jeito mais fácil é gravar todas as letras numa matriz NxM.

Depois, converta as coordenadas dessa matriz na tela para desenhar as letras.
Defina um espaço fixo entre elas (como é realmente num caça palavras), digamos de 15x15 pixels. Então, o indice 0x0 da sua matriz virará a coordenada 0,0, o 1x1 virará a coordenada 15,15, o 1x2 a coordenada 15x30 e assim por diante.

Assim, fica fácil de converter a posição do clique de volta num índice de sua matriz. E saber que letra está por lá. :)[/quote]

Oi Vini!

Realmente acho que isso vai funcionar :slight_smile:
Depois eu coloco aqui o que fiz :slight_smile:

A formula mesmo é essa aqui:

[code]/** Pega a letra pelo índice da matriz*/
char getLetra(int pixelX, int pixelY) {
int indX = (pixelX / AREA) - OFFSET_X;
int indY = (pixelY / AREA) - OFFSET_Y;
return matrix[x][y];
}

/** Pega o pixel relacionado aos índices da matriz */
Point2D getPositionToDraw(int indX, int indY) {
int pixelX = OFFSET_X + indX * AREA;
int pixelY = OFFSET_Y + indY * AREA;
return new Point2D.Float(pixelX, pixelY);
}[/code]

Onde:
AREA representa o espaço para letra (por exemplo 15x15, seria área 15);
OFFSET_X = É a posição X da primeira letra, em pixels
OFFSET_Y = É a posicão Y da primeira letra, em pixels

Para ficar mais bonito, mais difícil para o jogador e mais fácil para você, use uma fonte monospaced, como Courier New. Assim você não precisa centralizar em sua área de 15x15, já que todas as letras terão exatamente a mesma largura.

[quote=ViniGodoy]A formula mesmo é essa aqui:

[code]/** Pega a letra pelo índice da matriz*/
char getLetra(int pixelX, int pixelY) {
int indX = (pixelX / AREA) - OFFSET_X;
int indY = (pixelY / AREA) - OFFSET_Y;
return matrix[x][y];
}

/** Pega o pixel relacionado aos índices da matriz */
Point2D getPositionToDraw(int indX, int indY) {
int pixelX = OFFSET_X + indX * AREA;
int pixelY = OFFSET_Y + indY * AREA;
return new Point2D.Float(pixelX, pixelY);
}[/code]

Onde:
AREA representa o espaço para letra (por exemplo 15x15, seria área 15);
OFFSET_X = É a posição X da primeira letra, em pixels
OFFSET_Y = É a posicão Y da primeira letra, em pixels

Para ficar mais bonito, mais difícil para o jogador e mais fácil para você, use uma fonte monospaced, como Courier New. Assim você não precisa centralizar em sua área de 15x15, já que todas as letras terão exatamente a mesma largura.[/quote]

No getLetra eu pego a letra pelo pixel, nao? Por exemplo, quando clicar com o mouse e começar a arrastar, devo pegar o pixel correspondente e depois passá-lo para o getLetra, é isso?

É isso mesmo. :slight_smile:

Agora que eu vi que o getLetra está errada.

A fórmula é

int indX = (pixelX - OFFSET_X) / AREA;

Mas nada que uma matemática não conseguiria ver sozinha. :smiley:

Eu não entendi o segundo método. Ele pega um ponto correspondente do Graphics? E pra que vou usá-lo?

Ele pega o índice x e y da sua matriz, e transforma no pixel onde você deve desenhar a letra.