Getting problem in collision detection in Java Game
        Posted  
        
            by chetans
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by chetans
        
        
        
        Published on 2010-03-15T04:56:16Z
        Indexed on 
            2010/03/15
            4:59 UTC
        
        
        Read the original article
        Hit count: 489
        
java
Hi I am developing Spaceship Game in which i am getting problem in collision detection of moving images Game has a spaceship and number of asteroids(obstacles) i want to detect the collision between them How can i do this?`package Game; import java.applet.Applet; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.net.MalformedURLException; import java.net.URL;
public class ThreadInApplet extends Applet implements KeyListener { private static final long serialVersionUID = 1L;
Image[] asteroidImage;
Image spaceshipImage;
int[] XPosObst,YPosObst;
int numberOfObstacles=0,XPosOfSpaceship,YPosOfSpaceship;
int spaceButtnCntr=0,noOfObstaclesLevel=20;
boolean gameStart=false,collideUp=false,collideDown=false,collideLeft=false,collideRight=false;
private Image offScreenImage;
private Dimension offScreenSize,d;
private Graphics offScreenGraphics;
int speedObstacles=1;
String spaceshipImagePath="images/spaceship.png",obstacleImagepath="images/asteroid.png";
String buttonToStart="Press Space to start";
public void init()
{ 
        try 
        {
             asteroidImage=new Image[noOfObstaclesLevel];
             XPosObst=new int[noOfObstaclesLevel];
             YPosObst=new int[noOfObstaclesLevel];
             XPosOfSpaceship=getWidth()/2-35;
             YPosOfSpaceship=getHeight()-100;
             spaceshipImage=getImage(new URL(getCodeBase(),spaceshipImagePath));
             for(int i=0;i<noOfObstaclesLevel;i++)
             {
                 asteroidImage[i]=getImage(new URL(getCodeBase(),obstacleImagepath));  
                 XPosObst[i]=(int) (Math.random()*700);
                 YPosObst[i]=0;
             }
             MediaTracker tracker = new MediaTracker (this);
             for(int i=0;i<noOfObstaclesLevel;i++)
             {
                 tracker.addImage (asteroidImage[i], 0);
             }
        } 
        catch (MalformedURLException e) 
        {
            e.printStackTrace();
        }
        setBackground(Color.black);
        addKeyListener(this);
}
public void paint(Graphics g)
{ 
    g.setColor(Color.white);
    if(gameStart==false)
        {
            g.drawString(buttonToStart, (getWidth()/2)-60, getHeight()/2);
        }
    g.drawString("HEADfitted Solutions Pvt.Ltd.", (getWidth()/2)-80, getHeight()-20);
    for(int n=0;n<numberOfObstacles;n++)
    {
        if(n>0)
         g.drawImage(asteroidImage[n],XPosObst[n],YPosObst[n],this);
    }
    g.drawImage(spaceshipImage,XPosOfSpaceship,YPosOfSpaceship,this);
}
@SuppressWarnings("deprecation") public void update(Graphics g) { d = size(); if((offScreenImage == null) || (d.width != offScreenSize.width) || (d.height != offScreenSize.height)) { offScreenImage = createImage(d.width, d.height); offScreenSize = d; offScreenGraphics = offScreenImage.getGraphics(); }
 offScreenGraphics.clearRect(0, 0, d.width, d.height);
 paint(offScreenGraphics);
 g.drawImage(offScreenImage, 0, 0, null);
}
public void keyReleased(KeyEvent arg0){}
public void keyTyped(KeyEvent arg0) {}
Thread mainThread=new Thread()
{
synchronized public void run () 
        {
              try
                    {
                  //System.out.println("in main thread");
                  if (gameStart==true)
                  {
                   moveObstacles.start();
                   if(collide()==false)
             {
              createObsThread.start();
             }
                } 
                }
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
    }
};
Thread createObsThread=new Thread()
{
    synchronized public void run () 
    {
      if (spaceButtnCntr==1)
         {
       if (collide()==false)
       {
          for(int g=0;g<noOfObstaclesLevel;g++)
               {
                      try     
                      {
                          sleep(1000);
                      } 
                      catch (InterruptedException e) 
                      {
                          e.printStackTrace();
                      }
                     numberOfObstacles++;
                 }
             }
       }
    }
};
Thread moveObstacles=new Thread() // Moving Obstacle images downwards after every 10 ms { synchronized public void run () { while(YPosObst[19]!=600) { if (collide()==false) { //createObsThread.start(); for(int l=0;l
                      }
                      repaint();
                      try 
                      {
                          sleep(10);
                      } 
                      catch (InterruptedException e)
                      {
                          e.printStackTrace();
                      }
                 } 
               }
           }
       };
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode()==32)
    {
        gameStart=true;
        spaceButtnCntr++;
        if (spaceButtnCntr==1)
        {
          mainThread.start();
     }
    }
    if(gameStart==true) 
    {
        if(e.getKeyCode()==37 && collideLeft==false)//Spaceship movement left
        {
            new Thread () 
            {
                synchronized public void run () 
                {
                   XPosOfSpaceship-=10;
                    repaint();
                }
            }.start();
        }
        if(e.getKeyCode()==38 && collideUp==false)//Spaceship movement up
        {
            new Thread () 
            {
                synchronized public void run () 
                {
                    YPosOfSpaceship-=10;
                    repaint();
                }
            }.start();
        }
        if(e.getKeyCode()==39 && collideRight==false)//Spaceship movement right
        {
            new Thread () 
            {
                synchronized public void run () 
                {
                   XPosOfSpaceship+=10;
                    repaint();
                }
            }.start();
        }
        if(e.getKeyCode()==40 && collideDown==false)//Spaceship movement down
        {
            new Thread () 
            {
                synchronized public void run () 
                {
                    YPosOfSpaceship+=10;
                    repaint();
                }
            }.start();
        }
    }  
}
/*public boolean collide() { int x0, y0, w0, h0, x2, y2, w2, h2; x0=XPosOfSpaceship; y0=YPosOfSpaceship; h0=spaceshipImage.getHeight(null); w0=spaceshipImage.getWidth(null);
for(int i=0;i<20;i++) { x2=XPosObst[i]; y2=YPosObst[i]; h2=asteroidImage[i].getHeight(null); w2=asteroidImage[i].getWidth(null);
         if ((x0 > (x2 + w2)) || ((x0 + w0) < x2)) return false;
         System.out.println(x2+" "+y2+" "+h2+" "+w2);
       if ((y0 > (y2 + h2)) || ((y0 + h0) < y2)) return false;        
     }
return true;
}*/
public boolean collide() { int x1,y1,x2,y2,x3,y3,x4,y4; //coordinates of obstacles int a1,b1,a2,b2,a3,b3,a4,b4; //coordinates of spaceship a1 =XPosOfSpaceship; b1=YPosOfSpaceship; a2=a1+spaceshipImage.getWidth(this); b2=b1; a3=a1; b3=b1+spaceshipImage.getHeight(this); a4=a2; b4=b3; for(int a=0;a
        if(x1>=a1 && x1<=a2 && x1<=b3 && x1>=b1)
         return (true);
        if(x2>=a1 && x2<=a2 && x2<=b3 && x2>=b1)
         return(true);
        //********checking asteroid touch spaceship from up direction******** 
        if(y3==b1 && x4>=a1 && x4<=a2)
        {
            collideUp = true;
            return(true);
        }
        if(y3==b1 && x3>=a1 && x3<=a2)
        {
            collideUp = true;
            return(true);
        }
        //********checking asteroid touch spaceship from left direction******
        if(x2==a1 && y4>=b1 && y4<=b3)
        {
            collideLeft=true;
            return(true);
        }
        if(x2==a1 && y2>=b1 && y2<=b3)
        {
            collideLeft=true;
            return(true);
        }
        //********checking asteroid touch spaceship from right direction*****
        if(x1==a2 && y3>=b2 && y3<=b4)
        {
            collideRight=true;
            return(true);
        }
        if(x1==a2 && y1>=b2 && y1<=b4)
        {
            collideRight=true;
            return(true);
        }
        //********checking asteroid touch spaceship from down direction*****
        if(y1==b3 && x2>=a3 && x2<=a4)
        {
            collideDown=true;
            return(true);
        }
        if(y1==b3 && x1>=a3 && x1<=a4)
        {    
            collideDown=true;
            return(true);
        }
        else
        {
            collideUp=false;
            collideDown=false;
            collideLeft=false;
            collideRight=false;
        }
    }
     return(false);
}
} `
© Stack Overflow or respective owner