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

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 = 1000000000 / 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
		
	}
}