Estou tentando desenvolver um jogo em Java para fins de aprendizado sobre sockets e componentes visuais.
A parte de sockets por enquanto eu estou com um entendimento satisfatório, que permite eu prosseguir com o projeto, porém a parte visual está sendo uma luta rs
A idéia é fazer um jogo parecido/baseado com Tibia (http://www.tibia.com). Consigo fazer meus “personagens” (JComponent) se moverem na tela usando o paint(Graphics g), porém preciso que eles sejam clicáveis.
Nesse caso comecei a adiciona-los no JFrame com o add(personagem) e depois dando um setBounds, porém ai começaram os problemas.
Quando mudo a posição dos personagens, aparece um fundo cinza neles.
Lí em um post do Vini Godoy que comenta que não devemos usar o setBounds, mas não entendi como fazer.
Já que tu já leu os tutorias do ponto v, acho que não preciso entra em detalhes a respeito do paint component. O mais importante que tu enteda meu caro, é que usar um componente por cima do outro é i jeito mais dificil. O mais fácil é desenhar o fundo no inicio do método paintConponente e no restante do método, você vai desenhado os pergonagens, os menus, etc.
[quote=elissonandrade]Já que tu já leu os tutorias do ponto v, acho que não preciso entra em detalhes a respeito do paint component. O mais importante que tu enteda meu caro, é que usar um componente por cima do outro é i jeito mais dificil. O mais fácil é desenhar o fundo no inicio do método paintConponente e no restante do método, você vai desenhado os pergonagens, os menus, etc.
Eu fiz algumas coisas assim para treinar, e entendi o funcionamento. O problema é que eu queria que meu personagem (ou inimigos) sejam clicáveis.
Sabe o que eu pensei? Em pegar os pontos X/Y de onde o mouse clicou na tela, e checar se eles estão dentro da área em que meu personagem está, ai eu associo a ele. Mas não sei se existe forma mais prática.
Eu olhei alguma coisa sobre JavaFX também, mas me pareceu meio frio ainda, não me animou muito.
Estou na empresa agora, a noite eu posto o código para você dar uma olhada.
O problema de escrever um componente é que tu tem que escolher dois caminhos: ou tu reescreve tudo que é necessário pro conponente funcionar bem, ou tu herda de algun outro componente já feito e reescreve os métodos que te interessarem.
Só simples fato de tu usar setBounds quer dizer que tu vai ter que gerenciar as alterações de tamanho do teu componente quando esse método for aplicado nele. Ainda por cima, vai ser necessário gerenciar o método paincomponente, paint borders, o própio paint, além de ter que fazer isso também no teu container.
A verdade é que componenentes foram feito para serem posicionados em um lugar fixo do layout, o que não é o caso um personagem de jogo. Pra completar a jogada, lembre-se que se tu fizer uso de dois componentes, também vão ser necessários dois BufferStrategy, ou seja, 4 Buffers, que vão ter que trabalhar compassadamente pra não produzir erros, enfim só do de cabeça.
O máximo que é viável fazer é criar conponentes que vão funcionar como os menus do jogo. Se tu quer fazer algo parecido com tibia, seria uma boa se no rodapé do frame tu colocasse um JPainel com tuas magias pro usuário clicar. Aí sim, eu recomendo criar conponenetes especificos pro botões das magias.
No meu programa, eu uso essa tática mesmo de recuperar o xy do mouse que é bem simples até. O mouse clicked do Mouse listenner supre bem essa necessidade, pois ele te dá o xy do mouse em relação ao componente, não em relação a tela do usuário. Eu também queria saber se já inventaram forma mais prática.
Essa é a forma mais simples. Basta pegar o retângulo definido por seu personagem, copiar para um Rectangle2D e em seguida usar os métodos de colisão.
Por exemplo, suponha que img contenha o sprite do seu personagem, e pos seja o vetor de sua posição:
public boolean foiClicado(int mouseX, int mouseY, GameObject go) {
Rectangle rect = new Rectangle(
go.getPos().getX(), go.getPos().getY(),
go().getImg.getWidth(), go.getImg().getHeight());
return rect.contains(mouseX, mouseY);
}
Agora, eu não recomendo que você use os personagens estendendo-os de JComponent. Faça como explica o tutorial do Pacman do Ponto V. Se você está fazendo um jogo, o ideal é controlar totalmente a renderização. A renderização de componentes é adequada para tela, não para objetos móveis.
Bom, primeiramente muito obrigado a vocês, me ajudaram muito, trocar idéias sempre ilucida o caminho rs
Realmente o setBounds não se aplica a um jogo, fiz alguns outros testes (com base no que vocês falaram) e está funcionando mil vezes melhor. Estou usando a ideia do XY do mouse, fica perfeito.
elissonandrade, como você disse o legal é que o getX() e getY() pegam a posição do mouse em relação ao componente, então fica seguro de usar eles. Hoje mesmo na hora do almoço consegui desenvolver o “engine” da ideia e ficou show.
ViniGodoy, eu tinha feito de uma forma diferente, pegava os pontos XY e dividia pelo tamanho de cada tile, ai eu consegui chegar no tile certo. Essa forma como você falou eu sinceramente nem sabia que existia, ja devo ter visto em algum tutorial ou algo assim mas não tinha pensando em usar ele, vou testar também até para fins de aprendizado.
Agora quanto a criar personagens estendendo o JComponent, era exatamente o que eu estava fazendo. Vou olhar novamente o tutorial que você citou, me lembro de ter lido ele mas não absorvi a ideia (eu não manjava nada de renderização, desenho na tela, coisas assim, aprendi tudo esses dias com os tutoriais do Ponto V, então ainda não absorvi tudo).
Eu nunca havia tentando nada parecido em Java, estou gostando da experiência, valeu por ajudarem!
Aqui no serviço esse link não é liberado, mas eu dei uma olhada pelo cel e achei muito bom, bem claro e explicado.
Com o pouco que olhei, já notei que ele vai me ajudar, principalmente aquele esquema de BufferStrategy que eu ainda não entendi direito como funciona nem para que serve.