1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Fazer o "Sprite" Saltar em Java

Discussão em 'Programação' iniciada por markituh121, 15 de Março de 2013. (Respostas: 1; Visualizações: 1007)

  1. markituh121

    markituh121 Power Member

    Boas,

    Estou a fazer um pequeno jogo em Java e gostava que me dessem uma ajuda. Eu basicamente quero fazer o meu sprite principal saltar e não sei bem como. Neste momento tenho "Thread.Sleep" mas não sei o que fazer. Não quero usar um motor de fisicos. Aqui vai o código.

    Classe Jogo

    Código:
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.image.BufferedImage;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Arrays;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import javax.sound.sampled.Clip;
    import javax.swing.JOptionPane;
    
    public class Game extends JFrame implements KeyListener
    {
        BufferedImage backBuffer;
        int FPS = 30;
        int janelaW = 700;
        int janelaH = 600;
        private static String [] teclaPressionada = new String[256];
        int cenas_des=0;
        int fundox=-250;
        int c=0;
        List <Missel> misseis;
        Sprites Prot = new Sprites(30,120,400);
        Inimigo En = new Inimigo ("src/Imagens_Sprites/EnD1.png", 900, 400);
        Inimigo En2 = new Inimigo ("src/Imagens_Sprites/En1.png", 700, 400);
        Inimigo En3 = new Inimigo ("src/Imagens_Sprites/EnD1.png", 1000, 400);
        Inimigo En4 = new Inimigo ("src/Imagens_Sprites/En1.png", 1500, 520);
        Inimigo En5 = new Inimigo ("src/Imagens_Sprites/En1.png", 1700, 520);
        Inimigo En6 = new Inimigo ("src/Imagens_Sprites/EnD1.png", 2000, 520);
        Inimigo En7 = new Inimigo ("src/Imagens_Sprites/En1.png", 2300, 520);
        Inimigo En8 = new Inimigo ("src/Imagens_Sprites/En1.png", 2500, 520);
        Inimigo En9 = new Inimigo ("src/Imagens_Sprites/EnD1.png", 2700, 520);
        Inimigo En10 = new Inimigo ("src/Imagens_Sprites/En1.png", 3100, 520);
        Inimigo En11 = new Inimigo ("src/Imagens_Sprites/EnD1.png", 3300, 520);
        Inimigo En12 = new Inimigo ("src/Imagens_Sprites/En1.png", 3500, 520);
        ImageIcon fundo = new ImageIcon("src/Imagens_Sprites/Fundo.png");
        boolean loop;
        String nome;
        int inimigos;
        
        
        public void atualizar(){}
    
        
        public void ColideSprites()
        {
            Rectangle areaProt = Prot.getLimitSprite();
            
            Rectangle areaEn = En.getLimitSprite();
            Rectangle areaEn2 = En2.getLimitSprite();
            Rectangle areaEn3 = En3.getLimitSprite();
            Rectangle areaEn4 = En4.getLimitSprite();
            Rectangle areaEn5 = En5.getLimitSprite();
            Rectangle areaEn6 = En6.getLimitSprite();
            Rectangle areaEn7 = En7.getLimitSprite();
            Rectangle areaEn8 = En8.getLimitSprite();
            Rectangle areaEn9 = En9.getLimitSprite();
            Rectangle areaEn10 = En10.getLimitSprite();
            Rectangle areaEn11 = En11.getLimitSprite();
            Rectangle areaEn12 = En12.getLimitSprite();
            
            
            List<Missel> misse = Prot.getMisseis();
            List<Missel_Inimigo> misses = En.getMisseis();
            List<Missel_Inimigo> misses3 = En3.getMisseis();
            List<Missel_Inimigo> misses4 = En6.getMisseis();
            List<Missel_Inimigo> misses5 = En9.getMisseis();
            List<Missel_Inimigo> misses6 = En11.getMisseis();
            
            for (int i = 0; i < misse.size(); i++)
            {
                Missel m = (Missel) misse.get(i);            
                Rectangle m1 = m.getLimiteMissil();                  
                if (areaEn.intersects(m1) && En.Vivo())
                {
                    En.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn2.intersects(m1) && En2.Vivo())
                {
                    En2.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn3.intersects(m1) && En3.Vivo())
                {
                    En3.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn4.intersects(m1) && En4.Vivo())
                {
                    En4.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn5.intersects(m1) && En5.Vivo())
                {
                    En5.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn6.intersects(m1) && En6.Vivo())
                {
                    En6.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn7.intersects(m1) && En7.Vivo())
                {
                    En7.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn8.intersects(m1) && En8.Vivo())
                {
                    En8.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn9.intersects(m1) && En9.Vivo())
                {
                    En9.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn10.intersects(m1) && En10.Vivo())
                {
                    En10.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn11.intersects(m1) && En11.Vivo())
                {
                    En11.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10;
                }
                if (areaEn12.intersects(m1) && En12.Vivo())
                {
                    En12.estaVivo=false;
                    m.isVisivel=false;
                    inimigos = inimigos + 10 + Prot.HP;
                }       
            } 
            for (int i1 = 0; i1 < misses.size(); i1++)
            {
                Missel_Inimigo min1 = (Missel_Inimigo) misses.get(i1);;
                Rectangle areaMin1=min1.getLimiteMissil();
                if (areaProt.intersects(areaMin1))
                {
                    min1.isVisivel=false;
                    Prot.HP=Prot.HP-10;
                }
            }
            for (int i2 = 0;i2 < misses3.size();i2++)
            {
                Missel_Inimigo min2 = (Missel_Inimigo) misses3.get(i2);
                Rectangle areaMin2 = min2.getLimiteMissil();
                if (areaProt.intersects(areaMin2))
                {
                    min2.isVisivel=false;
                    Prot.HP=Prot.HP-10;
                }
            }
            for (int i3 = 0;i3 < misses4.size();i3++)
            {
                Missel_Inimigo min3 = (Missel_Inimigo) misses4.get(i3);
                Rectangle areaMin3 = min3.getLimiteMissil();
                if (areaProt.intersects(areaMin3))
                {
                    min3.isVisivel=false;
                    Prot.HP=Prot.HP-10;
                }
            }
            for (int i4 = 0;i4 < misses5.size();i4++)
            {
                Missel_Inimigo min4 = (Missel_Inimigo) misses5.get(i4);
                Rectangle areaMin4 = min4.getLimiteMissil();
                if (areaProt.intersects(areaMin4))
                {
                    min4.isVisivel=false;
                    Prot.HP=Prot.HP-10;
                }
            }
            for (int i5 = 0;i5 < misses6.size();i5++)
            {
                Missel_Inimigo min5 = (Missel_Inimigo) misses6.get(i5);
                Rectangle areaMin5 = min5.getLimiteMissil();
                if (areaProt.intersects(areaMin5))
                {
                    min5.isVisivel=false;
                    Prot.HP=Prot.HP-20;
                }
            }
        }    
        
        public void desenharGraficos()
        {
            Graphics g = getGraphics();
            Graphics bbg = backBuffer.getGraphics();
        
            bbg.drawImage(fundo.getImage(),fundox ,0,this );
            
                if (Prot.Vivo()==true)
                {
                    bbg.drawImage(Prot.cenas[Prot.cena].getImage(),Prot.x ,Prot.y,this );
                }
                
                if (En.Vivo()==true)
                {
                    bbg.drawImage(En.getImage(),En.x ,En.y,this);
                }
            
                if (En2.Vivo()==true)
                {
                    bbg.drawImage(En2.getImage(),En2.x ,En2.y,this);
                }   
    
                if (En3.Vivo()==true)
                {
                    bbg.drawImage(En3.getImage(),En3.x ,En3.y,this);
                }   
                if (En4.Vivo()==true)
                {
                    bbg.drawImage(En4.getImage(),En4.x ,En4.y,this);
                }   
                if (En5.Vivo()==true)
                {
                    bbg.drawImage(En5.getImage(),En5.x ,En5.y,this);
                }   
                if (En6.Vivo()==true)
                {
                    bbg.drawImage(En6.getImage(),En6.x ,En6.y,this);
                }   
                if (En7.Vivo()==true)
                {
                    bbg.drawImage(En7.getImage(),En7.x ,En7.y,this);
                }   
                if (En8.Vivo()==true)
                {
                    bbg.drawImage(En8.getImage(),En8.x ,En8.y,this);
                }   
                if (En9.Vivo()==true)
                {
                    bbg.drawImage(En9.getImage(),En9.x ,En9.y,this);
                }   
                if (En10.Vivo()==true)
                {
                    bbg.drawImage(En10.getImage(),En10.x ,En10.y,this);
                }   
                if (En11.Vivo()==true)
                {
                    bbg.drawImage(En11.getImage(),En11.x ,En11.y,this);
                }   
                if (En12.Vivo()==true)
                {
                    bbg.drawImage(En12.getImage(),En12.x ,En12.y,this);
                }   
                if (En12.Vivo()==false)
                {
                    Audio.clip.stop();
                    this.dispose();
                    GameWon ganhou =new GameWon(inimigos);
                    ganhou.run();
                }
                
                
            List<Missel> misse = Prot.getMisseis();  
            for (int i = 0; i < misse.size(); i++)
            {
                Missel m = (Missel) misse.get(i);
                if (m.isVisivel())
                {
                    m.mexer();
                }
                else
                {
                    misse.remove(i);
                }
                bbg.drawImage (m.getImagem(), m.getX(), m.getY(), this);
            }
            
            List<Missel_Inimigo> misses = En.getMisseis();  
            for (int i = 0; i < misses.size(); i++)
            {
                Missel_Inimigo me1 = (Missel_Inimigo) misses.get(i);
                if (me1.isVisivel())
                {
                    me1.mexer();
                }
                else
                {
                    misses.remove(i);
                }
                bbg.drawImage (me1.getImagem(), me1.getX(), me1.getY(), this);
            }
            
            List<Missel_Inimigo> misses3 = En3.getMisseis();
            for (int i = 0; i < misses3.size(); i++)
            {
                Missel_Inimigo me2 = (Missel_Inimigo) misses3.get(i);
                if (me2.isVisivel())
                {
                    me2.mexer();
                }
                else
                {
                    misses3.remove(i);
                }
                bbg.drawImage (me2.getImagem(), me2.getX(), me2.getY(), this);
            }
            
            List<Missel_Inimigo> misses4 = En6.getMisseis();
            for (int i = 0; i < misses4.size(); i++)
            {
                Missel_Inimigo me3 = (Missel_Inimigo) misses4.get(i);
                if (me3.isVisivel())
                {
                    me3.mexer();
                }
                else
                {
                    misses4.remove(i);
                }
                bbg.drawImage (me3.getImagem(), me3.getX(), me3.getY(), this);
            }
            
            List<Missel_Inimigo> misses5 = En9.getMisseis();
            for (int i = 0; i < misses5.size(); i++)
            {
                Missel_Inimigo me4 = (Missel_Inimigo) misses5.get(i);
                if (me4.isVisivel())
                {
                    me4.mexer();
                }
                else
                {
                    misses5.remove(i);
                }
                bbg.drawImage (me4.getImagem(), me4.getX(), me4.getY(), this);
            }
            
            List<Missel_Inimigo> misses6 = En11.getMisseis();
            for (int i = 0; i < misses6.size(); i++)
            {
                Missel_Inimigo me5 = (Missel_Inimigo) misses6.get(i);
                if (me5.isVisivel())
                {
                    me5.mexer();
                }
                else
                {
                    misses6.remove(i);
                }
                bbg.drawImage (me5.getImagem(), me5.getX(), me5.getY(), this);
            }
            
            ColideSprites();
            
            bbg.setColor(Color.BLACK);
            bbg.drawRect(19, 49, 101, 41);
    
            bbg.setColor(Color.RED);
            bbg.fillRect(20, 50, Prot.HP, 40);
            
            
            bbg.setColor(Color.WHITE);
            bbg.drawString("Score: " + inimigos, 600, 100);
            
            
            trataTeclas();
            
            if (Prot.y<=340)
            {
                 Prot.y+=50;
            }
            
            
            if (Prot.HP==0)
            {
                Audio.clip.stop();
                this.dispose();
                GameOver dados=new GameOver(inimigos);
                dados.run();
            }
            
            g.drawImage(backBuffer, 0, 0, this);
        }
    
        
        public void inicializar() 
        { 
            setTitle("Unoriginal War");
            setSize(janelaW, janelaH);
            setResizable(false);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setLayout(null);
            setVisible(true);
            backBuffer=new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
            addKeyListener(this);
            
            Prot.cenas[0]=new ImageIcon("src/Imagens_Sprites/Prot1.png");
            Prot.cenas[1]=new ImageIcon("src/Imagens_Sprites/Prot2.png");
            Prot.cenas[2]=new ImageIcon("src/Imagens_Sprites/Prot3.png");
            Prot.cenas[3]=new ImageIcon("src/Imagens_Sprites/Prot4.png");
            Prot.cenas[4]=new ImageIcon("src/Imagens_Sprites/Prot5.png");
            Prot.cenas[5]=new ImageIcon("src/Imagens_Sprites/Prot6.png");
            Prot.cenas[6]=new ImageIcon("src/Imagens_Sprites/Prot7.png");
            Prot.cenas[7]=new ImageIcon("src/Imagens_Sprites/Prot8.png");
            Prot.cenas[8]=new ImageIcon("src/Imagens_Sprites/Prot9.png");
            Prot.cenas[9]=new ImageIcon("src/Imagens_Sprites/Prot10.png");
            Prot.cenas[10]=new ImageIcon("src/Imagens_Sprites/Prot11.png");
            Prot.cenas[11]=new ImageIcon("src/Imagens_Sprites/Prot12.png");
            Prot.cenas[12]=new ImageIcon("src/Imagens_Sprites/ProtS1.png");
            Prot.cenas[13]=new ImageIcon("src/Imagens_Sprites/ProtS2.png");
            Prot.cenas[14]=new ImageIcon("src/Imagens_Sprites/ProtS3.png");
            Prot.cenas[15]=new ImageIcon("src/Imagens_Sprites/ProtS4.png");
            Prot.cenas[16]=new ImageIcon("src/Imagens_Sprites/ProtS5.png");
            Prot.cenas[17]=new ImageIcon("src/Imagens_Sprites/ProtS6.png");
            Prot.cenas[18]=new ImageIcon("src/Imagens_Sprites/ProtS7.png");
            Prot.cenas[19]=new ImageIcon("src/Imagens_Sprites/ProtS8.png");
            Prot.cenas[20]=new ImageIcon("src/Imagens_Sprites/ProtS9.png");
            Prot.cenas[21]=new ImageIcon("src/Imagens_Sprites/ProtS10.png");
            Prot.cenas[22]=new ImageIcon("src/Imagens_Sprites/ProtS11.png");
            Prot.cenas[23]=new ImageIcon("src/Imagens_Sprites/ProtS12.png");
            Prot.cenas[24]=new ImageIcon("src/Imagens_Sprites/ProtJ1.png");
            Prot.cenas[25]=new ImageIcon("src/Imagens_Sprites/ProtJ2.png");
            Prot.cenas[26]=new ImageIcon("src/Imagens_Sprites/ProtJ3.png");
            Prot.cenas[27]=new ImageIcon("src/Imagens_Sprites/ProtJ4.png");
            Prot.cenas[28]=new ImageIcon("src/Imagens_Sprites/ProtJ5.png");
            Prot.cenas[29]=new ImageIcon("src/Imagens_Sprites/ProtJ6.png");
            
            Prot.altura=Prot.cenas[0].getIconHeight();
            Prot.largura=Prot.cenas[0].getIconWidth();
            
            Arrays.fill(teclaPressionada, "");
            addKeyListener(this);
            misseis = new ArrayList<Missel>();
            audio("src/Imagens_Sprites/Mortal_Kombat_Meets_Metal.wav", true);    
        }
        
        public void InimigoAtira()
        { 
                if (En.estaVivo==true)
                {
                    En.atira();
                }
                
                if (En3.estaVivo==true)
                {
                    En3.atira();
                }
                
                if (En6.estaVivo==true)
                {
                    En6.atira();
                }
                
                if (En9.estaVivo==true)
                {
                    En9.atira();
                }
                
                if (En11.estaVivo==true)
                {
                    En11.atira();
                }
        }
                                                                                                                                            
        public void audio(String ficheiro, boolean loop)
        {
            Audio audio = new Audio ();
            audio.LoopSound(ficheiro, loop);
        }
        
        
        public void run() 
        {
            inicializar();
            
    
            while (true)
            {
                InimigoAtira();
                atualizar();
                desenharGraficos();
                try
                {
                    Thread.sleep(1000/FPS);
                }
                catch (Exception e)
                {
                    System.out.println("Thread com erros!!!");
                }
            }
        } 
    
        
    
        
        @Override
        public void keyTyped(KeyEvent e) 
        {
    
        }
    
        @Override
        public void keyPressed(KeyEvent e) 
        {
            teclaPressionada[e.getKeyCode()]=e.getKeyChar()+"";
            int tecla=e.getKeyCode();
            
            if (tecla==KeyEvent.VK_K)
            {
                Audio.clip.stop();
            }
        }
        
            public void trataTeclas()
            {
                if(!teclaPressionada[32].equals("")) 
                { 
                    int i;
                    for (i=0; i<3; i++)
                    {  
                        try 
                        {
                            Thread.sleep(100);
                            Prot.y=Prot.y-20;
                            System.out.println("Thread com erros");
                        } 
                        catch (Exception e) 
                        {
                            System.out.println("Thread com erros");
                        }
                    }
                    
                    for (i=0; i<3; i++)
                    {
                        try 
                        {
                            Thread.sleep(100);
                            Prot.y=Prot.y+20;
                            System.out.println("Thread com erros");
                        } 
                        catch (Exception e) 
                        {
                            System.out.println("Thread com erros");
                        }
                    }
                }
                
                if(!teclaPressionada[27].equals(""))
                {
                    Menu menu = new Menu();
                    menu.run();
                }
                
                if (!teclaPressionada[17].equals(""))
                {
                       Prot.atira();
                }
                
                if (!teclaPressionada[65].equals(""))
                {
                    if (Prot.x>0)
                    {
                        Prot.x-=1;
                        En.x+=6;
                        En2.x+=6;
                        En3.x+=6;
                        En4.x+=6;
                        En5.x+=6;
                        En6.x+=6;
                        En7.x+=6;
                        En8.x+=6;
                        En9.x+=6;
                        En10.x+=6;
                        En11.x+=6;
                        En12.x+=6;
                        
                        fundox+=6;
                        
                        if (Prot.cena>23) Prot.cena=12;
                        Prot.animarEsquerda(10);
                        c=2;
                    }
                }
                
                if (!teclaPressionada[68].equals(""))
                {
                    if (Prot.x<670)
                    {
                        Prot.x+=1;
                        En.x-=6;
                        En2.x-=6;
                        En3.x-=6;
                        En4.x-=6;
                        En5.x-=6;
                        En6.x-=6;
                        En7.x-=6;
                        En8.x-=6;
                        En9.x-=6;
                        En10.x-=6;
                        En11.x-=6;
                        En12.x-=6;
                        
                        if (fundox<3600)
                        {
                            fundox-=6;
                        }
                        
                        if (Prot.x==300)
                        {
                            Prot.y=520;
                        }
                        if (Prot.cena>11) Prot.cena=0;
                        Prot.animarDireita(10);
                        c=2;
                    }
                }
            }
            
            
        @Override
        public void keyReleased(KeyEvent e) 
        {
            if (!teclaPressionada [e.getKeyCode()].equals(""))
            {
                teclaPressionada[e.getKeyCode()]="";
            }
        }
    }
    Classe Sprite

    Código:
    import javax.swing.ImageIcon;
    import java.awt.Rectangle;
    import java.awt.Image;
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class Sprites 
    {
        ImageIcon cenas[]; 
        int x;
        int y; 
        int largura;
        int altura;
        int cena = 0;
        int controlaVelocidade = 10;
        int HP=100;
        int HPx=0;
        int HPy=0;
        boolean estaVivo=true;
        
        List <Missel> misseis;
        
        public Sprites(int numeroDeCenas, int x, int y)
        {
            ImageIcon i = new ImageIcon("src/Imagens_Sprites/Prot1.png");
            cenas = new ImageIcon[numeroDeCenas];
            this.x = x;
            this.y = y;
            misseis = new ArrayList<Missel>();
            this.largura = i.getIconWidth();
            this.altura = i.getIconHeight();
            
        }
        
        public void animarCima(int velocidade)
        {
            controlaVelocidade+=3; 
            if (controlaVelocidade>velocidade)
            {   
                if (cena<30)
                {
                    cena=29;
                }
                else cena+=1;
                controlaVelocidade=0;
            }
        }
        
        public void animarEsquerda(int velocidade)
        {
            controlaVelocidade+=3; 
            if (controlaVelocidade>velocidade)
            {
                if (cena>22 || cena<12)
                {
                    cena=12;
                }
                else cena+=1;
                controlaVelocidade=0;
            }
        }
        
        
        public void animarDireita(int velocidade)
        {
            controlaVelocidade+=3;
            if (controlaVelocidade>velocidade)
            {
                if (cena>=11)
                {
                    cena=0;
                }
                else cena+=1;
                controlaVelocidade=0;
            }
        }
        
        public void Mexer (int dx, int dy)
        {
            x+=dx;
            y+=dy;
        }
        
        public List<Missel> getMisseis()
        {
            return misseis;
        }
        
        public void audio(String ficheiro, boolean loop)
        {
            Audio audio = new Audio ();
            audio.LoopSound(ficheiro, loop);
        }
        
        public void atira()
        {    
            if (this.misseis.size()<1)
            {
               this.misseis.add(new Missel (x+largura+10, y+altura-30));
               audio("src/Imagens_Sprites/Arma.wav", false);
            }
        }
        
        public boolean Vivo()
        {
            if (HP==0)
            {
                estaVivo=false;
            }
            return estaVivo;
        }
        
        public Rectangle getLimitSprite()
        {
            return new Rectangle (x, y, largura, altura);
        }
    }    
    
    Agradeço toda a ajuda possivel.
     
  2. markituh121

    markituh121 Power Member

Partilhar esta Página