Estou fazendo um jogo básico em java,onde um arqueiro solta flechas a fim de estourar o balao de um palhaço.Mas eu não consigo implementar a colisão da flecha com o balão.Acho que devo desenhar um retangulo ao redor de ambas as figuras,o retangulo tem q ter o tamanho das figuras e a colisao deve ser implementada visando não a colisao das figuras e sim a colisão entre os retangulos que as envolve. Mas não sei fazer…Alguém pode me ajudar???
desde já, agradeço!
Aí vai o código:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.JPanel;
import sun.java2d.loops.FillRect;
public class Janela extends JFrame {
ArrayList<Flecha> flechas = new ArrayList<Flecha>();
ArrayList<Palhaco> palhacos = new ArrayList<Palhaco>();
DrawingPanel dp = new DrawingPanel();
Image archer = new ImageIcon("images/archer2.gif").getImage();
Image a = new ImageIcon("images/fogo.gif").getImage();
Image logo = new ImageIcon("images/logo.gif").getImage();
Image sky = new ImageIcon("images/blueskyy.jpg").getImage();
Image ground = new ImageIcon("images/terrain.gif").getImage();
BufferedImage img = null;
int archerX,archerY, arrowX, arrowY,balloonX,balloonY;
int nivel = 1;
int acerto = 0;
int largura = 1000;
int altura = 800;
int arrowCount;
boolean logoEquipe = true;
boolean turbina = false;
boolean direita = false;
public Janela() {
setTitle("The Geek Archer 1.0v");
setSize(largura, altura);
setLocation(100, 100);
addKeyListener(dp);
archerX = 10;
arrowCount = 0;
archerY = 515;
new Thread() {
private long time = 100;
public void run() {
while (true) {
Palhaco obj = new Palhaco();
obj.setX(700);
obj.setY(900);
palhacos.add(obj);
for(int i = 0; i < flechas.size();i++){
Flecha f = flechas.get(i);
if(f.getX() < largura){
f.move();
}else{
flechas.remove(i);
}
// Rectangle fff = new Rectangle(1,1,1,1); //essa não dá erro
// Rectangle fr = new Rectangle(f.getX(), f.getY(), (f.getX()+f.getArrow().getWidth(this)), (f.getY()+f.getArrow().getHeight(this)));
// if(fr.intersects(palhaco){
// }
//
}
for(int j = 0; j < palhacos.size(); j++){
Palhaco p = palhacos.get(j);
if(p.getY() > -240){
p.move();
}else{
palhacos.remove(j);
}
j = 0;
}
/*while ((logoEquipe) && (!direita)){
if (logoEquipe){time = 800;}
else{time = 100;}
}*/
try {
Thread.sleep(time);
} catch (InterruptedException ex) {
Logger.getLogger(Janela.class.getName()).log(Level.SEVERE, null, ex);
}
repaint();
}
}
}.start();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(dp);
setVisible(true);
// System.out.println("frog=" + frog.getSource().toString());
}
public static void main(String[] args) {
// Create frame
JFrame f = new Janela();
}
class DrawingPanel extends JPanel implements KeyListener {
public void keyTyped(KeyEvent e) {
System.out.println("keyTyped " + e.getKeyChar() + " " + e.getKeyCode());
}
public void keyPressed(KeyEvent e) {
System.out.println("Tecla Pressionada " + e.getKeyChar() + " " + e.getKeyCode());
//aqui podemos tratar as setinhas e tiros com a barra de espaco
switch (e.getKeyCode()) {
case 38:
System.out.println("seta para cima");
turbina = true;
archerY -= 10;
break;
case 37:
System.out.println("seta para esquerda");
//archerX -= 10;
break;
case 39:
System.out.println("seta para direita");
//archerX += 10;
direita = true;
logoEquipe = false;
break;
case 40:
System.out.println("seta para baixo");
archerY += 10;
break;
case 32:
System.out.println("espaco");
Flecha obj = new Flecha();
obj.setX(0);
obj.setY(archerY + 110);
flechas.add(obj);
break;
}
repaint();
}
public void keyReleased(KeyEvent e) {
System.out.println("keyReleased " + e.getKeyChar() + " " + e.getKeyCode());
switch (e.getKeyCode()) {
case 38:
System.out.println("seta para cima");
//turbina = false;
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.white);
g.fillRect(0, 0, 1000, 800);
g.drawImage(sky, 0, 0, null);
for(int j = 0; j < palhacos.size();j++){
Palhaco p = palhacos.get(j);
g.drawImage(p.isColidiu()?p.getColisao():p.getBalloon(),p.getX(),p.getY(),null);
}
g.drawImage(ground, 0, 420, null);
for(int i = 0; i < flechas.size();i++){
Flecha f = flechas.get(i);
g.drawImage(f.isColidiu()?f.getColisao():f.getArrow(),f.getX(),f.getY(),null);
if (f.isColidiu()){
acerto++;
}
}
if(turbina){
g.drawImage(a, archerX + 48, archerY + 190, null);
g.drawImage(a, archerX + 67, archerY + 190, null);
}
g.drawImage(archer, archerX, archerY, null);
g.setColor(Color.green);
g.setFont(new Font("Helvetica", Font.BOLD, 14));
g.drawString(" Nível: "+ nivel, 10, 15);
g.drawString(" Acertos: " + acerto, 200, 15);
g.drawString(" Tempo: ", 390, 15);
if (logoEquipe){
g.drawImage(logo, 0, 0, null);
g.setColor(Color.green);
g.setFont(new Font("Helvetica", Font.BOLD, 16));
g.drawString("Pressione ' ---> ' para continuar ", 80, 740);
}else {
logo.flush();
}
}
}
}