示例#1
0
        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]);
                        }
                    }
                }
            }
        }
示例#3
0
 public virtual void OnCollisionEnter(CollisionInfo collision)
 {
 }
示例#4
0
 public virtual void OnCollision(CollisionInfo collision)
 {
     if(collision.collidingObject.GetType() == typeof(BreakoutBall))
         this.Damage(1);
 }