Tetris em Java

  Estou desenvolvendo um Tetris em Java, usando a “Fullscreen Exclusive Mode API”.

   8)

  Além disso encontrei um material muito bom mesmo a respeito de desenvolvimento de jogos em Java: Killer Game Programming.

   :smiley:

  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.

   :wink:

  Alguém por aqui já desenvolveu algum jogo comercial, ou produto final com uma qualidade boa?

   :shock:
 

1 curtida

Ficou bom cara, parabéns :smiley:

Sugestões:

  • 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 :smiley:

  Obrigado! :smiley:

[quote] 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 [/quote]
      - 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é? :stuck_out_tongue: 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! :smiley:

  Obrigado pelo apoio!

Oi

Que versão de jdk você usou? É que eu tentei rodar com a 1.4.2_04 mas não foi…

  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.
 

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

  Acho que sim.

  Depois me diga o que achou!

   :slight_smile:

  Aí, pessoal, segue uma versão mais aprimorada do meu Tetris, está progredindo…

:smiley:

  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.
 

Bom, ainda não vi, mas pretendo ver hehehe

[quote=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[/quote]

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

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)

Tah ficando massa! :smiley:
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…)

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.

Aqui deu outro erro…

[quote]Exception in thread “main” java.lang.UnsupportedClassVersionError: Main (Unsupported major.minor version 49.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)[/quote]

[quote=Cammy]Aqui deu outro erro…

[quote]Exception in thread “main” java.lang.UnsupportedClassVersionError: Main (Unsupported major.minor version 49.0)
Source)[/quote][/quote]

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.

Desculpem a demora pra responder, estou sem internet em casa.

:stuck_out_tongue:

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.

:smiley:

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(Object obj : 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”.

:wink:

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 :stuck_out_tongue:

Ficou muito Bom!!!
Parabens pelo trabalho!

Po, ficou muito legal!!!

[quote=Fox McCloud]Alguém por aqui já desenvolveu algum jogo comercial, ou produto final com uma qualidade boa?
[/quote]

Ainda não, mas estou tentando. A principal dúvida é como fazer as animações. Você usou o que, Java2D mesmo?

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:

[code]
package com.lighthawkwings.graphics;

import java.awt.Image;
import java.util.ArrayList;

/**

  • The Animation class manages a series of images (frames) and the amount of

  • time to display each frame.
    */
    public class Animation {

    private ArrayList frames;

    private int currentFrameIndex;

    private long animTime;

    private long totalDuration;

    /**

    • Creates a new, empty Animation.
      */
      public Animation() {
      this(new ArrayList(), 0);
      }

    private Animation(ArrayList frames, long totalDuration) {
    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.
      */
      public Object clone() {
      return new Animation(frames, totalDuration);
      }

    /**

    • Adds an image to the animation with the specified duration (time to
    • display the image).
      */
      public synchronized void addFrame(Image image, long duration) {
      totalDuration += duration;
      frames.add(new AnimFrame(image, totalDuration));
      }

    /**

    • Starts this animation over from the beginning.
      */
      public synchronized void start() {
      animTime = 0;
      currentFrameIndex = 0;
      }

    /**

    • Updates this animation’s current image (frame), if neccesary.
      */
      public synchronized void update(long elapsedTime) {
      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.
      */
      public synchronized Image getImage() {
      if (frames.size() == 0) {
      return null;
      }
      else {
      return getFrame(currentFrameIndex).image;
      }
      }

    private AnimFrame getFrame(int i) {
    return (AnimFrame) frames.get(i);
    }

    /**

    • @return Returns the currentFrameIndex.
      */
      public int getCurrentFrameIndex() {
      return this.currentFrameIndex;
      }

    public int getTotalFrames() {
    return frames.size();
    }

    private class AnimFrame {

     Image image;
    
     long endTime;
    
     public AnimFrame(Image image, long endTime) {
     	this.image = image;
     	this.endTime = endTime;
     }
    

    }
    }[/code]

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

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.