Square and Circle collision detection not working proporly
Author |
Message |
Offroadrider
|
Posted: Thu Mar 31, 2011 11:05 am Post subject: Square and Circle collision detection not working proporly |
|
|
Hey guys,
I am trying to make a tag program but the collision detection between the circle and the square is not working proporly.
Here is the code that is not working
Turing: |
%Variables
var ballx, bally : int := 300
var boxx,boxy : int := 50
var chars : array char of boolean
var font1,font2,font3 : int
var colour1, colour2 : int := 0
var z : int
font1 := Font.New ("timesnewroman:50:bold")
font2 := Font.New ("timesnewroman:100:bold")
font3 := Font.New ("timesnewroman:15")
randint (z, 0, 1)
if z = 0 then
colour1 := 40
end if
if z = 1 then
colour2 := 40
end if
View.Set ("offscreenonly")
loop
Input.KeyDown (chars )
drawfillbox (maxx, maxy, 0, 0, black)
drawfilloval (ballx,bally, 10, 10, colour1 )
drawfillbox (boxx,boxy,boxx + 20,boxy + 20, colour2 )
View.Update
%%%%%%%%CONTROLS%%%%%%%%%%%
%%%%%%%%%%%%P1%%%%%%%%%%%%%
if chars (KEY_UP_ARROW) then
bally += 2
end if
if chars (KEY_DOWN_ARROW) then
bally -= 2
end if
if chars (KEY_RIGHT_ARROW) then
ballx += 2
end if
if chars (KEY_LEFT_ARROW) then
ballx -= 2
end if
%%%%%%%%%%%%P2%%%%%%%%%%%%%%
if chars ('w') then
boxy += 2
end if
if chars ('s') then
boxy -= 2
end if
if chars ('a') then
boxx -= 2
end if
if chars ('d') then
boxx += 2
end if
%%%%%%%%%%%boundries%%%%%%%%
if bally > 380 then
bally := 380
end if
if bally < 20 then
bally := 20
end if
if ballx > 620 then
ballx := 620
end if
if ballx < 20 then
ballx := 20
end if
if boxy > 360 then
boxy := 360
end if
if boxy < 0 then
boxy := 0
end if
if boxx > 600 then
boxx := 600
end if
if boxx < 0 then
boxx := 0
end if
%%%%%%%%%taging%%%%%%%%%%%%
if colour1= 40 and ballx - 20 < boxx and bally - 20 > boxy and ballx < boxx + 20 and bally > boxy + 20 then
colour2 := 40
colour1 := 0
end if
if colour2= 40 and boxx + 20 > ballx and boxy < bally and boxy + 20 > bally and boxx < ballx then
colour1 := 40
colour2 := 0
end if
if chars (' ') then
exit
end if
end loop
|
This is in turing 4.1.1
1 more thing,
this is not the entire code
it would be way too big for this space.
this is just the pieces of code that have to do with the collision detection
Thanks for your help |
|
|
|
|
|
Sponsor Sponsor
|
|
|
Insectoid
|
Posted: Thu Mar 31, 2011 11:16 am Post subject: RE:Square and Circle collision detection not working proporly |
|
|
Quote: bally -20 > boxy
Quote: bally > boxy +20
What's different about these two statements? |
|
|
|
|
|
Offroadrider
|
Posted: Thu Mar 31, 2011 11:29 am Post subject: Re: Square and Circle collision detection not working proporly |
|
|
Nothing, it's just that when i wrote the ballx-20, it finnaly worked on the some what on y-axis if I put boxx +20 > ballx like on the other line, it didn't work |
|
|
|
|
|
Offroadrider
|
Posted: Thu Mar 31, 2011 1:02 pm Post subject: Re: Square and Circle collision detection not working proporly |
|
|
feel free to copy the code into a turing file to help find out what's not working |
|
|
|
|
|
Zren
|
Posted: Thu Mar 31, 2011 2:07 pm Post subject: RE:Square and Circle collision detection not working proporly |
|
|
Box:
The bottom left is (boxx, boxy).
The top right is (boxx+20, boxy+20)
Circle:
The middle is (ballx, bally)
Circle and rectangular collision is done with if a point is within the range of the circle or rectangle. You seem to be trying to compare two ranges. And also treating the ball's center point like one of the rectangles control points (it's in the middle not a corner).
Make sure your code follows this pattern, where p is the middle of your ball.
Rectangle:
box.x <= p.x <= box.x + box.width
box.y <= p.y <= box.y + box.height
The way collision detection works, is that you can check circle against circle, or rectangle against rectangle, or if a point is within either. You can't easily check collision between a circle and a rectangle. You can however treat a circle as a rectangle since the circle can fit inside a rectangle (easier and more accurate than putting the rectangle inside the circle).
This post on collision detection should help:
http://compsci.ca/v3/viewtopic.php?t=13661 |
|
|
|
|
|
|
|