Game Help - Sprite Collision Detection 
	 
	
		| Author | 
		Message | 
	 
		 
		jolly50
 
  
 
    
		 | 
		
		
			
				  Posted: Thu Nov 08, 2007 7:52 pm    Post subject: Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				Hey,
 
 
I'm writing a game, but I need help with the collision detection.
 
 
My game involves this little football ref that has to avoid and shoot footballs at opposing football running backs
 
 
what I would like to do is have it so that when the footballs hit a runningback....that the running back dissappears.
 
 
and if the running back hits the ref then its game over.....
 
 
so here is what i have so far...
 
 
	  | code: | 	 		  
 
setscreen ("graphics") 
 
View.Set ("offscreenonly")
 
 
var x, y, x1,y1 :int 
 
var vx, vy: int 
 
var chars :array char of boolean
 
var timeLast := Time.Elapsed
 
var proj : flexible array 1 .. 0 of
 
    record
 
        x, y, vx, vy : real
 
    end record
 
var playerdir: int:=0
 
 
function cooldown (timeDelay : int) : boolean
 
    if Time.Elapsed - timeLast >= timeDelay then
 
        timeLast := Time.Elapsed
 
        result true
 
    end if
 
    result false
 
end cooldown
 
 
var pic1:int:= Pic.FileNew ("football_ref.bmp")
 
 
x:=25
 
y:=26
 
x1:= 400
 
y1:=26
 
 
var spriteman:int
 
spriteman:=Sprite.New(pic1)
 
 
var football:int:=Pic.FileNew("football_ball.bmp")
 
 
var jumping: boolean:=false
 
 
const gravity:=-1
 
 
 
Sprite.Show (spriteman)
 
 
Sprite.SetPosition (spriteman,x,y,false)
 
 
procedure controls
 
 
Input.KeyDown (chars)
 
 
    if chars (KEY_RIGHT_ARROW) then
 
         x+=2
 
         playerdir:=0
 
    end if
 
 
    if chars (KEY_LEFT_ARROW) then
 
        x-=2
 
        playerdir:=180
 
    end if
 
 
    if chars (KEY_DOWN_ARROW) then
 
        y-=2
 
    end if
 
 
    if chars (KEY_UP_ARROW) and not jumping and y=26 then
 
        jumping:=true
 
        vy:=15
 
    end if
 
    
 
    if chars (' ') then
 
    end if
 
    
 
    if chars (KEY_ENTER) then
 
        if cooldown (200) then
 
            new proj, upper (proj) + 1
 
            if playerdir=0 then
 
                proj (upper (proj)).x:= x+77
 
            elsif playerdir=180 then
 
                proj (upper (proj)).x:= x
 
            end if
 
            
 
            proj (upper (proj)).y:= y+80
 
            
 
            if playerdir=0 then
 
                proj (upper (proj)).vx:=16
 
            elsif playerdir=180 then
 
                proj (upper(proj)).vx:=-16
 
            end if
 
            
 
            proj (upper (proj)).vy := 8
 
            timeLast:= Time.Elapsed
 
         end if
 
     end if
 
           
 
    if jumping then
 
        x+=0
 
        y+=vy
 
        vy+=gravity
 
        
 
        if y <= 26 then
 
            jumping:=false
 
            y:=26
 
        end if
 
    end if
 
        if chars (KEY_CTRL) then
 
           drawfilloval (x+40,y+30,5,5,7)
 
           x:=x-5
 
       end if
 
 
       if chars (KEY_SHIFT) then
 
           drawfilloval (x+40,y+30,5,5,7)
 
           x:=x+5
 
       end if
 
    
 
    if y<26 then
 
        y:=26
 
    end if
 
    
 
    if x>580 then
 
       x:=580
 
   end if
 
 
   if x<0 then
 
       x:=0
 
 
   end if
 
 
 
Sprite.SetPosition (spriteman,x,y,false)
 
end controls
 
 
procedure updateproj
 
 
for i : 1 .. upper (proj)
 
        proj (i).vy += gravity
 
        proj (i).x += proj (i).vx
 
        proj (i).y += proj (i).vy
 
    end for
 
 
    for i : 1 .. upper (proj)
 
        if proj (i).x > maxx or proj (i).y < 0 or proj (i).x < 0 then
 
            proj (i) := proj (upper (proj))
 
            new proj, upper (proj) - 1
 
            exit 
 
        end if
 
    end for
 
 for i : 1 .. upper (proj)
 
        Pic.Draw (football,round (proj (i).x), round (proj (i).y),picCopy) 
 
    end for
 
