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
}
}