Como programar duas animações "idle" 2D em Java?

0 respostas
gamesjavaprogramação
T

alguem pode me ajudar? eu estou tentando implementar duas animações idles no jogo que eu estou desenvolvendo para uma game jam, então se possível eu gostaria de uma resposta o quanto antes possível
eu fiz 2 animações do meu personagem respirando e gostaria de implementá-las no meu game de acordo com a ultima direção que meu jogar andou, por exemplo:
no meu jogo só é possivel andar para a direita e para a esquerda, ent eu queria fazer cm que, se a ultima direção que meu jogador andou tiver sido direita, a animação do meu personagem virado e respirando para a direita estivesse rodando enquanto estivesse parado, a mesma coisa com a esquerda
(as partes comentadas são algumas anotações q eu fiz e outras algumas coisas q eu estava testando para tentar fazer isso der certo, e que acabou não dando kkk)

CLASSE PLAYER:

package com.kadrakstudios.entities;

import java.awt.Graphics;
import java.awt.image.BufferedImage;

import com.kadrakstudios.main.Game;

public class Player extends Entity{
	
	//booleans para ativação da movimentação após o pressionar das teclas
	public boolean right,left;
	//ultimas direções
	public int right_dir = 0, left_dir = 1;
	//atual ultima direção
	public int dir;
	//posição + velocidade = movimentação
	public double speed = 1.5;
	//arrays para definir a sequencia de animação
	private BufferedImage[] rightPlayer;
	private BufferedImage[] leftPlayer;
	//---------------------------------------private BufferedImage[] idleRightPlayer;
	//---------------------------------------private BufferedImage[] idleLeftPlayer;
	//contador para determinar o tempo de duração e ativação de cada sprite para animação do player
	private int frames = 0,maxFrames = 8;
	public int index = 0;
	private int maxIndex = 3;
	private boolean moved = false;
	//método construtor estabelecendo parametros para quando a calsse player for puxada
	public Player(int x, int y, int width, int height, BufferedImage sprite) {
		super(x, y, width, height, sprite);
		
		//definindo o número de sprites de cada animação
		//---------------------------------------idleRightPlayer = new BufferedImage[5];
		//---------------------------------------idleLeftPlayer = new BufferedImage[5];
		rightPlayer = new BufferedImage[4];
		leftPlayer = new BufferedImage[4];
		
		//dando vida a animação atraves de loopings
		for(int i = 0; i < 4; i++) {
		rightPlayer[i] = Game.spritesheet.getSprite(0 + (i*32), 96, 32, 32);
		}
		for(int i = 0; i < 4; i++) {
		leftPlayer[i] = Game.spritesheet.getSprite(0 + (i*32), 224, 32, 32);
		}
		//-------------------------
		/*
		for(int i = 0; i < 4; i++) {
		idleRightPlayer[i] = Game.spritesheet.getSprite(0 + (i*32), 0, 32, 32);
		}
		for(int i = 0; i < 4; i++) {
		idleLeftPlayer[i] = Game.spritesheet.getSprite(0 + (i*32), 128, 32, 32);
		}
		*/
		//-------------------------
		
	}
	
	//re-declarando o método que antes pertencia a classe Entity(flecha verde)
	public void tick() {
		moved = false;
		//definindo a execução de códigos para cada tecla apertada
		
		/*
		if(idleRight) {
			dir = right_idle_dir;
			
		}else if(idleLeft) {
			dir = left_idle_dir;
			
		}
		*/
		
		if(right) {
			moved = true;
			dir = right_dir;
			x+=speed;
			
		}else if(left) {
			moved = true;
			dir = left_dir;
			x-=speed;
		}
		if(moved) {
			frames++;
			if(frames == maxFrames) {
				frames = 0;
				index++;
				if(index > maxIndex) {
					index = 0;
				}
			}
		}
		
	}
	//re-declarando o método que antes pertencia a classe Entity (flecha verde)
	//renderizando a player e também sua primeira forma (como ele aparecerá no jogo)
	public void render(Graphics g) {
		//definindo o que será renderizado do player, animação inicial e posição
		/*if(dir == right_idle_dir) {
		g.drawImage(idleRightPlayer[0],this.getX(),this.getY(),null);
		}else if(dir == left_idle_dir) {
		g.drawImage(idleLeftPlayer[0],this.getX(),this.getY(),null);
		}*/
		
		if(dir == right_dir) {
		g.drawImage(rightPlayer[index],this.getX(),this.getY(),null);
		}else if(dir == left_dir) {
		g.drawImage(leftPlayer[index],this.getX(),this.getY(),null);
		}
		
	}
	

}