end updateproj
 
 
procedure computer
 
 
 
var pic2:int:= Pic.FileNew ("football_player.bmp")
 
 
var footballman:int
 
footballman:=Sprite.New(pic2)
 
 
Sprite.Show (footballman)
 
 
Sprite.SetPosition (footballman,x1,y1,false)
 
 
 
if x>25 then
 
  x1:=x1-3
 
end if
 
    
 
 
end computer
 
 
loop 
 
    cls
 
    drawfillbox (0,0,maxx,30,green)
 
    Input.KeyDown (chars)
 
    controls
 
    updateproj
 
    computer
 
    Sprite.SetPosition (spriteman,x,y,false)
 
    View.Update
 
    delay (5)
 
end loop
 
 
  | 	  
 
 
...sorry its a little messy....and it does have one issue right now..the running back leaves a trail right behind him, but i'm currently working on it...
 
 
what should I add to my code to make it work? | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
		 
		Sponsor Sponsor 
		 
  
		 | 
		
 | 
	 
	 
		  | 
	 
				 
		CodeMonkey2000
 
 
 
    
		 | 
		
		
			
				  Posted: Thu Nov 08, 2007 8:37 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| Do you know how a rectangle to rectangle collision works? Just apply that for sprites. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Zampano
 
  
 
    
		 | 
		
		 | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		jolly50
 
  
 
    
		 | 
		
		
			
				  Posted: Thu Nov 08, 2007 9:21 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| I read the tutorial on collision detection and I'm still a little confused....how would i relate the x1,x2,y1,y2 concept to my sprites..... | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Zampano
 
  
 
    
		 | 
		
		
			
				  Posted: Fri Nov 09, 2007 2:54 am    Post subject: Re: Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				To the best of my very limited understanding, your sprite should be approximated as a rectangle and the corners of the rectangle should be declared beased on their distance from other corners of the same sprite. I other words, each corner of the sprite picture is a corner used in the collision detection.
 
 
I have a sneaking feeling that I am not grasping what you are actually asking though. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		jolly50
 
  
 
    
		 | 
		
		
			
				  Posted: Fri Nov 09, 2007 5:02 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				you sort of got my drift, but what I was really looking for was...
 
 
in my code...i have 
 
 
	  | code: | 	 		  
 
Sprite.SetPosition (spriteman,x,y,false)
 
  | 	  
 
 
how would i change that code to put in x1, x2, y1, y2 so that I can use the detection feature | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Nick
 
  
 
    
		 | 
		
		
			
				  Posted: Fri Nov 09, 2007 5:20 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				well x1 wil be x
 
let y1 be y
 
that leaves x2 and y2
 
use Pic.Height and Pic.Width to find x2 and y2
 
x2=x+Pic.Width(spriteman)
 
y2=y+Pic.Height(spriteman) | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		jolly50
 
  
 
    
		 | 
		
		
			
				  Posted: Fri Nov 09, 2007 9:42 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				ok....lol
 
 
I'm confused beyond belief.....
 
 
I have no clue what i'm doing....
 
 
...can someone help walk me through this? | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
		 
		Sponsor Sponsor 
		 
  
		 | 
		
 | 
	 
	 
		  | 
	 
				 
		CodeMonkey2000
 
 
 
    
		 | 
		
		
			
				  Posted: Fri Nov 09, 2007 9:55 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				Mabey this is too advanced for you?
 
Think about how x2 relates to x1. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		jolly50
 
  
 
    
		 | 
		
		
			
				  Posted: Fri Nov 09, 2007 10:13 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				ok.....
 
 
this might be too advanced...but eventually I have to learn about this....
 
 
so...I went into the tutorial about rectangle collision detection and I incorporated my own sprites like this:
 
 
	  | code: | 	 		  
 
setscreen ("graphics")
 
View.Set ("offscreenonly")
 
 
 
var sprite1_x1:int:= 100
 
var sprite1_y1:int:= 100
 
var sprite1_x2:int
 
var sprite1_y2:int
 
var sprite2_x1:int:= 200
 
var sprite2_y1:int:= 100
 
var sprite2_x2:int
 
var sprite2_y2:int
 
 
var pic1:int:= Pic.FileNew ("football_ref.bmp")
 
