public override void OnCollisionEnter(CollisionInfo collision) { if (ballController.direction == Vector2.Zero) return; BreakoutPaddle paddle = collision.collidingObject as BreakoutPaddle; if (paddle != null) { Vector2 distance = transform.position - paddle.Transform.position; if (distance != Vector2.Zero) distance.Normalize(); Vector2 ballDir = ballController.direction; ballDir.Y *= -1; if (Math.Sign(distance.X) != Math.Sign(ballDir.X)) ballDir.X *= -1; ballDir.X += paddle.Controller.direction.X * 0.7f; ballDir.Normalize(); ballController.direction = ballDir; } IBlock block = collision.collidingObject as IBlock; if (block != null) { Vector2 distance = collision.collisionPoint - block.BlockSprite.Transform.position + new Vector2(block.BlockSprite.spriteData.Width/2f, block.BlockSprite.spriteData.Height/2f); float angle = (MathHelper.ToDegrees((float) Math.Atan2(-distance.Y, distance.X)) + 360) % 360; if (((angle >= 0 && angle < 45) || angle > 315) && Math.Sign(ballController.direction.X) == -1) ballController.FlipX(); else if ((angle > 135 && angle < 225) && Math.Sign(ballController.direction.X) == 1) ballController.FlipX(); else if ((angle >= 45 && angle <= 135) && Math.Sign(ballController.direction.Y) == 1) ballController.FlipY(); else if ((angle >= 225 && angle <= 315) && Math.Sign(ballController.direction.Y) == -1) ballController.FlipY(); else { ballController.FlipY(); ballController.FlipX(); } Console.WriteLine("Reflection angle:" + angle.ToString()); } }
public void TestAll() { for (int i = 0; i < collideableObjects.Count; i++) { for(int j = i + 1; j < collideableObjects.Count; j++) { Rectangle intersection = CollisionTest(collideableObjects[i], collideableObjects[j]); CollisionPair pair = new CollisionPair(collideableObjects[i], collideableObjects[j]); CollisionPair lastCollision = currentCollisions.Find(x => x == pair); if (intersection != Rectangle.Empty) { CollisionInfo infoA = new CollisionInfo(collideableObjects[j], intersection, intersection.Center.ToVector2()); CollisionInfo infoB = new CollisionInfo(collideableObjects[i], intersection, intersection.Center.ToVector2()); collideableObjects[i].OnCollision(infoA); collideableObjects[j].OnCollision(infoB); if (lastCollision.A == null) { currentCollisions.Add(pair); collideableObjects[i].OnCollisionEnter(infoA); collideableObjects[j].OnCollisionEnter(infoB); } } else { if (lastCollision.A != null) { currentCollisions.Remove(lastCollision); collideableObjects[i].OnCollisionExit(collideableObjects[j]); collideableObjects[j].OnCollisionExit(collideableObjects[i]); } } } } }
public virtual void OnCollisionEnter(CollisionInfo collision) { }
public virtual void OnCollision(CollisionInfo collision) { if(collision.collidingObject.GetType() == typeof(BreakoutBall)) this.Damage(1); }