Leitura de Sprites com o Java 2D [RESOLVIDO]

Bem, procurei na internet ( E MUITO ) sobre java com jogos, e ficou uma dúvida na qual ainda não achei também, Como faço para que o Java , (tirando o ME que já tem bibliotecas prontas para isso) leia um Sprite (Sprite, não imagem como muitos mostram por ae). Vai um exemplo de Sprite no qual eu tenho dúvida.

Sprite:
:arrow: http://www.deviantart.com/download/99913543/Saraha___RPG_Maker_VX_Sprites_by_KawaiiRanChan.png

Obrigado, espero que tenho sido claro!! :X

Bem, devo imaginar que estes do google você já viu todos:

http://www.cokeandcode.com/info/tut2d.html

http://www.developer.com/java/other/article.php/893471/Fun-with-Java-Sprite-Animation-Part-1.htm

http://www.croftsoft.com/library/books/ajgp/

Se nenhum tem essa leitura você não pode usar o mesmo método usado no j2ME ???

Achei esse código em um site alemão:

[code]
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

/**

  • @author Administrator

  • TODO Explain me
    */
    public class TileTest extends JFrame {

    int screenWidth, screenHeight;

    final int TILE_WIDTH = 32;

    final int TILE_HEIGHT = TILE_WIDTH;

    int tilePosX;

    int tilePosY;

    final int TILE_COLUMN_CNT = 3;

    final int TILE_ROW_CNT = 4;

    VolatileImage[] tiles;

    BufferStrategy strategy;

    private Thread renderer = new Thread() {
    public void run() {
    int i = 0;
    while (true) {
    Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
    g.clipRect(0, 0, screenWidth, screenHeight);
    g.drawImage(tiles[i], tilePosX, tilePosY, TileTest.this);
    i = ++i % tiles.length;
    g.dispose();
    strategy.show();
    try {
    Thread.sleep(100L);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    };

    public TileTest() {
    super(“TileTest”);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

      screenWidth = 320;   
      screenHeight = 240;   
    
      tilePosX = (screenWidth - TILE_WIDTH) / 2;   
      tilePosY = (screenHeight - TILE_HEIGHT) / 2;   
      setSize(screenWidth, screenHeight);   
      setResizable(false);   
      setVisible(true);   
      initGFX();   
      createBufferStrategy(2);   
      strategy = getBufferStrategy();   
    

    }

    /**
    *
    */
    private void initGFX() {
    try {
    BufferedImage tilesMap = ImageIO
    .read(new File(“c:/sprite.PNG”));
    int width = tilesMap.getWidth();
    int height = tilesMap.getHeight();

          tiles = new VolatileImage[TILE_ROW_CNT * TILE_COLUMN_CNT];   
    
          for (int i = 0, y = 0; i < TILE_ROW_CNT; i++) {   
              for (int j = 0, x = 0; j < TILE_COLUMN_CNT; j++) {   
                  VolatileImage vImg = this.createVolatileImage(TILE_WIDTH,   
                          TILE_HEIGHT);   
                  vImg.getGraphics()   
                          .drawImage(   
                                  tilesMap.getSubimage(x, y, TILE_WIDTH,   
                                          TILE_HEIGHT), 0, 0, this);   
                  tiles[i * TILE_COLUMN_CNT + j] = vImg;   
                  x += TILE_WIDTH;   
              }   
              y += TILE_HEIGHT;   
          }   
      } catch (IOException e) {   
          e.printStackTrace();   
      }   
    

    }

    public static void main(String[] args) {
    new TileTest().start();
    }

    private void start() {
    renderer.start();
    }
    } [/code]

Bem João, 2 desse links eu já li, + eles ensinam apenas como se o Sprite fosse uma imagem comum. Eu vi no Site do Gold T Studios que eles conseguiram fazer isso… + não consegui achar essa parte do código no qual é OpenSource, então recorri para cá, caso alguém que programasse para jogos soubesse disso. Eu acredito (e tenho quase total certeza) que isso envolve matrizes e etc… pois como são vários “estados” de imagem teria de ser feito isso!! Deu pra entender ± ?

Sim, claro que entendi, já fiz jogos em j2ME usando Sprites.

Mas talvez seja justamente essa a técnica, o Sprite nada mais é do que uma parcela matricial de uma imagem maior. Você sempre pode carregar uma parte de uma imagem só. Então não vejo por que isso não seja o teu caso.

Não me aprofundei no código que postei, mas vou colocar ele num projeto e tentar entender melhor, depois posto aqui.

Ok, estarei aqui procurando e analisando os códigos que acho.
Obrigado novamente!!

o sprite é uma imagem comum.

Normalmente em desenvolvimento de jogos o designer ou o programador colocam os vários estados do personagem (os sprites) em um único arquivo. Ao carregar o jogo, ele lê este arquivo e picota nos diferentes sprites e guarda em memória, no entanto este arquivo é um PNG ou gif normal mesmo. nada impede de ser um png por sprite tb, não se faz por uma questão de otimização mesmo

Vc pode estar confundindo com gráficos vetorizados, caso seu jogo seja 3d, aí é um pouco mais complicado

Editei o codigo que postei antes, havia um erro nele.

Fiz as mudanças para manipular a imagem que postou no origem deste topico e
funcionou muito bem.

Parece que é isso mesmo, cada pedaço do Sprite é gravado numa imagem volatil através de um subImage
e daí eh só usar ele a vontade.

Muito rapido e legal.

Joao tentei rodar aqui e não foi… Vou enviar o meu código no qual = ao postado para ver se você consegue achar o erro, eu já tentei procurar + nada, eu apenas alterei essa linha do código:

private void initGFX() {   
        try {   
BufferedImage tilesMap = ImageIO.read(new File(this.getClass().getResource("BigBoss.gif").getFile()));

e os erros são:
Exception in thread “main” java.lang.NullPointerException
at com.br.game.sprite.TileTest.initGFX(TileTest.java:80)
at com.br.game.sprite.TileTest.(TileTest.java:69)
at com.br.game.sprite.TileTest.main(TileTest.java:105)
O que poderia ser ??
Obrigado.

Bem, como editado, consegui fazer funcionar, agora irei pegar a lógica e implementar no meu programa.
Obrigado a todos pela ajuda!! :wink: