# Circle/Block collision problems

**URL:** <https://forum.kirupa.com/t/circle-block-collision-problems/313695>\
**Category:** flash\
**Created:** [September 7, 2010, 2:37pm UTC](https://forum.kirupa.com/t/circle-block-collision-problems/313695 "2010-09-07T14:37:31Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Maqrkk](https://avatars.discourse-cdn.com/v4/letter/m/35a633/32.png) [@Maqrkk](https://forum.kirupa.com/u/Maqrkk)\
**Post date:** [September 7, 2010, 2:37pm UTC](https://forum.kirupa.com/t/circle-block-collision-problems/313695/1 "2010-09-07T14:37:31Z")

</div>

Hello everyone,

so, I’m trying to get this right. A ball with set direction moves until it hits a target block. Upon collision, new direction is calculated, and the ball moves in that direction until it collides again. This all takes place in a 2d environment, and no factors likes friction or gravity come into play either. The blocks are not rotated either.

Somehow, I can’t quite get this right. Every frame, I loop through the blocks, and check if the ball collides with any of them (through simple hitTestObject) and then see if it was hit on a flat surface or a point. In case of a flat surface, the new direction is simple enough. In case of a point, I had an idea, but it does not seem to be working.

Here is my gameLoop function (ENTER\_FRAME function, don’t think it matters much? )

```auto
private function gameLoop(e:Event):void
{
	var dirRad:Number = ball.direction * Math.PI / 180;
	var yDiff:Number = 0 - Math.sin(dirRad) * ball.speed;
	var xDiff:Number = Math.cos(dirRad) * ball.speed;
	ball.y += yDiff;
	ball.x += xDiff;

	for (var i:uint = 0; i < blocks.length; i++)
	{
		var b:Block = blocks* as Block;
		if (b.hitTestObject(ball))
		{
			if (ball.x > b.x && ball.x < b.x + b.width)
			{
				if (b.y > ball.y) ball.y = b.y - ball.radius;
				else ball.y = b.y + b.height + ball.radius;
				ball.direction = calcDir(0 - ball.direction);
			}

			else if (ball.y > b.y && ball.y < b.y + b.height)
			{
				if (b.x > ball.x) ball.x = b.x - ball.radius;
				else ball.x = b.x + b.width + ball.radius;
				ball.direction = calcDir(90 + (90 - ball.direction));
			}

			else
			{
				var px:uint;
				var py:uint;
				if (ball.x < b.x) px = b.x;
				else px = b.x + b.width;
				if (ball.y < b.y) py = b.y;
				else py = b.y + b.height;
				var dist:Number = Math.pow(ball.x - px, 2) + Math.pow(ball.y - py, 2);
				if (dist < Math.pow(ball.radius, 2))
				{
					var angle:Number = Math.asin((px - ball.x) / 10);
					var degAngle:Number = 90 + (angle * 180 / Math.PI);

					ball.direction = calcDir(degAngle + (degAngle - (ball.direction - 180)));
				}
			}
		}
	}
}

```

calcDir is a simple function that makes sure the rotation is between 0 and 360:

```auto
private function calcDir(input:int):uint
{
	while (input > 360) input -= 360;
	while (input < 0) input += 360;
	return uint(input);
}

```

In some cases, the ball bounces back fine. In some cases, the ball bounces in a direction that seems totally unlikely. In other cases, the ball seems to get ‘stuck’ in a corner and eventually bounces back in a seemingly random way. What am I doing wrong here?
