to ligado as outra s maneira ja entendo de boa tava me batendo com o graphics G. mas vou mostra um modelo aqui ele nao usa o método paint nem o paintComponentes para renderizar, queria entender a logica, em outra pergunta q fiz ate me responderam bem mas ainda não assimilei 100%
/////////// classe principal //////////////
public class Game extends Canvas implements Runnable, KeyListener {
private static final long serialVersionUID = 1L;
public JFrame frame;
public static final int WIDTH = 480;
public static final int HEIGHT = 320;
public static final int SCALE = 2;
public int fps = 0;
private Thread thread;
private boolean isRunning;
private BufferedImage image;
public static List<Entity> entities;
public static List<Inimigos> inimigos;
public static List<Tiros> tiros;
public static SpriteSheet spriteSheet;
public static Player player;
public static World world;
public static Random rand; // Foi criado na classe Game por que dai pode
//ser usado sempre q quiser, nao precisa ficar criando instancias.
public UI ui;
public Game() {
rand = new Random();
this.addKeyListener(this);
initFrame();
// inicializando objetos
ui = new UI();
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// import Araylist da biblioteca java.util!
entities = new ArrayList<Entity>();
inimigos = new ArrayList<Inimigos>();
tiros = new ArrayList<Tiros>();
spriteSheet = new SpriteSheet("/Spryte32Pixels.png"); // importante!
player = new Player(0, 0, 32, 32, spriteSheet.getSpriteSheet(0, 0, 32, 32));
entities.add(player);
world = new World("/miniMapa.png");
}
public void initFrame() {
frame = new JFrame("Game RPG");
frame.add(this);
frame.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
frame.setIconImage(java.awt.Toolkit.getDefaultToolkit().getImage(getClass().getResource("/icone.jpg")));
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public synchronized void start() {
thread = new Thread(this); // this indica em qual classe esta a thread!
isRunning = true;
thread.start(); // liga a thread!
}
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);
/*
* if(e instanceof Player) { System.out.println("estou renderizando o player");
* }
*/
e.tick();
}
for (int i = 0; i < tiros.size(); i++) {
tiros.get(i).tick();
}
}
public void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
// importe graphics da biblioteca AWT;
Graphics g = image.getGraphics();
// Vamos inserir um plano de fundo com a cor verde no padrao RGB!
g.setColor(new Color(0, 0, 0));
g.fillRect(0, 0, WIDTH, HEIGHT);
// A baixo vamso trabalhar a renderização das imagens!
world.render(g);// esse render() pertence a classe World!
for (int i = 0; i < entities.size(); i++) {
Entity e = entities.get(i);
e.render(g);
}
for (int i = 0; i < tiros.size(); i++) {
tiros.get(i).render(g);
}
// vamos por aqui para que ele seja renderizado acima de todas as imagens!
ui.render(g);
// dispose e um metodo de segurança que evita ceros rerros ou bugs!
g.dispose();
// O grafico g recebe como valor o grafico do BufferedStrategy!
g = bs.getDrawGraphics();
g.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
// Fonte com as muniçoes exibido na tela!
g.setFont(new Font("arial", Font.BOLD,20));
g.setColor(Color.white);
g.drawString("Munição: "+player.muniçao, 15, 60);
// Fonte com o fps exibido na tela!
g.setFont(new Font("Arial", Font.BOLD, 20));
g.setColor(Color.BLACK);
g.drawString("FPS: " + fps, (WIDTH * SCALE) - 100, (HEIGHT * SCALE) - 50);
// Chama as BufferedImage
bs.show();
}
@Override
public void run() {
long lestTime = System.nanoTime();// tempo aproximado
double amountOfTicks = 60; // vai resultar em 60 fps por seg
double ns = 1000000000 / amountOfTicks;
double delta = 0;
int frames = 0;
double time = System.currentTimeMillis(); // tempo decorrido
requestFocus();
while (isRunning) {
long now = System.nanoTime(); // tempo agora(tempo presente)
delta += (now - lestTime) / ns;
lestTime = now;
if (delta >= 1) {
tick();
render();
frames++;
delta--;
}
// aqui ele usa uma converçao do tempo decorrido e cria um "thread.slemp()"!
if (System.currentTimeMillis() - time >= 1000) {
fps = frames;
System.out.println("FPS: " + fps);
frames = 0;
time += 1000;
}
}
}
///// classe auxiliar /////
public class SpriteSheet {
private BufferedImage spritesheet;
// o metodo construtor vai receber as imagens da pasta ress,
// para isso pasamos como parametro String path;
public SpriteSheet(String path) {
// temos que colocar em um tray e catch!
try {
spritesheet = ImageIO.read(getClass().getResource(path));
} catch (IOException e) {
e.printStackTrace();
}
}
// Metodo geter.
public BufferedImage getSpriteSheet(int x, int y, int width, int height) {
return spritesheet.getSubimage(x, y, width, height);
}
}