Além disso encontrei um material muito bom mesmo a respeito de desenvolvimento de jogos em Java: Killer Game Programming.
Segue em anexo um .jar auto-executável com o jogo que estou fazendo. Ainda está em desenvolvimento (por exemplo: ainda não tem game over nem pontuação), mas já está funcional. Quando o jogo estiver pronto eu estou pensando em desenvolver um tutorial a respeito de programação de jogos em Java com o código-fonte do jogo.
Alguém por aqui já desenvolveu algum jogo comercial, ou produto final com uma qualidade boa?
fazer com que a peça faça o caminho instantaneamente
o fundo ficou bonito, mas depois de 2 minutos começou a doer do lado da cabeça hehe
adotar nomenclatura em inglês para evitar coisas como PecasManager, mas isso é bem pessoal
Mais uma vez, parabéns
F
Fox_McCloud
Obrigado!
Sugestões:
<space> fazer com que a peça faça o caminho instantaneamente
o fundo ficou bonito, mas depois de 2 minutos começou a doer do lado da cabeça hehe
adotar nomenclatura em inglês para evitar coisas como PecasManager, mas isso é bem pessoal
- Gostei da idéia do espaço… vou pensar nisso!
- No fundo eu quis viajar um pouco, pretendo manter o movimento, mas provavelmente até o fim do projeto vou bolar alguma imagem mais interessante para o fundo, quem sabe mudar a imagem a cada nível de jogo.
- Hehehe… PecasManager ficou bem miscelânico, né? Com certeza adotar linguagem única (de preferência uma linguagem universal na qual estão definidas as regras de nomenclatura do Java e JavaBeans) fica melhor…
Mas esse projeto ainda tem uma quilometragem pra rodar!
Obrigado pelo apoio!
R
Roger75
Oi
Que versão de jdk você usou? É que eu tentei rodar com a 1.4.2_04 mas não foi…
F
Fox_McCloud
JDK 1.5.0_06
Embora eu não tenha usado nenhum recurso específico do Java 5, essa é a minha versão do JDK e eu usei a compilação padrão…
Tenta rodar a versão abaixo, que eu compilei usando compatibilidade com Java 1.4.
R
Roger75
Valeu por fazer upload de outra versão, mas deu exceção:
java.lang.UnsupportedOperationException: Cannot change display mode
at java.awt.GraphicsDevice.setDisplayMode(GraphicsDevice.java:250)
at sun.awt.Win32GraphicsDevice.setDisplayMode(Win32GraphicsDevice.java:2
97)
at view.FullScreenWindow.disposeFullScreenWindow(FullScreenWindow.java:9
2)
at view.FullScreenWindow$1.run(FullScreenWindow.java:56)
Pelo jeito devo usar jdk 1.5 mesmo
F
Fox_McCloud
Acho que sim.
Depois me diga o que achou!
F
Fox_McCloud
Aí, pessoal, segue uma versão mais aprimorada do meu Tetris, está progredindo…
Eu retirei imagens png que estavam impedindo a aceleração do jogo pela placa de vídeo, então agora está 100% acelerado.
Tem uma indicação embaixo do jogo, à esquerda, mostrando a taxa de frames por segundo.
Tem uma borda animada em torno do tabuleiro em que caem as peças.
É exibida a próxima peça que vai cair.
Quando uma linha é eliminada existe um efeito de “explosão” da linha, ficou da hora.
Ainda não tem game over nem painel de pontuação nem mudança de nível, essas são cenas dos próximos capítulos.
Peguem aí o .jar auto-executável, requer Java 5 (usei recursos específicos desta vez, pra facilitar a programação).
Aguardo opiniões, críticas, sugestões, etc…
Quando estiver totalmente pronto eu fornecerei o código-fonte.
D
dudaskank
Bom, ainda não vi, mas pretendo ver hehehe
Roger75:
Valeu por fazer upload de outra versão, mas deu exceção:
java.lang.UnsupportedOperationException: Cannot change display mode
at java.awt.GraphicsDevice.setDisplayMode(GraphicsDevice.java:250)
at sun.awt.Win32GraphicsDevice.setDisplayMode(Win32GraphicsDevice.java:2
97)
at view.FullScreenWindow.disposeFullScreenWindow(FullScreenWindow.java:9
2)
at view.FullScreenWindow$1.run(FullScreenWindow.java:56)
Pelo jeito devo usar jdk 1.5 mesmo
bom, esses métodos estão no java 1.4, então esse você vai precisar…
Isso não faz muito sentido… o que vc quis dizer, que estava devagar com as imagens? Se for, provavelmente você estava fazendo algo errado, hehehe…
Flw e boa sorte! Quem sabe você não me inspira pra eu fazer o meu Tetris hehehe
J
jaboot
Só pra constar:
C:\Documents and Settings\dbalarini\Desktop\Arquivos>java -jar "Final Tetris 2006(2).jar"
Exception in thread "Thread-2" java.lang.IllegalArgumentException: Invalid display mode
at sun.awt.Win32GraphicsDevice.setDisplayMode(Win32GraphicsDevice.java:391)
at view.FullScreenWindow.setFullScreenWindow(Unknown Source)
at view.FullScreenWindow$1.run(Unknown Source)
I
Ironlynx
Tah ficando massa!
E aqui rodou sem erros(Tiger 1.5.04)
Isso me lembra um “pornotetris” que eu tentei fazer na época da facul…(ficou um lixo…)
J
jaboot
Boa… eu to usando o 1.5.06, será que é isso? Mas também é o computador do trampo, vou ver se em casa funciona direitinho.
Exception in thread “main” java.lang.UnsupportedClassVersionError: Main (Unsupported major.minor version 49.0)
Source)
Para todo mundo que pegar esse erro: você tem de rodar esse programa usando Java 5.0 ou posterior. Simplesmente clicar duas vezes no Jar pode acabar invocando um Java 1.4 ou anterior na sua máquina.
F
Fox_McCloud
Desculpem a demora pra responder, estou sem internet em casa.
Então, como eu estou usando a Fullscreen Exclusive Mode API, pesquisei o assunto. Quando são utilizadas imagens com canal alpha de transparência, a API não suporta a aceleração gráfica, apenas quando a transparência é total (como em um gif), então eu removi as imagens que utilizavam canal alpha (no caso as imagens png)…
Entretanto, a aceleração de imagens com canal alpha está prevista em próximas versões do Java, não sei se já na versão 6.
Espero que você fique inspirado! Quando começamos a mexer com alguma coisa pode ser difícil, mas vencida a dificuldade inicial, fica cada vez mais fácil, até que se torna natural!
:lol:
Ahuahuahua… sabe, o Picasso, antes de inventar o cubismo, teve que aprender as técnicas clássicas de pintura, que foram usadas por Leonardo da Vinci, por exemplo, para pintar a Mona Lisa. Somente depois de aprimorar a técnica ele criou coisas diferentes. Então, pra poder fazer um “Porno Tetris”, ou um “Conkers Bad Fur Day”, e ficar legal, eu creio que seja um pré-requisito já ter feito pelo menos um joguinho tradicional a fim de dominar bem a técnica!
É isso aí. Além do mais, eu usei algumas coisas específicas do Java 5, como o for avançado.
for(Objectobj:lista){...}
E tem também o fato de que nos testes que eu fiz aqui usando Java 1.4, o aplicativo não conseguiu mudar a resolução do monitor, o que gerou erros como “Cannot change display mode” e “Invalid Display Mode”.
D
dudaskank
Bom, esse erro do Invalid Display Mode, talvez seja porque você estava tentando mudar para uma resolução não suportada. Por exemplo, existem placas que suportam 800x600x32, mas não 800x600x24.
Tem um método em alguma dessas classes GraphicAlgumaCoisa que retorna a lista de modos válidos, não sei como vc faz, mas seria interessante olhar ela antes de mudar.
Mas…
Aí você me pegou. Se antes dava erro e trocando de Java não ocorre o erro, aí não sei o que poderia ser hehehe
flw e continue o bom trabalho… aliás, eu cheguei a executar, mas não joguei porque to no trampo sabe como é… só vi que o fundo é animado e tem a pecinha caindo
K
klebergf
Ficou muito Bom!!!
Parabens pelo trabalho!
C
Cammy
Po, ficou muito legal!!!
Fox McCloud:
Alguém por aqui já desenvolveu algum jogo comercial, ou produto final com uma qualidade boa?
Ainda não, mas estou tentando. A principal dúvida é como fazer as animações. Você usou o que, Java2D mesmo?
D
dudaskank
Opa, enquanto nosso amigo não volta nisso eu posso dar uma ajuda.
Para fazer uma animação, a coisa é bem simples, você precisa de uma lista que irá guardar as imagens, o tempo entre cada uma delas e o tempo que o quadro atual está sendo mostrado.
Eu tenho aqui uma classe, que copiei de um livro on-line, infelizmente não tenho o link pro livro aqui, mas ela é excelente. Vou passar aqui ela e o modo de usar:
packagecom.lighthawkwings.graphics;importjava.awt.Image;importjava.util.ArrayList;/** * The Animation class manages a series of images (frames) and the amount of * time to display each frame. */publicclassAnimation{privateArrayListframes;privateintcurrentFrameIndex;privatelonganimTime;privatelongtotalDuration;/** * Creates a new, empty Animation. */publicAnimation(){this(newArrayList(),0);}privateAnimation(ArrayListframes,longtotalDuration){this.frames=frames;this.totalDuration=totalDuration;start();}/** * Creates a duplicate of this animation. The list of frames are shared * between the two Animations, but each Animation can be animated * independently. */publicObjectclone(){returnnewAnimation(frames,totalDuration);}/** * Adds an image to the animation with the specified duration (time to * display the image). */publicsynchronizedvoidaddFrame(Imageimage,longduration){totalDuration+=duration;frames.add(newAnimFrame(image,totalDuration));}/** * Starts this animation over from the beginning. */publicsynchronizedvoidstart(){animTime=0;currentFrameIndex=0;}/** * Updates this animation's current image (frame), if neccesary. */publicsynchronizedvoidupdate(longelapsedTime){if(frames.size()>1){animTime+=elapsedTime;if(animTime>=totalDuration){animTime=animTime%totalDuration;currentFrameIndex=0;}while(animTime>getFrame(currentFrameIndex).endTime){currentFrameIndex++;}}}/** * Gets this Animation's current image. Returns null if this animation has * no images. */publicsynchronizedImagegetImage(){if(frames.size()==0){returnnull;}else{returngetFrame(currentFrameIndex).image;}}privateAnimFramegetFrame(inti){return(AnimFrame)frames.get(i);}/** * @return Returns the currentFrameIndex. */publicintgetCurrentFrameIndex(){returnthis.currentFrameIndex;}publicintgetTotalFrames(){returnframes.size();}privateclassAnimFrame{Imageimage;longendTime;publicAnimFrame(Imageimage,longendTime){this.image=image;this.endTime=endTime;}}}
Para usar a classe, você cria uma animação nova com o construtor público e vai adicionando as imagens e o tempo de duração dela. Aí, durante o seu programa, você precisa chamar o update() passando o tempo que passou desde a última chamada ao método update(), e na hora de desenhar, dar o getImage() que ele te retorna a imagem que deve ser desenhada naquela hora...
Espero que ajude em algo essa classe hehe... flw
D
dudaskank
Aliás, vou até mandar o que tenho aqui pra vcs verem, quem sabe ajuda em alguma coisa né… isso era pra monografia da minha pós que nunca saiu hehehe.
Com fontes, e a classe de animação fica em com.lighthawkwings.graphics
flw povo
[edit]precisa do java 1.4 pra rodar… se bem que compilei aqui onde uso 1.5, então se der aquele erro de versão da classe não suportada, precisam recompilar com o 1.4…
[edit2]me enganei, compilei com o 1.4 mesmo. o eclipse só ta configurado com ele.