Play nao se move

algem pode me ajudar ? tava criando um game rpg básico mas o play não se move, mas os eventos dos botoes estão funcionando!

package mls.Game;

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 mls.Entity.Entity;
import mls.Entity.Player;
import mls.Graficos.SpritesSheets;

public class Game extends Canvas implements Runnable, KeyListener {

	private static final long serialVersionUID = 1L;
	public JFrame frame;
	private boolean isRunning = true;
	private Thread thread;
	private BufferedImage image;

	public List<Entity> entities;
	public SpritesSheets spritesheet;

	// Variaveis:
	private final int WIDTH = 900;
	private final int HEIGHT = 640;
	private Player player;
	
	public Game() {
		addKeyListener(this);
		setPreferredSize(new Dimension(WIDTH, HEIGHT)); // dimenção da janela

		image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

		entities = new ArrayList<Entity>();
		spritesheet = new SpritesSheets("/sp.png");

		player = new Player(500, 100, 80, 80, spritesheet.getSprite(678, 0, 80, 80));
		// Pode ser feito assim!
		entities.add(player);

		initFrame();
	}

	public void initFrame() {
		frame = new JFrame("RPG 3.0");
		frame.add(this);
		frame.setResizable(true);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	public synchronized void start() {
		thread = new Thread(this);
		isRunning = true;
		thread.start();
	}

	public synchronized void stop() {

	}

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

	public void tick() {
		for (int i = 0; i > entities.size(); i++) {
			Entity e = entities.get(i);
			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, 51, 0));
		g.fillRect(0, 0, WIDTH, HEIGHT);

		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, HEIGHT, null);
		bs.show();
	}

	@Override
	public void run() {
		long lestTime = System.nanoTime();
		double amountOfticks = 60;
		double ns = 1000000000 / amountOfticks;
		double delta = 0;
		int frame = 0;
		double time = System.currentTimeMillis();

		while (isRunning) {
			long now = System.nanoTime();
			delta += (now - lestTime) / ns;
			lestTime = now;
			
			if (delta > +1) {
				this.tick();
				this.render();
				frame++;
				delta--;
			}
			
			if (System.currentTimeMillis() - time >= 1000) {
				System.out.println("FPS:" + frame);
				frame = 0;
				time += 1000;
			}
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_D) {
			player.right = true;
		} else if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_A) {
			player.left = true;
		}
		
		if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W) {
			player.up = true;
		} else if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S) {
			player.down = true;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_D) {
			player.right = false;
		} else if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_A) {
			player.left = false;
		}
		
		if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W) {
			player.up = false;
		} else if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S) {
			player.down = false;
		}
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
	
	}
}
package mls.Entity;

import java.awt.image.BufferedImage;

public class Player extends Entity {
	
	public boolean right, up, left, down;
	public double spid = 4;
	
	public Player(int x, int y, int width, int height, BufferedImage sprite) {
		super(x, y, width, height, sprite);
	}
	
	public void tick() {
		if(right) 
			x += spid;
			
		if(left)
			x -= spid;
		
		if(up)
			y -= spid;
		else if (down)
			y += spid;
	}
package mls.Entity;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class Entity {

	protected double x;
	protected double y;
	protected int width;
	protected int height;
	
	private BufferedImage sprite;
	
	public Entity(int x , int y, int width, int height, BufferedImage sprite) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
		this.sprite = sprite;
	}
	
	public void setX(int newX) {
		this.x = newX;
	}

	public void setY(int newY) {
		this.y = newY;
	}

	public int getX() {
		return (int)x;
	}

	public int getY() {
		return (int)y;
	}
package mls.Graficos;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class SpritesSheets {

	private BufferedImage spritessheet;
		
	public SpritesSheets(String peth) {
		try {
			spritessheet = ImageIO.read(getClass().getResource(peth));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public BufferedImage getSprite(int x, int y, int width, int height) {
		return spritessheet.getSubimage(x, y,width,height);
	}
}

Cara! Eu fiquei confuso nesse método aqui, ele parece que foi escrito dentro da classe Entity, mas eu só tô vendo ele na classe Player, a não ser que você esteja sobrescrevendo esse método.

Também tem esse aqui! Eu eu acho que é responsável por desenhar o player (Entity) na tela. Então você já verificou se esse método tá pegando a posição atualizada do objeto player ná hora de desenhar?

Como você disse que os eventos dos botões tão funcionando, você já verificou se a posição do player realmente está sendo atualizada dentro do método .tick() e .render()?

oi brother o método sa subscrito sim, no outro sait ja me deram uma resposta na clase game eu troquei o lado do sinal no if.
if (delta > +1) { // correto é "<"
mas obrigadão mesmo assim!
quebrei a cabeça procurando erro nunca q ia descobrir sozinho.

1 curtida