Collision Problem....need help please

Hi

I have a simple mini game who has a cannon, that cannon shot bullets (Rectangle) to enemies stored in a arrayList. I must code into Bullet class the collision method but i have no idea.
I have search examples but all of them has two rectangles…
This is my Bullet class


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;



public class Balas implements Runnable 
{
    int x, y;
    int balaX, balaY;
    Rectangle balas, r1;
    Boolean colisao= false;
    private Jogo jogo;
    private ArrayList<Alvos> bugs;
    
    public Balas()
    {
    	x= 305;
    	y= 355;
    }
    public void desenho(Graphics g)
    {
    	//Bullet color
    	g.setColor(Color.pink);
    	//x and y position and height and width of bullet
    	g.fillRect(balas.x, balas.y, balas.width, balas.height);
    }
    
    public int getX()
    {
        return x;
    }
    
    public int getY()
    {
        return y;
    }
    
    public int getBalaX()
    {
        return balaX;
    }
    
    public int getBalaY()
    {
        return balaY;
    }
    @Override
    public void run()
    {
    	try
    	{
    		while(true)
    		{
                    //colisao();
                    Thread.sleep(5);
    		}
    	}
    	catch(Exception e){System.err.println(e.getMessage());
    }
    }
}

This is my cannon class



import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.ArrayList;

public class Canhao implements Runnable
{
	int x, y, DirecaoX;
	boolean disparar, tiro = false;
	static Balas bl = new Balas();
        ArrayList<Alvos> bugs;
        ArrayList<Rectangle> bal = new ArrayList<>();
        public Canhao()
	{
            x= 350;
            y= 355;
	}
	
       	public void desenho(Graphics g)
	{
		g.setColor(Color.BLACK);
		g.fillRect(x, y, 40, 10);
		g.fillRect(x+18, y-7, 4, 7);
		if(tiro)
		{
			bl.desenho(g);
		}
	}
	
	public void movimento()
	{
            x += DirecaoX;
            if(x<=0) 
            {
                x=0;
            }
            if(x>=555) 
            {
                x=555;
            }
	}
	
	public void setDirecaoX(int xdir)
	{
		DirecaoX= xdir;
	}
	
	 public void keyPressed(KeyEvent e){
	        int keyCode = e.getKeyCode();
	        if(keyCode == KeyEvent.VK_LEFT){
	        	setDirecaoX(-1);
	        }
	        if(keyCode == KeyEvent.VK_RIGHT)
                {
	            setDirecaoX(1);
	        }
	        if(keyCode == KeyEvent.VK_SPACE)
	        {
	        	if(bl.balas==null) 
                        {
                        disparar=true;
                        }
	        	if(disparar)
	        	{
	        		bl.balaY= y-7;
	        		bl.balaX= x+18;
	        		bl.balas= new Rectangle(bl.balaX, bl.balaY, 15, 10);
	        		tiro = true;
	        	}
	        }
	    }
	    	    
	    public void keyReleased(KeyEvent e){
	        int keyCode = e.getKeyCode();
	        if(keyCode == KeyEvent.VK_LEFT)
                {
	            setDirecaoX(0);
	        }
	        if(keyCode == KeyEvent.VK_RIGHT)
                {
	            setDirecaoX(0);
	        }
	        if(keyCode == KeyEvent.VK_SPACE)
                {
	        	disparar=false;
	        	if(bl.balas.y <=-5)
                        {
	        		bl.balas=new Rectangle(0,0,0,0);
	        		tiro = false;
	        		disparar=true;
	        	}
	        }
	    }
	
      
	public void atirar()
	{
		if(tiro)
		{
			bl.balas.y--;
		}
	}
       
       
       public void haColisao()
       {
           
       }
          
    @Override
	public void run()
	{
		Thread Balas = new Thread(bl);
		Balas.start();
		try
		{
			while(true)
			{
				atirar();
				movimento();
                                //haColisao(bugs, bl);
				Thread.sleep(5);
			}
		}
		catch(Exception e){System.err.println(e.getMessage());}
	}
}

My enemies class


package canvasgmc;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;

public class Alvos extends Objetos 
{
    private Image img;
    static Balas bl = new Balas();

    
	public Alvos(int posX, int posY, int altura, int largura, String jog)
	{
            super(posX, posY, altura, largura);
            this.img=Toolkit.getDefaultToolkit().getImage(jog);
	}

    @Override
	void desenho(Graphics g) 
	{
		g.drawImage(img, getPosX(), getPosY(), getAltura(), getLargura(), null);
        }
}

The arrayList is created in the main class


private ArrayList<Alvos> bugs = new ArrayList<>();

