poqr que quando eu fecho meu programa as X da esse erro java.io.IOException: closed
at java.desktop/javax.imageio.stream.ImageInputStreamImpl.checkClosed(ImageInputStreamImpl.java:110)
at java.desktop/javax.imageio.stream.ImageInputStreamImpl.close(ImageInputStreamImpl.java:857)
at java.desktop/javax.imageio.stream.FileCacheImageInputStream.close(FileCacheImageInputStream.java:253)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1473)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1422)
at graficos.ImageLoader.loadImage(ImageLoader.java:14)
at entidades.Entiti.loadImage(Entiti.java:30)
at entidades.Player2.render(Player2.java:46)
at com.cett.Game.render(Game.java:132)
at com.cett.Game.run(Game.java:167)
at java.base/java.lang.Thread.run(Thread.java:833)
/// package com.cett;
public class Game extends Canvas implements Runnable {
private static JFrame frame;
public static final int WIDTH = 1000;
public static final int HEIGHT = 700;
private int FPS;
private Thread thread;
private boolean isRunnable = false;
Player1 p1;
Player2 p2;
private BufferedImage image;
public List<Entiti> entities;
public void iniciarJogo() {
}
public void info() {
}
public Game() {
initFrame();
iniciarJogo();
info();
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
entities = new ArrayList<Entiti>();
p1 = new Player1();
entities.add(p1);
p2 = new Player2();
entities.add(p2);
}
public void initFrame() {
frame = new JFrame("Imperio do Caos");
frame.setPreferredSize(new Dimension(WIDTH, HEIGHT));
frame.add(this);
frame.setResizable(false);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public synchronized void start() {
thread = new Thread(this);
isRunnable = true;
thread.start();
}
public synchronized void stop() {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Game game = new Game();
game.start();
}
public void tick() {
for (int i = 0; i < entities.size(); i++) {
Entiti e = entities.get(i); // pecorre a Lista para achar todos as classes/entidades.
////////////////// LOGICA DO GAME! //////////////////
long agora = System.currentTimeMillis();
///// Testo na tela!!!!
////////////////////////////////////
e.tick(); // Chama o metodo tick de todas as clases/entidaes que estao dentro da Lista!
}
}
public void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
//
Graphics g = image.getGraphics();
g.setColor(new Color(0, 0, 0));
g.fillRect(0, 0, WIDTH, HEIGHT);
// render abaixo
for (int i = 0; i < entities.size(); i++) {
Entiti e = entities.get(i);
e.render(g); // O 'e' que é uma lista de classes/entidades chama
}
///////////////// DIALOGO ////////////////////////
///////////////// DIALOGO ////////////////////////
g = bs.getDrawGraphics(); // A classe Graphics/imagens cria 3 “pré” imagens antes de renderizar!
g.drawImage(image, 0, 0, WIDTH, HEIGHT, null); // Agora Graphics/imagem pinta a(as) imagem que estiver pronra!
g.setFont(new Font("Arial", Font.BOLD, 14));
g.setColor(Color.white);
g.drawString("Fps."+FPS, 900, 650);
bs.show(); // exibe a(as) imagens!
}
@Override
public void run() {
// Variaveis q serao necessarias para o calculo dos fps e gerar os ticks do
// looping.
long lestTime = System.nanoTime(); // menor tempo do sistema.Ponto de inicio.
double amountOfticks = 60; // quantidade de ticks desejados
double ns = 1000000000 / amountOfticks;
double delta = 0;
int frames = 0;
double time = System.currentTimeMillis();
while (isRunnable) {
long now = System.nanoTime(); // Pega o tempo de agora e nano segundos!
delta += (now - lestTime) / ns;
lestTime = now;
if (delta >= 1) {
tick();
render();
frames++;
delta--;
}
if (System.currentTimeMillis() - time >= 1000) {
System.out.println("FPS: " + frames);
FPS = frames;
frames = 0;
time += 1000;
}
}
// esse meto nao e necessario, mas e importante pois funciona como uma segurança para parar o looping!
stop();
}
}
///////
package graficos;
import java.util.ArrayList;
public class BancoImagens {
public ArrayList<String> guardarCaminhoImagens;
public BancoImagens(){
guardarCaminhoImagens= new ArrayList<>();
guardarCaminhoImagens.add("/arqueiro.png");
guardarCaminhoImagens.add("/guerreiro.png");
guardarCaminhoImagens.add("/mago.png");
}
}
/////
package graficos;
public class ImageLoader {
public static BufferedImage loadImage(String path) {
try {
return ImageIO.read(ImageLoader.class.getResource(path));
} catch (IOException e) {
e.printStackTrace();
return null; // Tratar erros de carregamento de imagem
}
}
}
/////
package entidades;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import graficos.ImageLoader;
public class Entiti {
protected double x;
protected double y;
protected int width;
protected int height;
// String CaminhoImagem;
Random r = new Random();
BufferedImage imagem; // Carregar a imagem aqui
protected int dinheiro;
protected String nome;
protected int exp;
protected int lv;
protected int mana;
protected int vida;
protected int ataque;
protected int defesa;
protected BufferedImage loadImage(String path) {
return ImageLoader.loadImage(path);
}
public Entiti(int x, int y, int width, int height, String CaminhoImagem) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
// this.CaminhoImagem=CaminhoImagem;
}
public int getX() {
return (int) this.x;
}
public int getY() {
return (int) this.y;
}
public void tick() {
}
public void render(Graphics g) {
// E importante instanciar a image aqui, a principio como vazio
// para nao dar erro de "InputStream ou ImageInputStream" ao fechar o jogo!
imagem = loadImage(null);
g.drawImage(imagem, this.getX(), this.getY(), null);
}
}
package entidades;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import Cartas.Guerreiro;
import graficos.BancoImagens;
public class Player1 extends Entiti {
// imagens
static String CaminhoImagem;
BancoImagens bi = new BancoImagens();
// Atributos do Jogador!
/*
protected int lv=0;
protected int exp=0;
protected String nome;
protected int vida;
protected int mana;
protected int delta_At_Min;
protected int delta_At_Max;
protected int at;
protected int delta_Df_Min;
protected int delta_Df_Max;
protected int df;
protected int delta_Ag_Max;
*/
public Player1() {
super(240, 2, 250, 400, CaminhoImagem);
}
public void card() {
if(vida<=0) {
// imagem
int sort = r.nextInt(bi.guardarCaminhoImagens.size());
CaminhoImagem = bi.guardarCaminhoImagens.get(sort);
System.out.println("RANDOM =========== " + sort);
//
Guerreiro guerreiro = new Guerreiro();
if (sort == 0) {
nome = guerreiro.card_nome;
vida = 100;
} else if (sort == 1) {
nome = "Guerreiro";
vida = 100;
} else if (sort == 2) {
nome = "mago";
vida = 100;
}
}
}
public void tick() {
card();
}
public void render(Graphics g) {
imagem = loadImage(CaminhoImagem);
g.drawImage(imagem, this.getX(), this.getY(), null);
g.setFont(new Font("Arial", Font.BOLD, 14));
g.setColor(Color.green);
g.drawString("Player 1: " + nome, 240, 420);
g.drawString("Vida: " + vida, 240, 440);
}
}