[Resolvido] Jogo - JComponent e setBounds

Boa tarde pessoal,

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

Li os artigos do Ponto V e este PDF http://www.lac.inpe.br/~rafael.santos/Docs/SJCJUG/java-id2j-2x2.pdf que achei muito bom para dar um start, mas não sei se entendi mal ou se realmente não falava nada a respeito desse problema que estou enfrentando.

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.

Alguém poderia me dar uma luz?

Muito obrigado!

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.

Pra poder ajudarmos mais, você precisa postar seu código. Segunda coisas: tenta algo mais simples: cria um jogo de pingue pongue que duas pessoas podem jogar entre dois computadores diferentes, tipo assim:
http://www.google.com.br/imgres?um=1&hl=pt-BR&sa=N&biw=1280&bih=663&tbm=isch&tbnid=0m5sfxbJJ5uOQM:&imgrefurl=http://freemusicsoftware.org/1531&docid=GUcOiaDC6ExeQM&imgurl=http://freemusicsoftware.org/imageDirectory/pong.png&w=288&h=269&ei=o_SMT_qsKIrd0QHoh_SCDw&zoom=1&iact=hc&vpx=180&vpy=335&dur=1309&hovh=215&hovw=230&tx=136&ty=123&sig=115390786222726730092&page=1&tbnh=140&tbnw=150&start=0&ndsp=19&ved=1t:429,r:12,s:0,i:119

Até.

[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.

Pra poder ajudarmos mais, você precisa postar seu código. Segunda coisas: tenta algo mais simples: cria um jogo de pingue pongue que duas pessoas podem jogar entre dois computadores diferentes, tipo assim:
http://www.google.com.br/imgres?um=1&hl=pt-BR&sa=N&biw=1280&bih=663&tbm=isch&tbnid=0m5sfxbJJ5uOQM:&imgrefurl=http://freemusicsoftware.org/1531&docid=GUcOiaDC6ExeQM&imgurl=http://freemusicsoftware.org/imageDirectory/pong.png&w=288&h=269&ei=o_SMT_qsKIrd0QHoh_SCDw&zoom=1&iact=hc&vpx=180&vpy=335&dur=1309&hovh=215&hovw=230&tx=136&ty=123&sig=115390786222726730092&page=1&tbnh=140&tbnw=150&start=0&ndsp=19&ved=1t:429,r:12,s:0,i:119

Até.[/quote]

Bom dia elissonandrade,

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.

Muito obrigado!

Ah, já? Então tá beleza.

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!

Abraços!

Um tutorial rápido e legal é esse aqui:
http://www.cokeandcode.com/info/tut2d.html

[quote=ViniGodoy]Um tutorial rápido e legal é esse aqui:
http://www.cokeandcode.com/info/tut2d.html[/quote]

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.

Vou ler com calma de casa!

Valeu cara!!