| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 15:20:34
|
Fox McCloud
JavaEvangelist
![[Avatar]](/images/avatar/8860a4e27cbbe4c63821b429211684a3.jpg)
Membro desde: 29/06/2005 09:29:46
Mensagens: 440
Offline
|
Well...
Estou postando aqui um código "pequeno", mas completo, com um mini framework capaz de possibilitar animações e jogos em Java 2D acelerado, que pode ser modificado para quaisquer outras animações ou jogos, já habilitado para receber entrada do usuário via teclado.
Isso é resultado de um bom tempo de pesquisa e estudo que fiz. Vou colocar sem comentários pra deixar quem se interessar quebrar a cabeça um pouco, que é o melhor jeito de aprender, e respondo as dúvidas que aparecerem!
Em anexo o jar funcional desse programa (auto-executável, basta ter uma JRE 6 instalada e clicar duas vezes) com os fontes inclusos.
Tudo começa com a janela principal:
Essa janela delega o controle da animação / interatividade a um engine que segue esse contrato:
Tornando a implementação do engine livre dos detalhes de nível mais baixo. A implementação sugerida aqui é essa:
Trabalhando sempre com uma lista de Sprites, facilitando muito a abstração. Cada objeto que herde de Sprite poderá ser colocado como caixa preta nesse engine.
Futuramente o desenvolvedor pode fazer os eventos recebidos refletirem no engine e nos sprites com os métodos implementados do KeyListener.
Vejam o que define a classe Sprite (um Sprite é um objeto de tela na animação ou jogo, e pode ser interativo):
E a implementação proposta com a finalidade de oferecer uma visualização funcional:
Vamos ver se alguém se interessa em entender esse código!
| Nome do arquivo |
BBall.jar |
Download
|
| Descrição |
Jar auto-executável (JRE 6) com fontes |
| Tamanho |
11 Kbytes
|
| Baixado: |
95 vez(es) |
|
"Denial is the most predictable of all human responses" - Matrix Architect |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 15:29:25
|
didiosam
JavaBaby
Membro desde: 06/11/2006 23:52:35
Mensagens: 85
Localização: Cascavel - PR
Offline
|
opa, bacana sua iniciativa em compartilhar o que fez ...
peguei o .jar ae, depois dou uma olhada nos fontes
vlw
[]´s
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 15:45:58
|
Matheus Leandro Ferreira
JavaChild
![[Avatar]](/images/avatar/8f63ef371d249dc31f244c24a0abb437.jpg)
Membro desde: 23/12/2008 07:01:02
Mensagens: 135
Offline
|
Codificação simples, programa simples.
Parabens!
Só acho que seria muito mais simples de aprender documentando seu código, mas acredito que você queira "ibope" por isso =)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 15:49:53
|
marcobiscaro2112
JWizard
Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline
|
Parabéns, muito bom! Mesmo sem comentários está fácil de entender. Um código limpo, bem escrito e, principalmente, funcional.
Sem dúvida pode ser adaptado para animações facilmente, e quanto a performance, está bem satisfatória.
Vou olhar o código e se tiver alguma sugestão postarei aqui!
|
Marco Biscaro.
Seja livre!
Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?
Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 15:57:35
|
Fox McCloud
JavaEvangelist
![[Avatar]](/images/avatar/8860a4e27cbbe4c63821b429211684a3.jpg)
Membro desde: 29/06/2005 09:29:46
Mensagens: 440
Offline
|
Matheus Leandro Ferreira wrote:Codificação simples, programa simples.
Parabens!
Só acho que seria muito mais simples de aprender documentando seu código, mas acredito que você queira "ibope" por isso =)
Obrigado, rs!
Estou reunindo forças para fazer um tutorial de desenvolvimento de jogos, e a idéia é colocar as idéias principais sem muita firula, exemplificando com um jogo completo, o que vai permitir que um desenvolvedor dedicado consiga usar isso como "start point" para desenvolver qualquer jogo 2D.
Tem muito conceito embutido nesse código, daria pra escrever um livro só com os conceitos que tem aí, de Swing a Design Patterns passando por Threads, Java2D e teoria de animações e jogos.
Mas alguém que se empolgue com a idéia poderá aprender muito entendendo esse código e tirando as dúvidas, e a cada dúvida que surgir darei uma explicação rica e completa do que está acontecendo!
|
"Denial is the most predictable of all human responses" - Matrix Architect |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 16:14:30
|
Fox McCloud
JavaEvangelist
![[Avatar]](/images/avatar/8860a4e27cbbe4c63821b429211684a3.jpg)
Membro desde: 29/06/2005 09:29:46
Mensagens: 440
Offline
|
marcobiscaro2112 wrote:Parabéns, muito bom! Mesmo sem comentários está fácil de entender. Um código limpo, bem escrito e, principalmente, funcional.
Sem dúvida pode ser adaptado para animações facilmente, e quanto a performance, está bem satisfatória.
Vou olhar o código e se tiver alguma sugestão postarei aqui!
Thank you very much!
Tem uns belos truques aí de performance, incluindo o uso de BufferStrategy e de um "pré-buffer" acelerado na memória da placa de vídeo com a invocação do "createCompatibleImage".
Inclusive se for modificado para ficar em tela cheia com resoluções bem mais altas (1024 x 768, por exemplo), vai rodar facilmente em 60 fps (meus testes assim já chegaram em 250 fps) mesmo que seja um jogo mais complexo, como um Mario World.
E suporta canal alpha real (png e transparências) sem perda de velocidade!
|
"Denial is the most predictable of all human responses" - Matrix Architect |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 16:36:39
|
pintofree
Virtual Machine Man
![[Avatar]](/images/avatar/e0652a0045dbc0b14d016619158789ce.jpg)
Membro desde: 19/12/2007 12:44:42
Mensagens: 651
Localização: Cuiabá - MT
Offline
|
Se eu quizer controlar a bolinha pelo teclado, que classe altero?
|
SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer, Enterprise Edition 5
"When the compiler's not happy, ain't nobody happy."
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 16:50:34
|
pintofree
Virtual Machine Man
![[Avatar]](/images/avatar/e0652a0045dbc0b14d016619158789ce.jpg)
Membro desde: 19/12/2007 12:44:42
Mensagens: 651
Localização: Cuiabá - MT
Offline
|
pintofree wrote:Se eu quizer controlar a bolinha pelo teclado, que classe altero?
Bem resolvi usar um keyevent dentro do main, que chama direntes eventos na ball dependendo da seta precionada, ai assim ela vai pra onde eu quero.
Que vc acha disto? POG?
Tambem coloquei a bolinha pra ir mudando de cor enquanto anda pela tela! Ficou bem psicodelico.
|
SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer, Enterprise Edition 5
"When the compiler's not happy, ain't nobody happy."
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 16:53:18
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
new Thread(new MainWindow()).start();
Não faça isso. Isso pode criar conflitos entre a Thread do AWT e essa outra Thread que você criou. Faça assim:
EventQueue.invokeLater(new MainWindow());
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2009 08:51:22
|
Fox McCloud
JavaEvangelist
![[Avatar]](/images/avatar/8860a4e27cbbe4c63821b429211684a3.jpg)
Membro desde: 29/06/2005 09:29:46
Mensagens: 440
Offline
|
victorwss wrote:
new Thread(new MainWindow()).start();
Não faça isso. Isso pode criar conflitos entre a Thread do AWT e essa outra Thread que você criou. Faça assim:
EventQueue.invokeLater(new MainWindow());
Thank you very much!
Uma coisa que faltou na inicialização da janela que também faz toda a diferença para a performance é isso:
|
"Denial is the most predictable of all human responses" - Matrix Architect |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2009 08:55:55
|
Fox McCloud
JavaEvangelist
![[Avatar]](/images/avatar/8860a4e27cbbe4c63821b429211684a3.jpg)
Membro desde: 29/06/2005 09:29:46
Mensagens: 440
Offline
|
pintofree wrote:
pintofree wrote:Se eu quizer controlar a bolinha pelo teclado, que classe altero?
Bem resolvi usar um keyevent dentro do main, que chama direntes eventos na ball dependendo da seta precionada, ai assim ela vai pra onde eu quero.
Que vc acha disto? POG?
Tambem coloquei a bolinha pra ir mudando de cor enquanto anda pela tela! Ficou bem psicodelico.
POG total!
Já existem os três métodos implementados do KeyListener na classe EngineImpl:
Eles já recebem os eventos de teclado do usuário.
Você pode manter a bola na lista, mas também referenciá-la em outra variável, e poderá chamar métodos dela de dentro dos métodos implementados do KeyListener:
|
"Denial is the most predictable of all human responses" - Matrix Architect |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2009 09:00:05
|
maior_abandonado
JWizard
![[Avatar]](/images/avatar/0d7c463832b871c20405a6c9296b5517.jpg)
Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline
|
Fox McCloud wrote:
Estou reunindo forças para fazer um tutorial de desenvolvimento de jogos, e a idéia é colocar as idéias principais sem muita firula, exemplificando com um jogo completo, o que vai permitir que um desenvolvedor dedicado consiga usar isso como "start point" para desenvolver qualquer jogo 2D.
opa...muito bacana...
só peço que avise aqui do seu tutorial... não quero perde-lo por nada...
tenho vontade de aprender isso quando crescer... ^^
|
espero ter ajudado...
falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2009 09:13:36
|
pintofree
Virtual Machine Man
![[Avatar]](/images/avatar/e0652a0045dbc0b14d016619158789ce.jpg)
Membro desde: 19/12/2007 12:44:42
Mensagens: 651
Localização: Cuiabá - MT
Offline
|
Fox McCloud wrote:
pintofree wrote:
pintofree wrote:Se eu quizer controlar a bolinha pelo teclado, que classe altero?
Bem resolvi usar um keyevent dentro do main, que chama direntes eventos na ball dependendo da seta precionada, ai assim ela vai pra onde eu quero.
Que vc acha disto? POG?
Tambem coloquei a bolinha pra ir mudando de cor enquanto anda pela tela! Ficou bem psicodelico.
POG total!
Já existem os três métodos implementados do KeyListener na classe EngineImpl:
Eles já recebem os eventos de teclado do usuário.
Você pode manter a bola na lista, mas também referenciá-la em outra variável, e poderá chamar métodos dela de dentro dos métodos implementados do KeyListener:
Pois é depois que postei q vi os metodos ai no engine, ai mudei pra lah.
|
SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer, Enterprise Edition 5
"When the compiler's not happy, ain't nobody happy."
|
|
|
 |
|
|