Java 2D Iniciante (Duvidas sobre imagens)

Olá gente, eu sou novo aqui, dei uma olhada em diversos foruns e sites, porem não tive sucesso na minha busca. Eu estou querendo desenvolver um jogo em Java 2D, a estrutura dele seria com sprites estilos de RPG Maker [aquele conjunto de imagens organizadas formando cada animação (sprite -set)] e o mesmo tipo de visão (camera - com o personagem centralizado sempre).

Bom, aqui vai o meu problema, achei alguns sites que me ensinaram a fazer uma animação com uma sprite set, porém eu não tenho o controle dela, fazer o personagem parar e andar a hora que eu quero, também não gostaria de criar uma imagem para cada animação (a forma que eu sei animar e deslocar a imagem pela tela).

O fato é que eu estou iniciando agora e preciso de apostilas, tutorias ou dicas que seja bem claras pra alguem que esta começando, de preferencia em portugues.

Eu sei e ja vi diversos projetos aqui neste forum e sei que o pessoal entende do assunto e pode me ajudar.

Com esse jogo eu pretendo aprender e utilizar para estudo, quem sabe evoluir o projeto, penso em um dia fazer um MMORPG (não sozinho é claro hehehe), mas por enquanto apenas aprender a manipular imagens, e aprofundar na estruturação de um jogo, sei que não é facil e se fosse, eu não teria esse interesse todo. Só espero que tenha sido claro na minha duvida, pois como eu estou iniciando, posso não saber os nomes ou termos mais adequados.

Então é isso pessoal, obrigado pela atenção e pela ajuda de todos.
Abraço.

P.S.: dei uma pesquisada em outros foruns, e sites como o pontoV, gostei bastante, consegui entender os codigos mas tive um pouco de dificuldade de entender onde implementar no codigo todo.

Eu fiz assim uma vez

Esse é meu sprite

Cada linha é uma animação

Cada coluna é um frame da animação

A classe base é a classe Sprite que recebe a imagem
http://code.google.com/p/bomberlink/source/browse/trunk/bomberlink/sprite.js

Ela tem esse método update que é chamado a cada iteração no loop do jogo e é passado pra esse update o intervalo de tempo válido desde o último frame (a 60fps seria algo em torno de 16.6 ms)

Essa função vai incrementando um contador com o tempo, se passar de um certo valor, incrementa o frame da animação. Se passar do último volta pro primeiro

Quem fornece esse valor? A classe que extende Sprite, ex:

http://code.google.com/p/bomberlink/source/browse/trunk/bomberlink/link.js

A classe que extende precisa passar 2 arrays para a classe Sprite

var LINK_ANIMATION_FRAMES = [1, 8, 1, 8, 1, 8, 1, 8];
var LINK_ANIMATION_TIMES = [0, 60, 0, 60, 0, 60, 0, 60];

O primeiro diz quantos frames tem cada linha no sprite que mostrei
O segundo diz pra cada linha de quanto em quanto tempo muda o frame da animação

A linha atual é apontado pelo índice animationY, quando eu troco de animação é só trocar o animationY e resetar o animationX (esse é mudado automaticamente por aquela função update, quando o contador excede o valor de LINK_ANIMATION_TIMES[animationY])

Opa, certo a logica eu acho que entendi, é bem essa a minha ideia, uma imagem com todas as animações e pegar “blocos” dela pra cada ação (andar para cima/esquerda/direita/abaixo/lutar/…) mas eu não sei como faze isso em java, eu li teus codigos de javascript e me deu uma luz, mas meu problema ainda fica na parte de sintaxe da linguagem, como eu andei pesquisando e vendo varios foruns e tutoriais, eu vi diversas formas de se carregar uma imagem, e eu não sei se existe uma que seja mais adequada ou até mesmo a que mais utilizada para esse tipo de situação, tive um grande problema em achar material em portugues sobre o assunto, os que eu achei a maioria tratava com imagens separadas, video aulas só em ingles. =/

Eu realmente sou iniciante no java, mas ja tenho uma pequena noção de P.O.O, um tutorial que eu achei e que me pareceu bem bom para começar foi este: http://seumestredaweb.blogspot.com.br/2012/06/java-games-2d-tutor-1.html
falando de eventos de teclado/mouse, animando imagem (ele trabalha com varias imagens para compor uma ação, não com um sprite set). Também procurei informações em outros sites
mas realmente não consegui achar. =/

Esse tutorial é bom, vai lhe ensinar a criar um loop do jogo, calcular o tempo (pra chamar o update) e adquirir um Graphics2D pra desenhar a imagem

http://www.cokeandcode.com/index.html?page=tutorials/spaceinvaders101

Pra carregar imagem é assim

ImageIO.read(inputStream)

Colocando a imagem na pasta src, se você tem uma classe Personagem.java em algum lugar e uma imagem personagem.png nesse mesmo lugar ficaria assim

Image image = ImageIO.read(Personagem.class.getResourceAsStream(“personagem.png”));

se a imagem tá na pasta base src seria assim

Image image = ImageIO.read(Personagem.class.getResourceAsStream("/personagem.png"));

Quando tem o / é o caminho absoluto, quando não tem começa da mesma pasta daonde a classe que vc usou (no caso Personagem) está

O que fica faltando é saber desenhar só a parte específica da imagem que você quer, no tutorial ele desenha toda, vc vai ter q usar o método draw q tem vários parâmetros…

Vai tentando, se não conseguir talvez eu passe o código pra Java e posto aqui. Aquele código JS é isso aqui:
http://www.victorcisneiros.com/html/bomberlink/

Cara, eu vou dar uma olhada e tentar fazer aqui, eu estava realmente precisando de uma explicação mais detalhada do codigo e da sintaxe, eu via muito “BufferedImage”, “ImageIO”, “ImageIcon” e atribuindo a alguns deles “drawImage” e nisso eu realmente estava ficando confuso a respeito de como capturar a imagem, eu vou tentar movimentar uma unica imagem por vez, vou olhar com atenção esse tutorial que tu postou. Sei que estou tentando dar um passo maior que a minha perna com a ideia de querer ja sair animando sprites.

Sem querer abusar muito e se não for incomodo, se tiver como “traduzir” do js para o java me ajudaria muito a entender o que se passa, pois pelo que eu entendi ele transforma a imagem em um array e quando tu faz uma ação, por exemplo: andar para a esquerda, no codigo teria que mandar ele percorrer os indices correspondentes a estas imagens, por exemplo: 3,4,5, então manter nesse loop até que o usuario pare de mandar ele andar para a esquerda. Essa foi a logica que eu entendi, não sei se é só isso ou se existe mais alguma coisa (tratando de logica), mas eu vou ver o tutorial que tu me passou e tentar pegar bem essa parte de loop e tempo de update.

Obrigado! =)