var pic2:int:= Pic.FileNew ("football_ball.bmp")
 
 
var spriteman:int
 
spriteman:=Sprite.New(pic1)
 
var football:int
 
football:=Sprite.New(pic2)
 
 
Sprite.Show (spriteman)
 
Sprite.Show (football)
 
 
Sprite.SetPosition (spriteman,sprite1_x1,sprite1_y1,false)
 
Sprite.SetPosition (football,sprite2_x1,sprite2_y1,false)
 
 
sprite1_x2:=sprite1_x1+Pic.Width(pic1)
 
sprite1_y2:=sprite1_y1+Pic.Height(pic1)
 
 
sprite2_x2:=sprite2_x1+Pic.Width(pic2)
 
sprite2_y2:=sprite2_y1+Pic.Height(pic2)
 
 
 
loop
 
    cls
 
    delay (20)
 
    sprite1_x1:=sprite1_x1+1
 
    if sprite1_x2 > sprite2_x1 and sprite1_x1 < sprite2_x2 and sprite1_y2 > sprite2_y1 and sprite1_y1 < sprite2_y2 then
 
        put "Sack!"
 
        exit
 
    end if
 
    View.Update
 
end loop
 
 
 
  | 	  
 
 
First, am i going in the right direction?
 
 
Second, when I try to run the program...my sprites don't move....
 
 
What do I have to do to make my code work? | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		Nick
 
  
 
    
		 | 
		
		
			
				  Posted: Fri Nov 09, 2007 10:36 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				redeclare x2 and y2 in ur main loop
 
	  | Turing: | 	 		  
loop
    cls
    delay (20)
    sprite1_x1:=sprite1_x1+ 1
    sprite1_x2:=sprite1_x1+ Pic.Width(pic1 )
    sprite1_y2:=sprite1_y1+ Pic.Height(pic1 )
    sprite2_x2:=sprite2_x1+ Pic.Width(pic2 )
    sprite2_y2:=sprite2_y1+ Pic.Height(pic2 )
    if sprite1_x2 > sprite2_x1  and sprite1_x1 < sprite2_x2  and sprite1_y2 > sprite2_y1  and sprite1_y1 < sprite2_y2  then
        put "Sack!"
        exit
    end if
    View.Update
end loop 
  | 	  
 
 
alse the sprite module does not work on some versions of turing what version are u running? | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		jolly50
 
  
 
    
		 | 
		
		
			
				  Posted: Sat Nov 10, 2007 7:17 am    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				I tried your code and it does say "sack!", but the sprites don't move!?!?!?!?
 
 
... and I'm running 4.1 | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		jolly50
 
  
 
    
		 | 
		
		
			
				  Posted: Sat Nov 10, 2007 11:41 am    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				...also...I tried to fix my Game's code and this is what I got...
 
 
	  | code: | 	 		  
 
setscreen ("graphics") 
 
View.Set ("offscreenonly")
 
 
var x, y, x1,y1,x2,y2 :int 
 
var vx, vy: int 
 
var chars :array char of boolean
 
var timeLast := Time.Elapsed
 
var proj : flexible array 1 .. 0 of
 
    record
 
        x, y, vx, vy : real
 
    end record
 
var playerdir: int:=0
 
 
 
 
function cooldown (timeDelay : int) : boolean
 
    if Time.Elapsed - timeLast >= timeDelay then
 
        timeLast := Time.Elapsed
 
        result true
 
    end if
 
    result false
 
end cooldown
 
 
var pic1:int:= Pic.FileNew ("football_ref.bmp")
 
 
x:=25
 
y:=26
 
x1:= 400
 
y1:=26
 
 
var spriteman:int
 
spriteman:=Sprite.New(pic1)
 
 
x2:=x+Pic.Width(pic1)
 
y2:=y+Pic.Height(pic1)
 
 
var football:int:=Pic.FileNew("football_ball.bmp")
 
 
var pic2:int:= Pic.FileNew ("football_player.bmp")
 
 
var footballman:int
 
footballman:=Sprite.New(pic2)
 
 
Sprite.Show (footballman)
 
 
Sprite.SetPosition (footballman,x1,y1,false)
 
 
 
var jumping: boolean:=false
 
 
const gravity:=-1
 
 
 
