Ir ao conteúdo
  • Cadastre-se

Java Java game, inimigo não surge aleatoriamente na tela


Posts recomendados

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 vão 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:
https://github.com/YUSEIRENDER/StarImpact/tree/main/src

 

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 não 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;
    }
    
}

 

Link para o comentário
Compartilhar em outros sites

Depure o códigio para saber se a lista de inimigos está sendo preenchida.

 

Em caso positivo, verifique o método responsável por renderizar os sprites para saber está sendo chamado e se está funcionado corretamente.

 

[EDIT]

Depurei seu código e o problema está no método que popula sua lista. A lista está sendo populada, mas as naves dessa lista não possuem sprite (null), width (é 0) nem height (é 0), além das posições x e y estarem com valores estranhos (bem maiores que o tamanho da tela jogo).

 

Dê uma polida no construtor das naves, isso deve resolver o problema.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!