CLASSE GAME

package com.kadrakstudios.main;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;

import com.kadrakstudios.entities.Entity;
import com.kadrakstudios.entities.Player;
import com.kadrakstudios.graficos.Spritesheet;

public class Game extends Canvas implements Runnable,KeyListener{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public static JFrame frame;
	private final int WIDTH = 240;
	private final int HEIGHT = 160;
	private final int SCALE = 3;
	private Thread thread;
	private boolean isRunning = true;
	
	private BufferedImage image;
	public List<Entity> entities;
	public static Spritesheet spritesheet;
	private Player player;

	
	public Game() {
		addKeyListener(this);
		this.setPreferredSize(new Dimension(WIDTH*SCALE,HEIGHT*SCALE));
		initFrame();
		//inicializando objetos
		image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB);
		entities = new ArrayList<Entity>();
		spritesheet = new Spritesheet("/spritesheet.png");
		player = new Player(32,32,32,32,spritesheet.getSprite(0, 0, 32, 32));
		//adicionando player como uma entidade para que possa ser renderizada
		entities.add(player);
		
	}
	public void initFrame() {
		frame = new JFrame("muito sus");
		frame.add(this);
		frame.setResizable(false);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	public static void main(String[] args) {
		Game main = new Game();
		main.start();
	}
	public void tick() {
		for(int i = 0; i < entities.size();i++) {
			Entity e = entities.get(i);
			//como diferenciar qual entidade é o player
			if(e instanceof Player) {
				//estou dando tick no player
			}
			e.tick();
		}
		
	}
	public void render() {
	BufferStrategy bs = this.getBufferStrategy();
	if(bs == null) {
		this.createBufferStrategy(3); 
		return;
	      }
	Graphics g = image.getGraphics();
	g.setColor(new Color(0,255,0));
	g.fillRect(0, 0, WIDTH,HEIGHT);
	//renderização do jogo
	//Graphics2D g2 = (Graphics2D) g;
	for(int i = 0; i < entities.size();i++) {
		Entity e = entities.get(i);
		e.render(g);
	}
	
	//------
	g.dispose();
	g = bs.getDrawGraphics();
	g.drawImage(image, 0,0,WIDTH*SCALE,HEIGHT*SCALE,null);
	bs.show();
	}
	@Override
	public void run() {
		requestFocus();
		long lastTime = System.nanoTime();
		double amountOfTicks = 60.0;
		double ns = [telefone removido] / amountOfTicks;
		double delta = 0;
		int frames = 0;
		double timer = System.currentTimeMillis();
		while(isRunning) {
			long now = System.nanoTime();
			delta+= (now-lastTime) / ns;
			lastTime = now;
			 if(delta>=1) {
				 tick();
				 render();
				 frames++;
				 delta--;
			 }
			 if(System.currentTimeMillis() - timer >=1000) {
				System.out.println("FPS: "+frames);
				frames = 0;
				timer+=1000;
			 }
		}
		stop();
	}
	public synchronized void start() {
		thread = new Thread(this);
		isRunning = true;
		thread.start();
	}
	public synchronized void stop() {
		isRunning = false;
		try {
			thread.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		if(e.getKeyCode() == KeyEvent.VK_RIGHT ||
				e.getKeyCode() == KeyEvent.VK_D) {
			player.right = true;
			//System.out.println("right");
			
		}else if(e.getKeyCode() == KeyEvent.VK_LEFT ||
				e.getKeyCode() == KeyEvent.VK_A) {
			player.left = true;
			//System.out.println("left");
			
		}
		
	}
	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		if(e.getKeyCode() == KeyEvent.VK_RIGHT ||
				e.getKeyCode() == KeyEvent.VK_D) {
			player.right = false;
			player.index = 1;
			
			
		}else if(e.getKeyCode() == KeyEvent.VK_LEFT ||
				e.getKeyCode() == KeyEvent.VK_A) {
			player.left = false;
			player.index = 1;
			
		}
		
	}
	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
Criado 18 de dezembro de 2021
Respostas 0
Participantes 1