Sprite.Show (spriteman)
 
 
Sprite.SetPosition (spriteman,x,y,false)
 
 
procedure controls
 
 
Input.KeyDown (chars)
 
 
    if chars (KEY_RIGHT_ARROW) then
 
         x+=2
 
         playerdir:=0
 
    end if
 
 
    if chars (KEY_LEFT_ARROW) then
 
        x-=2
 
        playerdir:=180
 
    end if
 
 
    if chars (KEY_DOWN_ARROW) then
 
        y-=2
 
    end if
 
 
    if chars (KEY_UP_ARROW) and not jumping and y=26 then
 
        jumping:=true
 
        vy:=20
 
    end if
 
    
 
    if chars (' ') then
 
    end if
 
    
 
    if chars (' ') then
 
        if cooldown (200) then
 
            new proj, upper (proj) + 1
 
            if playerdir=0 then
 
                proj (upper (proj)).x:= x+77
 
            elsif playerdir=180 then
 
                proj (upper (proj)).x:= x
 
            end if
 
            
 
            proj (upper (proj)).y:= y+80
 
            
 
            if playerdir=0 then
 
                proj (upper (proj)).vx:=16
 
            elsif playerdir=180 then
 
                proj (upper(proj)).vx:=-16
 
            end if
 
            
 
            proj (upper (proj)).vy := 8
 
            timeLast:= Time.Elapsed
 
         end if
 
     end if
 
           
 
    if jumping then
 
        x+=0
 
        y+=vy
 
        vy+=gravity
 
        
 
        if y <= 26 then
 
            jumping:=false
 
            y:=26
 
        end if
 
    end if
 
        if chars (KEY_CTRL) then
 
           drawfilloval (x+40,y+30,5,5,7)
 
           x:=x-5
 
       end if
 
 
       if chars (KEY_SHIFT) then
 
           drawfilloval (x+40,y+30,5,5,7)
 
           x:=x+5
 
       end if
 
    
 
    if y<26 then
 
        y:=26
 
    end if
 
    
 
    if x>580 then
 
       x:=580
 
   end if
 
 
   if x<0 then
 
       x:=0
 
 
   end if
 
   
 
   
 
 
 
Sprite.SetPosition (spriteman,x,y,false)
 
end controls
 
 
procedure updateproj
 
 
for i : 1 .. upper (proj)
 
        proj (i).vy += gravity
 
        proj (i).x += proj (i).vx
 
        proj (i).y += proj (i).vy
 
    end for
 
 
    for i : 1 .. upper (proj)
 
        if proj (i).x > maxx or proj (i).y < 0 or proj (i).x < 0 then
 
            proj (i) := proj (upper (proj))
 
            new proj, upper (proj) - 1
 
            exit 
 
        end if
 
    end for
 
 for i : 1 .. upper (proj)
 
        Pic.Draw (football,round (proj (i).x), round (proj (i).y),picCopy) 
 
    end for
 
 
end updateproj
 
 
procedure computer
 
 
 
 
 
if x>25 or x<25 then
 
  x1:=x1-3
 
end if
 
   
 
 
end computer
 
 
loop 
 
    cls
 
    drawfillbox (0,0,maxx,30,green)
 
    Input.KeyDown (chars)
 
    controls
 
    updateproj
 
    computer
 
    Sprite.SetPosition (spriteman,x,y,false)
 
    Sprite.SetPosition (footballman,x1,y1,false)
 
        if  x > x1 and x1 < x2 and y2 > y1 and y1 < y2 then
 
            put "Game Over"
 
            exit
 
        end if 
 
    View.Update
 
    delay (10)
 
end loop
 
 
  | 	  
 
 
What is wrong with my collison detection's "if statement.....because the game ends when the running back touches the original x coordinate... instead of the new coordinate | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		CodeMonkey2000
 
 
 
    
		 | 
		
		
			
				  Posted: Sat Nov 10, 2007 12:06 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| How are you able to use the sprite module? And if you are going to copy/steal code at least give credit. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		jolly50
 
  
 
    
		 | 
		
		
			
				  Posted: Sat Nov 10, 2007 6:30 pm    Post subject: RE:Game Help - Sprite Collision Detection  | 
	
				
				 | 
			 
			 
				
  | 
			 
			
				| ummm...I never copy or stole any code!!!!!...Even if I did I would give credit.....I NEVER COPIED OR STOLE ANY CODE...I wrote this entire code with the help of some of my friends in my comp. eng. class | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		 | 
	 
 
	
	
	 
	
	 |