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
Classe Sprite
Agradeço toda a ajuda possivel.
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.