A collision circle object is used to detect objects and terrain which is used only for an x and y position at end, sonic will be drawn over the object at angles rounded to the nearest 45 degree increment.
Sin and Cos is used to locate precise X and Y positions by angle for object detection. Cos represents horizontal positions in X to current angle. Sin represents vertical positions in Y to current angle.
for example
// Circle Radius of 10
//==========================
mask_index = sprite1x1
if place_meeting( x + cos( degtorad( angle )) * 10 , y - sin( degtorad( angle )) * 10 , land_object )
{ do codes here }
The chart below is a point of reference on which direction to apply sin and cos which includes corner positions.
for example
// Bottom Right Corner
//==========================
mask_index = sprite1x1if place_meeting( x + cos( degtorad( angle )) * 10 + sin( degtorad(angle)) * 10 ,
y - sin( degtorad( angle )) * 10 + cos( degtorad(angle)) * 10 , land_object )
{ do codes here }
Sonic moves horizontally by the calculation of sin and cos according to the current angle to the ground multiplied by the x_speed which determines the next X , Y position
for example
// X Movement
x += cos( degtorad(angle)) * x_speed
y - = sin( degtorad(angle)) * x_speed
This is a list of major collision positions during a calculation of sonic falling to the ground.A basic collision detection keeps the circle out of the walls.
P1 and P2 detect weather these two position detect the ground. If they do detect the ground together they perform a calculation to change the angle variable to the angle of the ground. This angle is change by first creating 2 positions inside of the circle. If there is no collision between these two points the position is change down 1 pixel position. These two positions will eventually collide with land at two different positions. The new angle is then gained by a point_direction between these two new positions.
This new angle is then used for all angled collision detection like the slope position which will keep sonic to the ground and out of the ground according to the direction of sin and cos angle.
When P1 and P2 do not collide together the angle calculation is not performed and the angle is change to angle 0 and x_speed and y_speed are exchanged if the angle was not = to 0.