public void DistributeCircle_Box(LSBody box, LSBody circle) { xMore = circle._position.x > box._position.x; yMore = circle._position.y > box._position.y; if (xMore) { PenetrationX = (circle.XMin - box.XMax); } else { PenetrationX = (circle.XMax - box.XMin); } if (yMore) { PenetrationY = (circle.YMin - box.YMax); } else { PenetrationY = (circle.YMax - box.YMin); } //PenetrationX = PenetrationX + circle.Velocity.x; //PenetrationY = PenetrationY + circle.Velocity.y; xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX; yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY; if ((xAbs <= circle.Radius && yAbs <= circle.Radius)) { Vector2d corner; corner.x = xMore ? box.Position.x + box.HalfWidth : box.Position.x - box.HalfWidth; corner.y = yMore ? box.Position.y + box.HalfHeight : box.Position.y - box.HalfHeight; Vector2d dir = circle.Position - corner; dir.Normalize(); circle.Position = corner + dir * circle.Radius; } else { if (xAbs > yAbs) { PenetrationX = 0; //if (yAbs < circle.Radius) PenetrationY = PenetrationY * yAbs / circle.Radius; } else { PenetrationY = 0; //if (xAbs < circle.Radius) PenetrationX = PenetrationX * xAbs / circle.Radius; } //Resolving circle._position.x -= PenetrationX; circle._position.y -= PenetrationY; } circle.PositionChanged = true; circle.BuildBounds(); }
public void DistributeCircle_Box(LSBody box, LSBody circle) { xMore = circle._position.x > box._position.x; yMore = circle._position.y > box._position.y; if (xMore) { PenetrationX = (circle.XMin - box.XMax); } else { PenetrationX = (circle.XMax - box.XMin); } if (yMore) { PenetrationY = (circle.YMin - box.YMax); } else { PenetrationY = (circle.YMax - box.YMin); } xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX; yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY; if (xAbs <= circle.Radius && yAbs <= circle.Radius) { } else { if (xAbs > yAbs) { PenetrationX = 0;//FixedMath.Mul (PenetrationX, FixedMath.One * 1 / 4); } else { PenetrationY = 0;//FixedMath.Mul (PenetrationX, FixedMath.One * 1 / 4); } } //Resolving circle._position.x -= PenetrationX; //(PenetrationX * Multiplier) >> FixedMath.SHIFT_AMOUNT; circle._position.y -= PenetrationY; //(PenetrationY * Multiplier) >> FixedMath.SHIFT_AMOUNT; circle.PositionChanged = true; circle.BuildBounds(); }
public void DistributeCircle_Box(LSBody box, LSBody circle) { xMore = circle.Position.x > box.Position.x; yMore = circle.Position.y > box.Position.y; if (xMore) { PenetrationX = (circle.XMin - box.XMax); } else { PenetrationX = (circle.XMax - box.XMin); } if (yMore) { PenetrationY = (circle.YMin - box.YMax); } else { PenetrationY = (circle.YMax - box.YMin); } xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX; yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY; if (xAbs > yAbs) { PenetrationX = 0;//FixedMath.Mul (PenetrationX, FixedMath.One * 1 / 4); } else { PenetrationY = 0;//FixedMath.Mul (PenetrationX, FixedMath.One * 1 / 4); } //Resolving circle.Position.x -= PenetrationX;//(PenetrationX * Multiplier) >> FixedMath.SHIFT_AMOUNT; circle.Position.y -= PenetrationY;//(PenetrationY * Multiplier) >> FixedMath.SHIFT_AMOUNT; circle.Velocity.x -= PenetrationX; circle.Velocity.y -= PenetrationY; circle.VelocityChanged = true; circle.PositionChanged = true; circle.BuildBounds (); }
public void DistributeCircle_Box(LSBody box, LSBody circle) { xMore = circle.Position.x > box.Position.x; yMore = circle.Position.y > box.Position.y; if (xMore) { PenetrationX = (circle.XMin - box.XMax); if (PenetrationX > 0) { PenetrationX = 0; } } else { PenetrationX = (circle.XMax - box.XMin); if (PenetrationX < 0) { PenetrationX = 0; } } if (yMore) { PenetrationY = (circle.YMin - box.YMax); if (PenetrationY > 0) { PenetrationY = 0; } } else { PenetrationY = (circle.YMax - box.YMin); if (PenetrationY < 0) { PenetrationY = 0; } } xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX; yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY; if (xAbs > yAbs) { PenetrationX = 0; } else { PenetrationY = 0; } //Resolving if (Vector2d.Dot(PenetrationX, PenetrationY, circle.Velocity.x, circle.Velocity.y) < 0) { return; } circle.Position.x -= PenetrationX; //(PenetrationX * Multiplier) >> FixedMath.SHIFT_AMOUNT; circle.Position.y -= PenetrationY; //(PenetrationY * Multiplier) >> FixedMath.SHIFT_AMOUNT; if (LeCollisionType != CollisionType.Circle_AABox) { Mag = FixedMath.Sqrt((PenetrationX * PenetrationX + PenetrationY * PenetrationY) >> FixedMath.SHIFT_AMOUNT); PenetrationX = (PenetrationX << FixedMath.SHIFT_AMOUNT) / Mag; PenetrationY = (PenetrationY << FixedMath.SHIFT_AMOUNT) / Mag; } else { if (PenetrationX != 0) { PenetrationX = PenetrationX > 0 ? FixedMath.One : -FixedMath.One; } else if (PenetrationY != 0) { PenetrationY = PenetrationY > 0 ? FixedMath.One : -FixedMath.One; } } circle.PositionChanged = true; circle.BuildBounds(); }
public void DistributeCircle_Box(LSBody box, LSBody circle) { xMore = circle.Position.x > box.Position.x; yMore = circle.Position.y > box.Position.y; if (xMore) { PenetrationX = (circle.XMin - box.XMax); if (PenetrationX > 0) PenetrationX = 0; } else { PenetrationX = (circle.XMax - box.XMin); if (PenetrationX < 0) PenetrationX = 0; } if (yMore) { PenetrationY = (circle.YMin - box.YMax); if (PenetrationY > 0) PenetrationY = 0; } else { PenetrationY = (circle.YMax - box.YMin); if (PenetrationY < 0) PenetrationY = 0; } xAbs = PenetrationX < 0 ? -PenetrationX : PenetrationX; yAbs = PenetrationY < 0 ? -PenetrationY : PenetrationY; if (xAbs > yAbs) { PenetrationX = 0; } else { PenetrationY = 0; } //Resolving if (Vector2d.Dot (PenetrationX,PenetrationY,circle.Velocity.x,circle.Velocity.y) < 0) { return; } circle.Position.x -= PenetrationX;//(PenetrationX * Multiplier) >> FixedMath.SHIFT_AMOUNT; circle.Position.y -= PenetrationY;//(PenetrationY * Multiplier) >> FixedMath.SHIFT_AMOUNT; if (LeCollisionType != CollisionType.Circle_AABox) { Mag = FixedMath.Sqrt ((PenetrationX * PenetrationX + PenetrationY * PenetrationY) >> FixedMath.SHIFT_AMOUNT); PenetrationX = (PenetrationX << FixedMath.SHIFT_AMOUNT) / Mag; PenetrationY = (PenetrationY << FixedMath.SHIFT_AMOUNT) / Mag; } else { if (PenetrationX != 0){ PenetrationX = PenetrationX > 0 ? FixedMath.One : -FixedMath.One; } else if (PenetrationY != 0) { PenetrationY = PenetrationY > 0 ? FixedMath.One : -FixedMath.One; } } circle.PositionChanged = true; circle.BuildBounds (); }