Boa noite pessoa, estou desenvolvendo um game para um projeto da faculdade
Ao criar um inimigo no jogo o mesmo não aparece no jogo
Na classe game, crio um objeto da nave inimiga e criamos uma lista das nave inimiga
no metodo update faço um loop for para percorrer a lista da nave inimiga, apos isso crio um objeto da nave inimiga recebendo a lista da nave inimiga, e num if se a nave inimiga for visivel, chame o update() da classe inimigo, ou remova uma nave inimiga da lista
no metodo iniciaInimigos crio um vetor de 20 posições para armazenar cada nave inimiga, crio um arraylist de nave inimiga chamado navesinimigas, faço um loop para percorrer o vetor, crio duas variaveis chamadas x e y, que vao receber ter um valor aleatorio x = (int)(Math.random()*8000+1022); e y = (int)(Math.random()*600+30); logo apos adiciono ao arraylist uma nave inimiga passando o x e y;
para desenhar as naves inimigas na tela, no paintComponent eu crio uma nova lista de nave inimiga que recebe um objeto da nave inimiga chamando o metodo getNavesInimigas da classe da nave inimiga(List)
apos isso percorro a lista, dentro da lista crio uma nova nave inimiga que recebe uma nave inimiga no indice, apos isso chamo o g.drawImage para desenhar o inimigo na tela
GITHUB:
[StarImpact/src at main · YUSEIRENDER/StarImpact · GitHub]
GAME.JAVA
package Game;
import Model.Background;
import Model.Menu;
import Model.NaveInimiga;
import Model.NaveJogador;
import Model.Tiro;
import Principal.Principal;
import javax.swing.JPanel;
import Resource.KeyHandler;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
public class Game extends JPanel
{
//INSTANCIA OBJETO TECLADO DE KEYHANDLER
KeyHandler teclado = new KeyHandler();
//NAVE JOGADOR
public NaveJogador navejogador;
//NAVE INIMIGA
public NaveInimiga naveinimiga;
//LIST NAVE INIMIGA
private List<NaveInimiga> navesinimigas;
//BACKGROUND
public Background backgrounda;
public Background backgroundb;
//VARIAVEL BOOLEANA ISRODANDO INICIALIZADA TRUE;
private boolean isRodando = true;
//VARIAVEL GAMESTATE INICIALIZADA COMO MENU
public static String gamestate = "menu";
//VARIAVEL MENU
public static Menu menu;
//VARIAVEL THREAD DO TIPO THREAD
Thread thread;
//VARIAVEL FPS INICIALIZADA COM 0
int fps = 0;
//CONSTRUTOR
public Game()
{
//INSTANCIA NAVE DO JOGADOR
navejogador = new NaveJogador();
//INSTANCIA BACKGROUND A E BACKGROUND B
backgrounda = new Background();
backgroundb = new Background();
//REPOSICIONA FUNDO B
backgroundb.posX = backgroundb.posX + 1024;
//SETA VELOCIDADE DO BACKGROUND
backgrounda.velX = backgrounda.velX - 6;
backgroundb.velX = backgroundb.velX - 6;
//INSTANCIA MENU
menu = new Menu(0, 0, 0, 0, null);
//ISNTANCIA NAVE INIMIGA
naveinimiga = new NaveInimiga();
addKeyListener(teclado);
setDoubleBuffered(true);
//RECEBE FOCO
setFocusable(true);
//THREAD INICIA GAMELOOP(RUNNING)
new Thread(new Runnable()
{@Override
public void run()
{
long lastTime = System.nanoTime();
double amountofTicks = 60.0;
double ns = 1000000000 / amountofTicks;
double delta = 0;
int frames = 0;
double timer = System.currentTimeMillis();
while(isRodando)
{
long now = System.nanoTime();
delta +=(now - lastTime)/ns;
lastTime = now;
if(delta>= 1)
{
handlerEvents();
update();
render();
frames++;
delta--;
}
if(System.currentTimeMillis()- timer>=1000)
{
System.out.println("FPS: "+ frames);
fps = frames;
frames = 0;
timer+=1000;
}
}
}
}).start();
}
//METODO PARA INICIAR O JOGO
public synchronized void start()
{
thread = new Thread((Runnable) this);
isRodando = true;
thread.start();
stop();
}
//METODO PARA PARAR O JOGO
public synchronized void stop()
{
isRodando = false;
try
{
thread.join();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
//AÇÕES DO JOGADOR
public void handlerEvents()
{
//se teclado cima apertado = true
if(teclado.CimaPressed == true)
{
navejogador.posY -= navejogador.velY;
}
//se teclado baixo apertado = true
if(teclado.BaixoPressed == true)
{
navejogador.posY += navejogador.velY;
}
//se teclado esquerda apertado = true
if(teclado.EsquerdaPressed == true)
{
navejogador.posX -= navejogador.velX;
}
//se teclado direita apertado = true
if(teclado.DireitaPressed == true)
{
navejogador.posX += navejogador.velX;
}
}
//METODO PARA ATUALIZAR FRAMES
public void update()
{
//SE O GAMESTATE FOR IGUAL A GAME
if(gamestate == "game")
{
navejogador.mudarFrame();
//TESTE FUNDO
testeFundo();
//TESTE COLISAO TELA
testeColisaoTela();
//MOVIMENTO ALEATORIO NAVE INIMIGA
iniciainimigos();
//INICIA TIRO
iniciaTiros();
//MOVIMENTO DO BACKGROUND
backgrounda.posX += backgrounda.velX;
backgroundb.posX += backgroundb.velX;
//PARA I MENOR QUE TAMANHO LISTA NAVE INIMIGA
for(int i = 0; i < navesinimigas.size(); i++)
{
//NAVE INIMIGA NI RECEBE O INDICE DA LISTA DA NAVE INIMIGA
NaveInimiga ni = navesinimigas.get(i);
//SE NAVE INIMIGA É VISIVEL
if(ni.isIsVisivel())
{
//NAVE INIMIGA ATUALIZE
ni.update();
}
else
{
//REMOVA DA LISTA
navesinimigas.remove(i);
}
}
}
//SE GAMESTATE FOR IGUAL A MENU
else if (gamestate == "menu")
{
//CHAME MENU UPDATE
menu.update();
}
}
public void render()
{
repaint();
}
//METODOS
public void iniciaTiros()
{
//LISTA DE TIROS TIROS RECEBE NAVEJOGADOR GET TIROS
List<Tiro> tiros = navejogador.getTiros();
//PARA I MENOR QUE TAMANHO LISTA TIROS
for(int i = 0; i < tiros.size(); i++)
{
//TIRO T PARSE PARA TIRO PEGUE O INDICE LISTA TIROS
Tiro t = (Tiro)tiros.get(i);
//SE VISIVEL
if(t.isVisivel)
{
//TIRO ATUALIZE
t.update();
}
else
{
//LISTA TIROS REMOVA E DECREMENTE I
tiros.remove(i);
i--;
}
}
}
//METODO PARA INICIAR OS INIMIGOS
public void iniciainimigos()
{
int cordenadas[] = new int [20];
navesinimigas = new ArrayList<NaveInimiga>();
for(int i = 0; i < cordenadas.length; i++)
{
int x = (int)(Math.random()*8000+1022);
int y = (int)(Math.random()*600+30);
navesinimigas.add(new NaveInimiga(x,y));
}
}
//REPOSICIONAR FUNDO
public void testeFundo()
{
if((backgrounda.posX+1024) <= 0)//SE SAIU PELA ESQUERDA DA TELA
{
//REPOSICIONA BACKGROUNDA PARA TRAS DO BAKGROUNDB
backgrounda.posX = backgroundb.posX + 1024;
}
if((backgroundb.posX+1024) <= 0)//SE SAIU PELA ESQUERDA DA TELA
{
//REPOSICIONA BACKGROUNDA PARA TRAS DO BAKGROUNDB
backgroundb.posX = backgrounda.posX + 1024;
}
}
//IMPEDE NAVE DE FUGIR DA AREA DO JOGO
public void testeColisaoTela()
{
if(navejogador.posX+(navejogador.raio*2) >= Principal.LARGURA_TELA)
{
navejogador.posX = navejogador.posX - navejogador.velX;
}
if(navejogador.posX <= 0)
{
navejogador.posX = navejogador.posX + navejogador.velX;
}
if(navejogador.posY+(navejogador.raio*2) >= Principal.ALTURA_TELA )
{
navejogador.posY = navejogador.posY - navejogador.velY;
}
if(navejogador.posY <= 0)
{
navejogador.posY = navejogador.posY + navejogador.velY;
}
}
//METODOS ESPECIAIS
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//SE GAMESTATE FOR IGUAL A GAME
if(gamestate == "game")
{
g.drawImage(backgrounda.imagem, backgrounda.posX, backgrounda.posY, null);
g.drawImage(backgroundb.imagem, backgroundb.posX, backgroundb.posY, null);
g.drawImage(navejogador.imagAtual, navejogador.posX, navejogador.posY, null);
//LISTA TIRO TIROS RECEBE NAVEJOGADOR GET TIROS
List<Tiro> tiros = navejogador.getTiros();
//PARA I MENOR QUE TAMANHO LISTA TIROS
for(int i = 0; i < tiros.size(); i++)
{
//TIRO T PARSE TIRO PEGUE INDICE LISTA TIROS
Tiro t = (Tiro)tiros.get(i);
//DESENHA
g.drawImage(t.getImagem(), t.getPosX(), t.getPosY(), this);
}
List<NaveInimiga> navesinimigas = naveinimiga.getNavesInimigas();
for(int i = 0; i < navesinimigas.size(); i++)
{
NaveInimiga navei = navesinimigas.get(i);
g.drawImage(navei.getImagAtual(), navei.getPosX(), navei.getPosY(), null);
}
//CONTADOR FPS
g.setColor(new Color(110,200,10));
g.setFont(new Font("Arial", Font.BOLD, 20));
g.drawString("FPS: "+fps, 5, 20);
}
//SE NAO SE GAMESTATE FOR IGUAL A MENU
else if(gamestate == "menu")
{
//CHAME MENU PAINTCOMPONENT
menu.paintComponent(g);
}
}
}
NaveInimiga.java
package Model;
import Resource.Recursos;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class NaveInimiga {
//SPRITE DA NAVE INIMIGA
public BufferedImage sprite;
//CADA FRAMES DO SPRITE
public BufferedImage[] listaFrames;
//ATRIBUTOS DO SPRITE
int indiceAtual;
int qtdLinhasFrame;
int qtdColunasFrame;
int qtdFrames;
public BufferedImage imagAtual;
long startTime, endTime, deltaTime, tempoDecorrido, intervaloEntreFrames;
//ATRIBUTOS DA NAVE JOGADOR
public int posX;
public int posY;
public int raio;
public int velX;
public int velY;
public int width;
public int height;
private boolean isVisivel;
public static List<NaveInimiga> navesinimigas;
//CONSTRUTOR
public NaveInimiga() {
//INICIALIZA ARRAY DE FRAMES E OUTROS ATRIBUTOS
qtdLinhasFrame = 5;
qtdColunasFrame = 1;
qtdFrames = qtdLinhasFrame * qtdColunasFrame;
listaFrames = new BufferedImage[qtdFrames];
indiceAtual = 0;
width = 100;
height = 100;
posX = 885;
posY = 100;
raio = 50;
velX = -4;
velY = -4;
tempoDecorrido = 0;
intervaloEntreFrames = 20;
navesinimigas = new ArrayList<NaveInimiga>();
//FAZ O CARREGAMENTO DA IMAGEM
try {
sprite = ImageIO.read(getClass().getResource("/Imagens/naveinimigaspritesheet.png"));
//PERCORRE AS 5 LINHAS(0-4)
for (int i = 0; i < qtdLinhasFrame; i++) {
//PERCORRE A 1 COLUNA (0)
for (int j = 0; j < qtdColunasFrame; j++) {
int x1 = j * width;
int y1 = i * height;
int x2 = x1 + width;
int y2 = y1 + height;
listaFrames[i * qtdColunasFrame + j] = Recursos.getInstance().cortarImagem(x1, y1, x2, y2, sprite);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//CONSTRUTOR APENAS COM POSICAO X E Y DA NAVE INIMIGA
public NaveInimiga(int posX, int posY) {
this.posX = posX;
this.posY = posY;
}
public void update() {
this.posX -= velX;
if (this.posX < 0) {
isVisivel = false;
}
}
//METODO PARA ATUALIZAR SPRITES A CADA FRAME
public void mudarFrame() {
startTime = System.currentTimeMillis();
deltaTime = startTime - endTime;
tempoDecorrido = tempoDecorrido + deltaTime;
if (tempoDecorrido >= intervaloEntreFrames) {
indiceAtual++;
tempoDecorrido = 0;
}
if (indiceAtual >= qtdFrames - 1) {
indiceAtual = 0;
}
imagAtual = listaFrames[indiceAtual];
endTime = startTime;
}
//GETTERS E SETTERS
public static List<NaveInimiga> getNavesInimigas()
{
return navesinimigas;
}
public BufferedImage getSprite() {
return sprite;
}
public void setSprite(BufferedImage sprite) {
this.sprite = sprite;
}
public BufferedImage getImagAtual() {
return imagAtual;
}
public void setImagAtual(BufferedImage imagAtual) {
this.imagAtual = imagAtual;
}
public int getPosX() {
return posX;
}
public void setPosX(int posX) {
this.posX = posX;
}
public int getPosY() {
return posY;
}
public void setPosY(int posY) {
this.posY = posY;
}
public int getRaio() {
return raio;
}
public void setRaio(int raio) {
this.raio = raio;
}
public int getVelX() {
return velX;
}
public void setVelX(int velX) {
this.velX = velX;
}
public int getVelY() {
return velY;
}
public void setVelY(int velY) {
this.velY = velY;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public boolean isIsVisivel() {
return isVisivel;
}
public void setIsVisivel(boolean isVisivel) {
this.isVisivel = isVisivel;
}
}