Dúvida em algoritmo para fazer colisão em jogo

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();
          }
                    
        }

    }
}

o cenario não é uma matriz?
entao o balao esta numa celula da matriz, a flecha quando disparada percorre as celulas da matriz e se a flecha tiver na mesma celula que esta o balao entao que dizer que houve colisao, nao é isso?

Exatamente. No jogo que desenvolvemos na faculdade o cenário tinha um conjunto de coordenadas x e y (o jogo era em 2D) e a colisão ocorria quando a extremidade de um elemento tocava a extremidade de outro.

Pois é,essa idéia eu já até tive.O problema é que eu to aprendendo java agora e não sei implementar.
vcs tem algum exemplo de código???
Preciso entregar na facul. esse jogo pronto na 2ª feira.

Certo, e qual exatamente é sua dúvida?
Você pesquisou sobre o assunto?
Qualquer exemplo de código, por mais simples que seja, teria uma quantidade considerável de código.
Dicas: todo jogo tem basicamente três etapas que são repetidas durante todo o gameplay:

  • Tratamento de entradas: verifica quais foram as teclas ou comandos pressionados. No nosso jogo, cada tecla relevante pressionada (setas direcionais, por exemplo) fazia com que o jogo configurasse flags que eram tratadas nesta etapa.
  • Cálculo da reação do cenário: calcula qual o impacto da ação do jogador no cenário. Se o jogador pressionou uma tecla para movimentar o personagem, por exemplo, esta etapa calcula qual será a nova posição do personagem. Nesta etapa ocorrem os cálculos de inteligência artificial também.
  • Atualização da tela: a interface gráfica é redesenhada. No exemplo anterior, o personagem seria redesenhado na nova posição e, se necessário, o ambiente em que o personagem está também.
    De forma bastante resumida, seu programa terá que fazer isso.

DAVID,pesquisei muito sobre o assunto,tanto é que está quase tudo implementado.O código fonte da minha classe principal está aqui em cima (no começo da página).
A única coisa que eu não estou sabendo implementar é a colisão!!!
Se vc puder me ajudar eu agradeço.
olhe só o código aqui em cima!!!

DE_PAULA, infelizmente não tenho tempo hábil para analisar todo este código.
A sugestão para implementar a colisão é a seguinte: cada vez que a flecha muda de posição, você verifica se alguma das extremidades dela está em coordenadas iguais a de um balão. Se tiver, ocorre o determinado evento de colisão.
Isso você faz na etapa de cálculo de reação: se existir algum balão na nova posição, você trata a colisão, se não houver, a flecha se desloca normalmente.
No jogo que desenvolvi, cada personagem ocupava exatamente uma coordenada x e y (depois adicionamos tratamento para as bordas serem tratadas com precisão, mas isto é outra história) e os objetos do cenário que ocupavam mais de uma posição x, y, nós efetuavamos um tratamento do tipo x + largura, y + altura.
No seu código, verifiquei que existem variáveis para as coordenadas do arqueiro, da flecha e do balão.
Comece fazendo esta verificação de x, y iguais.

Eis aí o problema. A flecha só anda no eixo x (horizontal)e o palhaço só anda no eixo y(vertical).Eu não consigo abstrair uma forma de igualar os eixos,sendo assim.
Tem alguma sugestão pra esse caso???

Neste momento, eles se movem?
Por favor, poste só o trecho de código em que você calcula as novas posições dos objetos em movimento.

Edit: não esqueça das tags de código.

Eles se movem sim:

archery=posição em y do flecheiro
archerx=posição em y do flecheiro
flecha=posição em x da flecha,ela acompanha o arqueiro pra onde ele for e de lá ela é lançada.
OBS:o palhaço se movimenta independente de comandos do usuario,ou seja,o palhaço se movimenta na vertical(em y) de baixo para cima,constantemente.

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; 

} 

} 

Oi.

Ao postar código, use a tag code:
http://www.guj.com.br/posts/list/50115.java

Também procure um título mais descritivo, e não escreva-o em letras maísculas.
“Algoritmo para fazer colisão em jogo” seria um título muito melhor do que “ME AJUDE POR FAVOR”.

Eu sugiro que você comece aprendendo java. Se você não entende direito a matriz, então nunca conseguirá fazer a colisão.

Aliás, se vc não entende nem isso, quem é que fez o programa?!!?

Certo, e à partir do momento que ela é lançada, ela movimenta-se em um eixo, correto?
O que você precisa fazer é, dentro deste movimento, comparar as posições. Como eu tinha dito anteriormente…

Vo te Dechar um codigo de colisao que eu fiz de um space Invaders
bem simples eu fiz o jogo usando JLabel
mais ve se o codigo que eu fiz para verificar a colisão pode te ajudar!!

[code]
/**colT = eh a coluna do tiro

  • colB = eh a coluna do bixo
  • linB = eh a coluna do Bixo
    **/
    public boolean verificaColisao(int colT, int colB,int linB)
    {
    if(vetTiros[colT]!=null && vetMonster[colB][linB]!=null)
    try
    {
    if (((vetMonster[colB][linB].getCol()==vetTiros[colT].getCol()) && (vetMonster[colB][linB].getLin()==vetTiros[colT].getLin())) ||
    ((vetMonster[colB][linB].getCol()+10==vetTiros[colT].getCol()) && (vetMonster[colB][linB].getLin()==vetTiros[colT].getLin())))
    {
    if(vetTiros[colT]!=null && vetMonster[colB][linB]!=null)
    {
    System.out.println(“Head Shot”);
    removeTiros();
    removeBixo(colB,linB);
    return(true);
    }
    }
    }
    catch(Exception e)
    {
    //Ponteiro NULO
    }
    return false;
    }[/code]

Lebrando que cada vez que vc
movimenta um balão no seu caso e sua flexa
vc tem que atuliza a coluna e a Linha de ambos

o meu eu fiz eu fiz uma matriz de bixinho onde guardava a posição que ele tava
mesma coisa para os tiro so que fiz usando vetor

Bom espero que ajude em alguma coisa

Utilize a classe Rectangle.

Crie dois retângulos usando as coordenadas e dimensões da flecha e do balão:

Retangle r1 = new Retangle(flecha.x,flecha.y,flecha.width,flecha.height); Retangle r2 = new Retangle(balao.x,balao.y,balao.width,balao.height);

Depois use o método intersects() para checar se há intersecção entre os dois retângulos:

if(r1.intersects(r2)){ // houve colisão }

Eu já testei esse método de colisão e a performance dele é excelente…

Um bom lugar para começar a ver como programar jogos em Java é o Coke and Code (http://www.cokeandcode.com/) eles têm um ótimo tutorial de jogos.

Espero ter ajudado.

Poxa vc quer flechar o pobre do palhaço…