Fazer o "Sprite" Saltar em Java

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.
 
Back
Topo