Animações e Jogos  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Fox McCloud
JavaEvangelist
[Avatar]

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 [Disk] 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
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
Matheus Leandro Ferreira
JavaChild
[Avatar]

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 =)
[MSN]
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
[Email] [WWW] [MSN]
Fox McCloud
JavaEvangelist
[Avatar]

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
Fox McCloud
JavaEvangelist
[Avatar]

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
pintofree
Virtual Machine Man
[Avatar]

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

[Email] [MSN]
pintofree
Virtual Machine Man
[Avatar]

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

[Email] [MSN]
victorwss
JWizard
[Avatar]

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.
[MSN]
Fox McCloud
JavaEvangelist
[Avatar]

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
Fox McCloud
JavaEvangelist
[Avatar]

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
maior_abandonado
JWizard
[Avatar]

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.
pintofree
Virtual Machine Man
[Avatar]

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

[Email] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team