//constructor
bugs.add(new Alvos(50, 50 , 70, 70,"imagens/bug.gif"));
bugs.add(new Alvos(145, 50 , 70, 70,"imagens/bug1.gif"));

Can someone show me how can i achieve the collision and remove enemies from the arrayList?

Thanks

None?

Please…is urgent.

Thanks

From what I’ve seen and have been told you just need to do an intersects() check between the cannonball and the enemy. I don’t know much more than that, sorry!

This type of basic collision should be very, very, simple…


for(int i = 0; i < enemies.size(); i++)
if(bullet.bounds.intersects(enemies.get(i).bounds)){
enemies.remove(i);

}

Obviously this is assuming you have rectangles for the enemy and the bullet, also remember to update the bounds of the rectangles.

this method may not work if your bullets are moving really quickly…

See this base layout


Rectangle bounds = new Rectangle(x, y, w, h); // You may init this in a constructor

public void moveTo(int x, int y){
    bounds.x = x;
    bounds.y = y;
}

public Rectangle getBounds(){
    return bounds;
}

public boolean isCollidingWith(GameObject o){
    return bounds.intersects(o.getBounds());
}

Now use


obj1.isCollidingWith(obj2);

Hi

Thanks for your help…
I have a problem, the arrayList is defined in main class


import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;

public class Jogo extends JFrame 
{
    private static final long serialVersionUID = 1L;
    private Image dbImage;
    private Graphics dbg;
    private ArrayList<Alvos> bugs = new ArrayList<>(); //my arrayList
    static Balas balas;
    static Canhao s1 = new Canhao();
    static Objetos obj;
    Rectangle bounds;
            
    public Jogo()
    {
        setSize(600,400);
        setTitle("Trabalho GMC 2012/2013");
        setBackground(Color.WHITE);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
        addKeyListener(new AL());
        
          //Menu e Submenu
        JMenuBar menubar = new JMenuBar();
        JMenu fic = new JMenu("Ficheiro");
        JMenuItem abrir = new JMenuItem("Abrir");
        JMenuItem novo = new JMenuItem("Novo");
        JMenuItem sair = new JMenuItem("Sair");
        fic.add(abrir);
        fic.add(novo);
        fic.add(sair);
        //Adiciona menuBar a fic
        menubar.add(fic);
        //Define o Menu
        setJMenuBar(menubar);
        //bugs
        bugs.add(new Alvos(50, 50 , 70, 70,"imagens/bug.gif"));
	bugs.add(new Alvos(145, 50 , 70, 70,"imagens/bug1.gif"));
	bugs.add(new Alvos(225, 50 , 70, 70,"imagens/bug.gif"));
        bugs.add(new Alvos(305, 50 , 70, 70,"imagens/bug1.gif"));
	bugs.add(new Alvos(385, 50 , 70, 70,"imagens/bug.gif"));
        bugs.add(new Alvos(480, 50 , 70, 70,"imagens/bug.gif"));
	bugs.add(new Alvos(60, 100 , 50, 50,"imagens/bug1.gif"));
        bugs.add(new Alvos(155, 100 , 50, 50,"imagens/bug.gif"));
	bugs.add(new Alvos(235, 100 , 50, 50,"imagens/bug1.gif"));
	bugs.add(new Alvos(315, 100 , 50, 50,"imagens/bug.gif"));
	bugs.add(new Alvos(395, 100 , 50, 50,"imagens/bug1.gif"));
	bugs.add(new Alvos(490, 100 , 50, 50,"imagens/bug.gif"));
        
        //posicao dos alvos
        bounds = new Rectangle();// Here a put the values?? Do i have to get the methos getPosX(), getPosY()?
    }
     public Rectangle getBounds()
    {
        return bounds;
    }
     
    @Override
    public void paint(Graphics g)
    {
        //super.paint(g);
        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paintComponent(dbg);
        g.drawImage(dbImage, 0, 0, this);  
    }
   
    public void paintComponent(Graphics g)
    {
        super.paint(g);
        //Desenha o objeto canhoa
        s1.desenho(g);
        repaint();
        //Desenha os bugs
        for(Alvos av: bugs)
        {
            av.desenho(g);
        }
    }
    
    public void getTamanho()
    {
        bugs.size();
    }

   public class AL extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e){
            s1.keyPressed(e);
        }
        @Override
        public void keyReleased(KeyEvent e){
            s1.keyReleased(e);
        }
    }
    
    public static void main(String[] args) {
        new Jogo();
        //Threads
        Thread canhao = new Thread(s1);
        canhao.start();
    }
}

Thanks