Esempio n. 1
0
        public void onCollision(GameTime gameTime, PolygonCollisionResult collisionResult, Vector2 player1Velocity)
        {
            player1Velocity = player1Velocity / 2;

            position += -player1Velocity * (float)gameTime.ElapsedGameTime.TotalSeconds +
                    -collisionResult.MinimumTranslationVector;
        }
Esempio n. 2
0
 public void onCollision(GameTime gameTime, PolygonCollisionResult collisionResult, Vector2 player1Velocity)
 {
     foreach (MenuButton menuButton in menuButtons)
     {
         menuButton.onCollision(gameTime, collisionResult, player1Velocity);
     }
 }
Esempio n. 3
0
 public void onCollision(GameTime gameTime, PolygonCollisionResult collisionResult, Vector2 player1Velocity)
 {
     foreach (Font font in spriteFonts)
     {
         font.onCollision(gameTime, collisionResult, player1Velocity);
     }
 }
Esempio n. 4
0
        public override void OnWallCollision(List <Tuple <PolygonCollisionResult, Polygon> > ListWallCollidingPolygon)
        {
            Vector2 MovementCorection = Vector2.Zero;
            bool    IsAWall           = false;

            //Check if the wall is not a floor/slope
            foreach (Tuple <PolygonCollisionResult, Polygon> FinalCollisionResult in ListWallCollidingPolygon)
            {
                foreach (Polygon ActivePlayerCollisionPolygon in Owner.Collision.ListCollisionPolygon)
                {
                    PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(ActivePlayerCollisionPolygon, FinalCollisionResult.Item2, Owner.Speed, new Vector2(0, -Owner.Speed.Y - 1));

                    if (CollisionResult.Distance >= 0)
                    {
                        IsAWall            = true;
                        MovementCorection += CollisionResult.Axis * CollisionResult.Distance;
                        WallAxis           = CollisionResult.Axis;
                        CanWallJump        = true;
                        break;
                    }
                }
            }

            if (IsAWall)
            {
                Owner.UpdateSkills(TripleThunderRobotRequirement.OnWallCollisionName);

                Vector2 FinalMovement = Owner.Speed + MovementCorection;

                Owner.Move(FinalMovement);
            }
        }
Esempio n. 5
0
        public override void Update(GameTime gameTime, float deltaTime)
        {
            base.Update(gameTime, deltaTime);
            //List<InputType> playerInputs = Input.DefineInputs(ref mainGame.gameState.oldKbState); attention, en double avec le Scene
            Player.Instance.currentCharacter.mapRepresentation.Update(playerInputs, deltaTime);
            collision = SATCollision.CheckPolygonCollision(Player.Instance.currentCharacter.mapRepresentation.CurrentHitBox, legisteTest.CurrentHitBox, new Vector(0, 0));

            snowMap.Update();
        }
Esempio n. 6
0
        public void OnCollision(WorldObject Other, PolygonCollisionResult FinalCollisionResult, Polygon FinalPlayerPolygon, Polygon FinalWorldPolygon)
        {
            Vector2 GroundAxis = new Vector2(-FinalCollisionResult.Axis.Y, FinalCollisionResult.Axis.X);
            double  FinalCollisionResultAngle = Math.Atan2(GroundAxis.X, GroundAxis.Y);

            Vector2 MovementCorection = FinalCollisionResult.Axis * FinalCollisionResult.Distance;
            Vector2 FinalMovement     = Speed + MovementCorection;

            Move(FinalMovement);
        }
Esempio n. 7
0
        public void onCollision(GameTime gameTime, PolygonCollisionResult collisionResult, Vector2 player1Velocity)
        {
            Vector2 position = Properties.getProperty<Vector2>("Position");

            player1Velocity = player1Velocity / 2;

            position += player1Velocity * (float)gameTime.ElapsedGameTime.TotalSeconds +
                    collisionResult.MinimumTranslationVector;

            Properties.updateProperty<Vector2>("Position", position);
        }
Esempio n. 8
0
        void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            int    i        = 14;
            Vector velocity = new Vector();

            switch (e.KeyValue)
            {
            case 32:                     //SPACE

                break;

            case 38:                     // UP

                velocity = new Vector(0, -i);
                break;

            case 40:                     // DOWN

                velocity = new Vector(0, i);
                break;

            case 39:                     // RIGHT

                velocity = new Vector(i, 0);
                break;

            case 37:                     // LEFT

                velocity = new Vector(-i, 0);
                break;
            }

            Vector playerTranslation = velocity;

            foreach (Polygon polygon in polygons)
            {
                if (polygon == player)
                {
                    continue;
                }

                PolygonCollisionResult r = PolygonCollision(player, polygon, velocity);

                if (r.WillIntersect)
                {
                    playerTranslation = velocity + r.MinimumTranslationVector;
                    break;
                }
            }

            player.Offset(playerTranslation);
        }
Esempio n. 9
0
        public void GetCollidingWorldPolygon(RobotAnimation ActiveRobot, out List <Tuple <PolygonCollisionResult, Polygon> > ListAllCollidingPolygon,
                                             out List <Tuple <PolygonCollisionResult, Polygon> > ListFloorCollidingPolygon, out List <Tuple <PolygonCollisionResult, Polygon> > ListCelingCollidingPolygon, out List <Tuple <PolygonCollisionResult, Polygon> > ListWallCollidingPolygon)
        {
            ListAllCollidingPolygon    = new List <Tuple <PolygonCollisionResult, Polygon> >();
            ListFloorCollidingPolygon  = new List <Tuple <PolygonCollisionResult, Polygon> >();
            ListCelingCollidingPolygon = new List <Tuple <PolygonCollisionResult, Polygon> >();
            ListWallCollidingPolygon   = new List <Tuple <PolygonCollisionResult, Polygon> >();

            foreach (WorldPolygon ActiveWorldPolygon in GetCollidingWorldObjects(ActiveRobot))
            {
                if (ActiveRobot.ListIgnoredGroundPolygon.Contains(ActiveWorldPolygon))
                {
                    continue;
                }

                foreach (Polygon ActivePlayerCollisionPolygon in ActiveRobot.Collision.ListCollisionPolygon)
                {
                    PolygonCollisionResult CollisionResultB;
                    PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(ActivePlayerCollisionPolygon, ActiveWorldPolygon.Collision.ListCollisionPolygon[0], ActiveRobot.Speed, out CollisionResultB);

                    if (CollisionResult.Distance >= 0)
                    {
                        PolygonCollisionResult CollisionResult2 = Polygon.PolygonCollisionSAT(ActivePlayerCollisionPolygon, ActiveWorldPolygon.Collision.ListCollisionPolygon[0], Vector2.Zero, ActiveRobot.Speed);

                        ListAllCollidingPolygon.Add(new Tuple <PolygonCollisionResult, Polygon>(CollisionResult, ActiveWorldPolygon.Collision.ListCollisionPolygon[0]));

                        if (CollisionResult2.Distance != CollisionResult.Distance)
                        {
                            continue;
                        }
                        Vector2 GroundAxis = new Vector2(-CollisionResult.Axis.Y, CollisionResult.Axis.X);
                        double  FinalCollisionResultAngle = Math.Atan2(GroundAxis.X, GroundAxis.Y);

                        //Ground detection
                        if (FinalCollisionResultAngle >= FightingZone.GroundMinAngle && FinalCollisionResultAngle <= FightingZone.GroundMaxAngle)
                        {
                            ListFloorCollidingPolygon.Add(new Tuple <PolygonCollisionResult, Polygon>(CollisionResult, ActiveWorldPolygon.Collision.ListCollisionPolygon[0]));
                        }
                        //Ceiling
                        else if (FinalCollisionResultAngle <= -FightingZone.GroundMinAngle && FinalCollisionResultAngle >= -FightingZone.GroundMaxAngle)
                        {
                            ListCelingCollidingPolygon.Add(new Tuple <PolygonCollisionResult, Polygon>(CollisionResult, ActiveWorldPolygon.Collision.ListCollisionPolygon[0]));
                        }
                        //Wall
                        else
                        {
                            ListWallCollidingPolygon.Add(new Tuple <PolygonCollisionResult, Polygon>(CollisionResult, ActiveWorldPolygon.Collision.ListCollisionPolygon[0]));
                        }
                    }
                }
            }
        }
Esempio n. 10
0
        public void OnCollision(GameTime gameTime, Player Other, PolygonCollisionResult FinalCollisionResult, Polygon FinalCollisionPolygon, Polygon FinalOtherPolygon)
        {
            Other.OnCollision(gameTime, this, FinalCollisionResult, FinalCollisionPolygon, FinalOtherPolygon);

            Vector2 CollisionPoint;

            OnCollision(FinalCollisionResult, FinalCollisionPolygon, out CollisionPoint);

            CreateExplosion(CollisionPoint);

            ListAttackedRobots.Add(Other);

            Die();
        }
Esempio n. 11
0
        public void OnCollision(Player Other, PolygonCollisionResult FinalCollisionResult, Polygon FinalCollisionPolygon, Polygon FinalOtherPolygon)
        {
            Vector2 FinalMovement;

            if (FinalCollisionResult.Distance >= 0)
            {
                Vector2 MovementCorection = FinalCollisionResult.Axis * FinalCollisionResult.Distance;
                FinalMovement = Speed + MovementCorection;
            }
            else
            {
                FinalMovement = Speed;
            }

            Move(FinalMovement);
        }
Esempio n. 12
0
        public override void Update(GameTime gameTime)
        {
            TeleportAnimation.Update(gameTime);

            PolygonCollisionResult FinalCollisionResult = new PolygonCollisionResult(Vector2.Zero, -1);

            foreach (Player ActivePlayer in Map.ListAllPlayer)
            {
                foreach (Polygon EnemyCollision in ActivePlayer.InGameRobot.Collision.ListCollisionPolygon)
                {
                    PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(TeleportPolygon, EnemyCollision, ActivePlayer.InGameRobot.Speed);

                    if (CollisionResult.Distance >= 0 && CollisionResult.Distance > FinalCollisionResult.Distance)
                    {
                        ActivePlayer.InGameRobot.Speed += _TeleportSpeed;
                        ActivePlayer.InGameRobot.Move(_TeleportOffset);
                        Owner.ChangeRobotLayer(ActivePlayer.InGameRobot, _LayerIndex);
                    }
                }
            }
        }
Esempio n. 13
0
        public void UpdateAttackCollisionWithWorld(AttackBox ActiveAttackBox)
        {
            PolygonCollisionResult FinalCollisionResult       = new PolygonCollisionResult(Vector2.Zero, -1);
            PolygonCollisionResult FinalCollisionGroundResult = new PolygonCollisionResult(Vector2.Zero, -1);
            Polygon FinalCollisionPolygon = null;

            foreach (Polygon ActivePolygon in ListWorldCollisionPolygon)
            {
                foreach (Polygon CollisionPolygon in ActiveAttackBox.ListCollisionPolygon)
                {
                    PolygonCollisionResult CollisionGroundResult;
                    PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(CollisionPolygon, ActivePolygon, ActiveAttackBox.Speed, out CollisionGroundResult);

                    if (FinalCollisionResult.Distance < 0 || (CollisionResult.Distance >= 0 && CollisionResult.Distance > FinalCollisionResult.Distance))
                    {
                        FinalCollisionResult       = CollisionResult;
                        FinalCollisionGroundResult = CollisionGroundResult;
                        FinalCollisionPolygon      = ActivePolygon;
                    }
                }
            }

            if (FinalCollisionResult.Distance >= 0)
            {
                Vector2 CollisionPoint;
                ActiveAttackBox.OnCollision(FinalCollisionResult, FinalCollisionPolygon, out CollisionPoint);
                SetAttackContext(ActiveAttackBox, ActiveAttackBox.Owner, (float)Math.Atan2(-FinalCollisionGroundResult.Axis.X, -FinalCollisionGroundResult.Axis.Y), CollisionPoint);
                ActiveAttackBox.UpdateSkills(TripleThunderAttackRequirement.OnGroundCollisionAttackName);

                if (ActiveAttackBox.ExplosionAttributes.ExplosionRadius > 0)
                {
                    CreateExplosion(CollisionPoint, ActiveAttackBox);
                }
                else if (!ActiveAttackBox.FollowOwner)
                {
                    Owner.PlayerSFXGenerator.PlayBulletHitObjectSound();
                }
            }
        }
Esempio n. 14
0
        public void OnCollision(GameTime gameTime, Bullet Other, PolygonCollisionResult FinalCollisionResult, Polygon FinalCollisionPolygon, Polygon FinalOtherPolygon)
        {
            if (PlayerAI != null)
            {
                PlayerAI.Update(gameTime, "On Hit");
            }

            if (HasKnockback)
            {
                Speed.X = Math.Sign(Other.Speed.X) * 3;
                Speed.Y = Math.Sign(Other.Speed.Y) * 3;
            }

            int FinalDamage = (int)Other.Damage;

            //FightingZone.ListDamageNumber.Add(new DamageNumber(FinalCollisionPolygon.Center, FinalDamage, 1000));
            HP -= FinalDamage;

            if (HP < 0)
            {
                Die();
            }
        }
Esempio n. 15
0
        public override void Update(GameTime gameTime)
        {
            JumpPadAnimation.Update(gameTime);

            foreach (RobotAnimation ActiveRobot in Owner.DicRobot.Values)
            {
                PolygonCollisionResult FinalCollisionResult = new PolygonCollisionResult(Vector2.Zero, -1);
                foreach (CollisionPolygon EnemyCollision in ActiveRobot.ListCollisionPolygon)
                {
                    PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(JumpPadPolygon, EnemyCollision.ActivePolygon, ActiveRobot.Speed);

                    if (FinalCollisionResult.Distance < 0 || (CollisionResult.Distance >= 0 && CollisionResult.Distance > FinalCollisionResult.Distance))
                    {
                        FinalCollisionResult = CollisionResult;
                    }
                }

                if (FinalCollisionResult.Distance >= 0)
                {
                    ActiveRobot.Speed.Y = -_JumpSpeed;
                }
            }
        }
Esempio n. 16
0
        public override void Update(GameTime gameTime)
        {
            JumpPadAnimation.Update(gameTime);

            foreach (Player ActivePlayer in Map.ListAllPlayer)
            {
                PolygonCollisionResult FinalCollisionResult = new PolygonCollisionResult(Vector2.Zero, -1);
                foreach (Polygon EnemyCollision in ActivePlayer.InGameRobot.Collision.ListCollisionPolygon)
                {
                    PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(JumpPadPolygon, EnemyCollision, ActivePlayer.InGameRobot.Speed);

                    if (FinalCollisionResult.Distance < 0 || (CollisionResult.Distance >= 0 && CollisionResult.Distance > FinalCollisionResult.Distance))
                    {
                        FinalCollisionResult = CollisionResult;
                    }
                }

                if (FinalCollisionResult.Distance >= 0)
                {
                    ActivePlayer.InGameRobot.Speed.Y = -_JumpSpeed;
                }
            }
        }
Esempio n. 17
0
        protected void UpdateRobotCollisionWithRobot(RobotAnimation ActiveRobot, Dictionary <uint, RobotAnimation> DicRobot)
        {
            PolygonCollisionResult FinalCollisionResult = new PolygonCollisionResult(Vector2.Zero, -1);

            foreach (KeyValuePair <uint, RobotAnimation> EnemyRobot in DicRobot)
            {
                if (ActiveRobot == EnemyRobot.Value)
                {
                    continue;
                }

                foreach (Polygon ActiveCollision in ActiveRobot.Collision.ListCollisionPolygon)
                {
                    foreach (Polygon EnemyCollision in EnemyRobot.Value.Collision.ListCollisionPolygon)
                    {
                        PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(ActiveCollision, EnemyCollision, ActiveRobot.Speed);

                        if (FinalCollisionResult.Distance < 0 || (CollisionResult.Distance >= 0 && CollisionResult.Distance < FinalCollisionResult.Distance))
                        {
                            FinalCollisionResult = CollisionResult;
                        }
                    }
                }
            }
            Vector2 FinalMovement;

            if (FinalCollisionResult.Distance >= 0)
            {
                Vector2 MovementCorection = FinalCollisionResult.Axis * FinalCollisionResult.Distance;
                FinalMovement = ActiveRobot.Speed + MovementCorection;
            }
            else
            {
                FinalMovement = ActiveRobot.Speed;
            }
            ActiveRobot.Move(FinalMovement);
        }
Esempio n. 18
0
        private void CheckForWeaponDrop()
        {
            foreach (WeaponDrop ActiveWeaponDrop in CurrentLayer.DicWeaponDrop.Values)
            {
                if (!ActiveWeaponDrop.IsAlive || ActiveWeaponDrop.TimeAlive <= 1)
                {
                    return;
                }

                PolygonCollisionResult FinalCollisionResult = new PolygonCollisionResult(Vector2.Zero, -1);

                foreach (Polygon ActiveCollision in Collision.ListCollisionPolygon)
                {
                    foreach (Polygon EnemyCollision in ActiveWeaponDrop.Collision.ListCollisionPolygon)
                    {
                        PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(ActiveCollision, EnemyCollision, Speed);

                        if (FinalCollisionResult.Distance < 0 || (CollisionResult.Distance >= 0 && CollisionResult.Distance < FinalCollisionResult.Distance))
                        {
                            FinalCollisionResult = CollisionResult;
                        }
                    }
                }

                if (FinalCollisionResult.Distance >= 0)
                {
                    if (PrimaryWeapons.HolsteredWeaponsCount == 0)
                    {
                        ReplacePrimaryWeapon(ActiveWeaponDrop.WeaponName);
                        ActiveWeaponDrop.IsAlive = false;
                        CurrentLayer.RemoveDroppedWeapon(ActiveWeaponDrop);
                        return;
                    }
                }
            }
        }
Esempio n. 19
0
        /*public void UpdatePosition(Polygon[] polygons, int numFood)
         * {
         *  double foodDist = 0;
         *  double leftTrack;
         *  double rightTrack;
         *  double curSpeed;
         *
         *
         *
         *  myFood = myWorld.FindClosestFood(x, y, ref foodDist, ref indMyFood, myFoodCollected);
         *  double[] input = new double[4];
         *  input[0] = Math.Cos(dir);   //could be sin also; doesn't matter aslong as its between 0 and 1
         *  input[1] = Math.Cos(dir);
         *  input[2] = (myFood.X - x) / foodDist;   //let the ant know about nearest food
         *  input[3] = (myFood.Y - y) / foodDist;   //same
         *  double[] output = net.FeedData(input);  //feed input into network and get output
         *  leftTrack = output[0];
         *  rightTrack = output[1];
         *  dir += (rightTrack - leftTrack) * (Cosmos.maxForce / 100);   //find the direction
         *  curSpeed = (rightTrack + leftTrack) / 2;
         *  x += Math.Sin(dir) * antMaxSpeed * curSpeed / 10;       //max speed is just a twaking parameter; don't get confused by it
         *  y -= Math.Cos(dir) * antMaxSpeed * curSpeed / 10;       //try varying it in simulation
         *
         *  Vector2 velocity = new Vector2((float)x, (float)y);
         *
         *  int tx, ty, lx, ly, rx, ry;
         *  tx = (int)(Ants.AntTopX * Math.Cos(dir) - Ants.AntTopY * Math.Sin(dir) + x);
         *  ty = (int)(Ants.AntTopY * Math.Cos(dir) + Ants.AntTopX * Math.Sin(dir) + y);
         *  lx = (int)(Ants.AntLeftX * Math.Cos(dir) - Ants.AntLeftY * Math.Sin(dir) + x);
         *  ly = (int)(Ants.AntLeftY * Math.Cos(dir) + Ants.AntLeftX * Math.Sin(dir) + y);
         *  rx = (int)(Ants.AntRightX * Math.Cos(dir) - Ants.AntRightY * Math.Sin(dir) + x);
         *  ry = (int)(Ants.AntRightY * Math.Cos(dir) + Ants.AntRightX * Math.Sin(dir) + y);
         *  //g.FillPolygon(Cosmos.whiteBrush, new Point[] { new Point(tx, ty), new Point(lx, ly), new Point(rx, ry) });
         *
         *  Polygon agent = new Polygon();
         *  agent.Points.Add(new Vector2(tx, ty));
         *  agent.Points.Add(new Vector2(lx, ly));
         *  agent.Points.Add(new Vector2(rx, ry));
         *  agent.BuildEdges();
         *  Vector2 playerTranslation = velocity;
         *
         *  for (int m = 0; m < polygons.Length; m++)
         *  {
         *      PolygonCollisionResult r = PolygonCollision(agent, polygons[m], velocity);
         *
         *      if (r.WillIntersect)
         *      {
         *          playerTranslation = velocity + r.MinimumTranslationVector;
         *          x = x + playerTranslation.X/2;
         *          y = y + playerTranslation.Y/2;
         *
         *          // y = y + playerTranslation.Y;
         *          break;
         *      }
         *  }
         *
         *
         *  Vector2 finish = new Vector2();
         *
         *  if (agentType != null && agentType.Equals("calm"))
         *  {
         *      finish = new Vector2(finishPosition.X, finishPosition.Y);
         *      Vector2 target = new Vector2(myFood.X,myFood.Y);
         *      Vector2 current = new Vector2((float)x,(float)y);
         *      Vector2 steerForce = SteeringBehaviours.Seek(ref target,ref current , ref velocity, 10);
         *      steerForce = Vector2.Truncate(steerForce, 10);
         *      Random random = new Random();
         *      Vector2 acceleration = steerForce / (random.Next(20, 80));
         *      velocity = Vector2.Truncate(velocity + acceleration,10);
         *      finish = Vector2.Add(velocity, finish);
         *      finishPosition = new PointF((float)finish.X, (float)finish.Y);
         *  }
         *  else
         *  finishPosition = new PointF((float)x + finishPosition.X, (float)y + finishPosition.Y);
         *
         *
         *
         *  if (x < 0)
         *      x = clientSize.Width;
         *  if (x > clientSize.Width)
         *      x = 0;
         *  if (y < 0)
         *      y = clientSize.Height;
         *  if (y > clientSize.Height)
         *      y = 0;
         *
         *
         *
         *  if ((myFood.X >= (x - Cosmos.foodTolerance)) &&
         *      (myFood.X <= (x + Cosmos.foodTolerance)) &&
         *      (myFood.Y >= (y - Cosmos.foodTolerance)) &&
         *      (myFood.Y <= (y + Cosmos.foodTolerance)))
         *  {
         *      if (myFoodCollected[indMyFood] != 1)
         *      {
         *          foodCollected++;
         *          myFoodCollected[indMyFood] = 1;
         *      }
         *
         *      // agent disappears when they have reached the total number of goals
         *      if(foodCollected == numFood)
         *          invisible = true;
         *      myWorld.NewFood(indMyFood);
         *  }
         * } */



        public void UpdatePosition(Polygon[] polygons, int numFood)
        {
            double foodDist = 0;
            double leftTrack;
            double rightTrack;
            double curSpeed;

            myFood = myWorld.FindClosestFood(x, y, ref foodDist, ref indMyFood, myFoodCollected);



            double[] input = new double[4];
            input[0] = Math.Cos(dir);              //could be sin also; doesn't matter aslong as its between 0 and 1
            input[1] = Math.Cos(dir);
            input[2] = (myFood.X - x) / foodDist;  //let the ant know about nearest food
            input[3] = (myFood.Y - y) / foodDist;  //same
            double[] output = net.FeedData(input); //feed input into network and get output
            leftTrack  = output[0];
            rightTrack = output[1];
            double olddir = dir;

            dir     += (rightTrack - leftTrack) * (Cosmos.maxForce / 100); //find the direction
            curSpeed = (rightTrack + leftTrack) / 2;
            x       += Math.Sin(dir) * antMaxSpeed * curSpeed / 10;        //max speed is just a twaking parameter; don't get confused by it
            y       -= Math.Cos(dir) * antMaxSpeed * curSpeed / 10;        //try varying it in simulation
            //      finishPosition = new PointF((float)x + finishPosition.X, (float)y + finishPosition.Y);


            if (((x - 15) <= 5) || ((x + 15) >= 1090))
            {
                if ((x - 15) <= 5)
                {
                    x += 15;
                }
                else
                {
                    x -= 15;
                }
            }


            if (((y - 15) <= 5) || ((y + 15) >= 667))
            {
                if ((y - 15) <= 5)
                {
                    y += 15;
                }
                else
                {
                    y -= 15;
                }
            }

            Vector2 targetPosition  = new Vector2(myFood);
            Vector2 currentPosition = new Vector2((float)x, (float)y);
            Vector2 desired_V       = Vector2.Normalize(Vector2.Subtract(targetPosition, currentPosition)) * (int)antMaxSpeed;
            Vector2 velocity        = new Vector2(1, 1);
            Vector2 steerForce      = Vector2.Subtract(desired_V, velocity);

            steerForce = Vector2.Truncate(steerForce, (int)Cosmos.maxForce);
            float   mass         = 21;
            Vector2 acceleration = steerForce / mass;

            velocity        = Vector2.Truncate(velocity + acceleration, (int)antMaxSpeed);
            currentPosition = Vector2.Add(velocity, currentPosition);
            finishPosition  = new PointF((float)currentPosition.X + finishPosition.X, (float)currentPosition.Y + finishPosition.Y);
            x = (float)currentPosition.X;
            y = (float)currentPosition.Y;

            int tx, ty, lx, ly, rx, ry;

            tx = (int)(Ants.AntTopX * Math.Cos(dir) - Ants.AntTopY * Math.Sin(dir) + x);
            ty = (int)(Ants.AntTopY * Math.Cos(dir) + Ants.AntTopX * Math.Sin(dir) + y);
            lx = (int)(Ants.AntLeftX * Math.Cos(dir) - Ants.AntLeftY * Math.Sin(dir) + x);
            ly = (int)(Ants.AntLeftY * Math.Cos(dir) + Ants.AntLeftX * Math.Sin(dir) + y);
            rx = (int)(Ants.AntRightX * Math.Cos(dir) - Ants.AntRightY * Math.Sin(dir) + x);
            ry = (int)(Ants.AntRightY * Math.Cos(dir) + Ants.AntRightX * Math.Sin(dir) + y);
            Polygon agent = new Polygon();

            agent.Points.Add(new Vector2(tx, ty));
            agent.Points.Add(new Vector2(lx, ly));
            agent.Points.Add(new Vector2(rx, ry));
            agent.BuildEdges();
            Vector2 playerTranslation = velocity;

            for (int m = 0; m < polygons.Length; m++)
            {
                if ((rx + 270) >= polygons[m].Points[3].X)
                {
                    PolygonCollisionResult r = PolygonCollision(agent, polygons[m], velocity);

                    if (r.WillIntersect)
                    {
                        playerTranslation = velocity + r.MinimumTranslationVector;
                        x = x + playerTranslation.X / 2;
                        y = y + playerTranslation.Y / 2;

                        dir = olddir;
                        // y = y + playerTranslation.Y;
                        break;
                    }
                }
            }

            /*for (int m = 0; m < polygons.Length; m++)
             * {
             * RectangleF rf = new RectangleF(polygons[m].Points[0].X,polygons[m].Points[0].Y, Math.Abs(polygons[m].Points[1].X - polygons[m].Points[0].X),Math.Abs(polygons[m].Points[2].Y - polygons[m].Points[1].Y));
             *
             * if(IsIntersected(new PointF((float)x + finishPosition.X, (float)y + finishPosition.Y),(float)6, rf))
             * {
             *   // playerTranslation = velocity + r.MinimumTranslationVector;
             *    //x = x + playerTranslation.X / 2;
             *    //y = y + playerTranslation.Y / 2;
             *     x = x + 50;
             *     y = y + 50;
             *
             *    // y = y + playerTranslation.Y;
             *    break;
             * }
             * } */


            //finishPosition = new PointF((float)x + finishPosition.X, (float)y + finishPosition.Y);
            if (x < 0)
            {
                x = clientSize.Width;
            }
            if (x > clientSize.Width)
            {
                x = 0;
            }
            if (y < 0)
            {
                y = clientSize.Height;
            }
            if (y > clientSize.Height)
            {
                y = 0;
            }


            if ((myFood.X >= (x - Cosmos.foodTolerance)) &&
                (myFood.X <= (x + Cosmos.foodTolerance)) &&
                (myFood.Y >= (y - Cosmos.foodTolerance)) &&
                (myFood.Y <= (y + Cosmos.foodTolerance)))
            {
                foodCollected++;

                invisible = true;
                //myWorld.NewFood(indMyFood);
            }
        }
Esempio n. 20
0
        // Check if polygon A is going to collide with polygon B for the given velocity
        public PolygonCollisionResult PolygonCollision(Polygon polygonA, Polygon polygonB, Vector2 velocity)
        {
            PolygonCollisionResult result = new PolygonCollisionResult();

            result.Intersect     = true;
            result.WillIntersect = true;

            int     edgeCountA          = polygonA.Edges.Count;
            int     edgeCountB          = polygonB.Edges.Count;
            float   minIntervalDistance = float.PositiveInfinity;
            Vector2 translationAxis     = new Vector2();
            Vector2 edge;

            // Loop through all the edges of both polygons
            for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++)
            {
                if (edgeIndex < edgeCountA)
                {
                    edge = polygonA.Edges[edgeIndex];
                }
                else
                {
                    edge = polygonB.Edges[edgeIndex - edgeCountA];
                }

                // ===== 1. Find if the polygons are currently intersecting =====

                // Find the axis perpendicular to the current edge
                Vector2 axis = new Vector2(-edge.Y + -25, edge.X + -10);
                axis.Normalize();

                // Find the projection of the polygon on the current axis
                float minA = 0; float minB = 0; float maxA = 0; float maxB = 0;
                ProjectPolygon(axis, polygonA, ref minA, ref maxA);
                ProjectPolygon(axis, polygonB, ref minB, ref maxB);

                // Check if the polygon projections are currentlty intersecting
                if (IntervalDistance(minA, maxA, minB, maxB) > 0)
                {
                    result.Intersect = false;
                }

                // ===== 2. Now find if the polygons *will* intersect =====

                // Project the velocity on the current axis
                float velocityProjection = axis.DotProduct(velocity);

                // Get the projection of polygon A during the movement
                if (velocityProjection < 0)
                {
                    minA += velocityProjection;
                }
                else
                {
                    maxA += velocityProjection;
                }

                // Do the same test as above for the new projection
                float intervalDistance   = IntervalDistance(minA, maxA, minB, maxB);
                if (intervalDistance > 0)
                {
                    result.WillIntersect = false;
                }

                // If the polygons are not intersecting and won't intersect, exit the loop
                if (!result.Intersect && !result.WillIntersect)
                {
                    break;
                }

                // Check if the current interval distance is the minimum one. If so store
                // the interval distance and the current distance.
                // This will be used to calculate the minimum translation vector
                intervalDistance = Math.Abs(intervalDistance);
                if (intervalDistance < minIntervalDistance)
                {
                    minIntervalDistance = intervalDistance;
                    translationAxis     = axis;

                    Vector2 d = polygonA.Center - polygonB.Center;
                    if (d.DotProduct(translationAxis) < 0)
                    {
                        translationAxis = -translationAxis;
                    }
                }
            }

            // The minimum translation vector can be used to push the polygons appart.
            // First moves the polygons by their velocity
            // then move polygonA by MinimumTranslationVector.
            if (result.WillIntersect)
            {
                result.MinimumTranslationVector = translationAxis * 3 * minIntervalDistance;
            }

            return(result);
        }
Esempio n. 21
0
 public void onCollision(GameTime gameTime, PolygonCollisionResult collisionResult, Vector2 player1Velocity)
 {
     foreach (Menu gameMenu in gameMenus)
     {
         gameMenu.onCollision(gameTime, collisionResult, player1Velocity);
     }
 }
Esempio n. 22
0
        public bool IsIntersecting(Polygon p)
        {
            PolygonCollisionResult polygonCollisionResult = PolygonCollision(this, p);

            return(polygonCollisionResult.Intersect);
        }
Esempio n. 23
0
        private static void iterate(SvgElementCollection elementCollection1, SvgElementCollection elementCollection2)
        {
            foreach (SvgElement outerElement in elementCollection1)
            {
                if (outerElement.Children.Count != 0) iterate(outerElement.Children, elementCollection2);
                foreach (SvgElement innerElement in elementCollection2)
                {
                    if (innerElement.Children.Count != 0) iterate(outerElement.Children, innerElement.Children);
                    {
                        if (innerElement is SvgVisualElement && outerElement is SvgVisualElement && outerElement != innerElement && !isParent(innerElement, outerElement))
                        {
                            PolygonCollisionResult r = new PolygonCollisionResult();
                            try
                            {
                                if (_minimumArea != 0)
                                {
                                    if (((SvgVisualElement)outerElement).PathOuterArea.Value < _minimumArea) break;
                                    if (((SvgVisualElement)innerElement).PathOuterArea.Value < _minimumArea) break;
                                }
                                if (outerElement is SvgCircle) ((SvgCircle)outerElement).Path.Flatten();
                                if (outerElement is SvgEllipse) ((SvgEllipse)outerElement).Path.Flatten();
                                if (innerElement is SvgCircle) ((SvgCircle)innerElement).Path.Flatten();
                                if (innerElement is SvgEllipse) ((SvgEllipse)innerElement).Path.Flatten();
                                PointF[] ptsA = ((SvgVisualElement)outerElement).Path.PathPoints;
                                PointF[] ptsB = ((SvgVisualElement)innerElement).Path.PathPoints;

                                switch (_colCheckType)
                                {
                                    case collisionCheckType.LineCollision:
                                        r = LineIntersection.PolygonCollision(ptsA, ptsB);
                                        break;
                                    case collisionCheckType.SeparatingAxisTheorem:
                                        r = SeparatingAxisTheorem.PolygonCollision(ptsA, ptsB, _velocity);
                                        break;
                                    case collisionCheckType.Mixed:
                                        r = SeparatingAxisTheorem.PolygonCollision(ptsA, ptsB, _velocity);
                                        if (r.IsIntersecting)
                                        {
                                            PolygonCollisionResult t = LineIntersection.PolygonCollision( ptsA, ptsB);
                                            r.rayCastingResult = LineIntersection.RayCasting(ptsA, ptsB);
                                            r.OnPath = t.OnPath;
                                            r.LineIntersectingPoints = t.LineIntersectingPoints;
                                        }
                                        break;
                                }
                            }
                            catch { }

                            if (r.IsIntersecting == true || r.WillIntersect == true)
                            {
                                r.collidor = outerElement.ID ?? "-";
                                r.collidee = innerElement.ID ?? "-";
                                _collisionResultList.Add(r);
                            }
                        }
                    }
                }
            }
        }
Esempio n. 24
0
 public abstract void OnCollision(PolygonCollisionResult FinalCollisionResult, Polygon FinalCollisionPolygon, out Vector2 CollisionPoint);
Esempio n. 25
0
        /*
        public Camera getCameraInGame()
        {
            Vector2 playerPos = this.Properties.getProperty<Vector2>("Position");

            return new Camera(Matrix.Identity, new Vector2(Renderer.getInstance.getScreenCenter().X - playerPos.X,
                            Renderer.getInstance.getScreenCenter().Y - playerPos.Y));
        }
        */
        public void onCollision(GameTime gameTime, PolygonCollisionResult collisionResult, Vector2 velocity)
        {
            Vector2 position = Properties.getProperty<Vector2>("Position");
            bool hasCollided = Properties.getProperty<bool>("HasCollided");
            List<AABB> axisAlignedBoxes = Properties.getProperty<List<AABB>>("AABB");
            List<Polygon> polygons = Properties.getProperty<List<Polygon>>("Polygon");
            List<Animation> animations = Properties.getProperty<List<Animation>>("Animations");
            float drawDepth = Properties.getProperty<float>("DrawDepth");
            float depthPosition = Properties.getProperty<float>("DepthPosition");

            hasCollided = true;

            velocity = velocity / 2;

            velocity = velocity * (float)gameTime.ElapsedGameTime.TotalSeconds + collisionResult.MinimumTranslationVector;
            position += velocity;

            Vector2 shadowPos = new Vector2(position.X - 11, position.Y - 8);
            SceneManager.getInstance.getPlayer1Shadow().Properties.updateProperty<Vector2>("Position", shadowPos);

            foreach (Polygon polygon in polygons)
            {
                polygon.offset(velocity);
                polygon.buildEdges();
            }

            depthPosition += velocity.Y;
            drawDepth = depthPosition / (SceneManager.getInstance.getAxisAlignedBox().getPosition().Y + SceneManager.getInstance.getAxisAlignedBox().getHeight());

            Properties.updateProperty<Vector2>("Position", position);
            Properties.updateProperty<bool>("HasCollided", hasCollided);
            Properties.updateProperty<List<AABB>>("AABB", axisAlignedBoxes);
            Properties.updateProperty<List<Polygon>>("Polygon", polygons);
            Properties.updateProperty<float>("DrawDepth", drawDepth);
            Properties.updateProperty<float>("DepthPosition", depthPosition);
            Properties.updateProperty<List<Animation>>("Animations", animations);
        }
Esempio n. 26
0
        public override void OnCollision(PolygonCollisionResult FinalCollisionResult, Polygon FinalCollisionPolygon, out Vector2 CollisionPoint)
        {
            float   MinDistance         = float.MaxValue;
            Vector2 FinalCollisionPoint = Collision.ListCollisionPolygon[0].ArrayVertex[2];

            for (int I = 0; I < FinalCollisionPolygon.ArrayIndex.Length; I += 3)
            {
                Vector2 Vertex1 = FinalCollisionPolygon.ArrayVertex[FinalCollisionPolygon.ArrayIndex[I]];
                Vector2 Vertex2 = FinalCollisionPolygon.ArrayVertex[FinalCollisionPolygon.ArrayIndex[I + 1]];
                Vector2 Vertex3 = FinalCollisionPolygon.ArrayVertex[FinalCollisionPolygon.ArrayIndex[I + 2]];

                CollisionPoint = Vector2.Zero;

                if (Polygon.DoLinesIntersect(
                        Collision.ListCollisionPolygon[0].ArrayVertex[0],
                        Collision.ListCollisionPolygon[0].ArrayVertex[2] + Speed,
                        Vertex1,
                        Vertex2,
                        ref CollisionPoint))
                {
                    float DistanceToPoint = (Collision.ListCollisionPolygon[0].ArrayVertex[0] - CollisionPoint).Length();

                    if (DistanceToPoint < MinDistance)
                    {
                        MinDistance         = DistanceToPoint;
                        FinalCollisionPoint = CollisionPoint;
                    }
                }

                if (Polygon.DoLinesIntersect(
                        Collision.ListCollisionPolygon[0].ArrayVertex[0],
                        Collision.ListCollisionPolygon[0].ArrayVertex[2] + Speed,
                        Vertex2,
                        Vertex3,
                        ref CollisionPoint))
                {
                    float DistanceToPoint = (Collision.ListCollisionPolygon[0].ArrayVertex[0] - CollisionPoint).Length();

                    if (DistanceToPoint < MinDistance)
                    {
                        MinDistance         = DistanceToPoint;
                        FinalCollisionPoint = CollisionPoint;
                    }
                }

                if (Polygon.DoLinesIntersect(
                        Collision.ListCollisionPolygon[0].ArrayVertex[0],
                        Collision.ListCollisionPolygon[0].ArrayVertex[2] + Speed,
                        Vertex3,
                        Vertex1,
                        ref CollisionPoint))
                {
                    float DistanceToPoint = (Collision.ListCollisionPolygon[0].ArrayVertex[0] - CollisionPoint).Length();

                    if (DistanceToPoint < MinDistance)
                    {
                        MinDistance         = DistanceToPoint;
                        FinalCollisionPoint = CollisionPoint;
                    }
                }
            }

            Vector2 MovementCorection = FinalCollisionResult.Axis * FinalCollisionResult.Distance;
            Vector2 FinalMovement     = Speed + MovementCorection;

            CollisionPoint = Polygon.GetCollisionPointFromLine(Collision.ListCollisionPolygon[0].ArrayVertex[0], Collision.ListCollisionPolygon[0].ArrayVertex[2], Speed, FinalCollisionPolygon, out _);

            FinalizeCollision(FinalMovement, FinalCollisionPoint);
        }
Esempio n. 27
0
 public override void OnCollision(PolygonCollisionResult FinalCollisionResult, Polygon FinalCollisionPolygon, out Vector2 CollisionPoint)
 {
     throw new NotImplementedException();
 }
Esempio n. 28
0
 private void OnCollision(Player Other, PolygonCollisionResult FinalCollisionResult, Polygon FinalBombPolygon, Polygon FinalPlayerPolygon)
 {
 }
Esempio n. 29
0
        // Check if polygon A is going to collide with polygon B for the given velocity
        public PolygonCollisionResult PolygonCollision(PolygonMath polygonB, Vector velocity)
        {
            PolygonCollisionResult result = new PolygonCollisionResult();
            result.Intersect = true;
            result.WillIntersect = true;

            PolygonMath polygonA = this;

            //build edges
            if (polygonA.Edges.Count == 0)
                polygonA.BuildEdges();
            if (polygonB.Edges.Count == 0)
                polygonB.BuildEdges();

            int edgeCountA = polygonA.Edges.Count;
            int edgeCountB = polygonB.Edges.Count;
            double minIntervalDistance = double.PositiveInfinity;
            Vector translationAxis = new Vector();
            Vector edge;

            // Loop through all the edges of both polygons
            for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++)
            {
                if (edgeIndex < edgeCountA)
                {
                    edge = polygonA.Edges[edgeIndex];
                }
                else
                {
                    edge = polygonB.Edges[edgeIndex - edgeCountA];
                }

                // ===== 1. Find if the polygons are currently intersecting =====

                // Find the axis perpendicular to the current edge
                Vector axis = new Vector(-edge.Y, edge.X);
                axis.Normalize();

                // Find the projection of the polygon on the current axis
                double minA = 0; double minB = 0; double maxA = 0; double maxB = 0;
                ProjectPolygon(axis, polygonA, ref minA, ref maxA);
                ProjectPolygon(axis, polygonB, ref minB, ref maxB);

                // Check if the polygon projections are currentlty intersecting
                if (IntervalDistance(minA, maxA, minB, maxB) > 0) result.Intersect = false;

                // ===== 2. Now find if the polygons *will* intersect =====

                // Project the velocity on the current axis
                double velocityProjection = axis.DotProduct(velocity);

                // Get the projection of polygon A during the movement
                if (velocityProjection < 0)
                {
                    minA += velocityProjection;
                }
                else
                {
                    maxA += velocityProjection;
                }

                // Do the same test as above for the new projection
                double intervalDistance = IntervalDistance(minA, maxA, minB, maxB);
                if (intervalDistance > 0) result.WillIntersect = false;

                // If the polygons are not intersecting and won't intersect, exit the loop
                if (!result.Intersect && !result.WillIntersect) break;

                // Check if the current interval distance is the minimum one. If so store
                // the interval distance and the current distance.
                // This will be used to calculate the minimum translation vector
                intervalDistance = Math.Abs(intervalDistance);
                if (intervalDistance < minIntervalDistance)
                {
                    minIntervalDistance = intervalDistance;
                    translationAxis = axis;

                    Vector d = polygonA.Center - polygonB.Center;
                    if (d.DotProduct(translationAxis) < 0) translationAxis = -translationAxis;
                }
            }

            // The minimum translation vector can be used to push the polygons appart.
            // First moves the polygons by their velocity
            // then move polygonA by MinimumTranslationVector.
            if (result.WillIntersect) result.MinimumTranslationVector = translationAxis * minIntervalDistance;

            if (result.Intersect)
            {
                //asa
            }
            return result;
        }
Esempio n. 30
0
        private void OnCollision(WorldObject Other, PolygonCollisionResult FinalCollisionResult, Polygon FinalBombPolygon, Polygon FinalWorldPolygon)
        {
            float   DirectionAngle            = (float)Math.Atan2(Speed.Y, Speed.X);
            float   WallMinAngle              = DirectionAngle - MathHelper.PiOver4;
            float   WallMaxAngle              = DirectionAngle + MathHelper.PiOver4;
            Vector2 WallAxis                  = new Vector2(-FinalCollisionResult.Axis.Y, FinalCollisionResult.Axis.X);
            double  FinalCollisionResultAngle = Math.Atan2(WallAxis.X, WallAxis.Y);

            Vector2 MovementCorection = FinalCollisionResult.Axis * FinalCollisionResult.Distance;
            Vector2 FinalMovement     = Speed + MovementCorection;

            //Ground detection
            if (FinalCollisionResultAngle >= WallMinAngle && FinalCollisionResultAngle <= WallMaxAngle)
            {
                Speed.X = 0;
                Speed.Y = 0;

                Move(FinalMovement);
            }
            //Slope
            else
            {
                if (FinalWorldPolygon.PolygonCollisionPerTriangle(ForwardLeftVector.X + FinalMovement.X, ForwardLeftVector.Y + FinalMovement.Y))
                {
                    Vector2 PerpendicularAxis = BackLeftVector - ForwardLeftVector;
                    PerpendicularAxis = new Vector2(-PerpendicularAxis.Y, PerpendicularAxis.X);
                    PerpendicularAxis.Normalize();

                    Vector2 CollisionLineAxis;
                    Vector2 LeftCollisionPoint = Polygon.GetCollisionPointFromLine(BackLeftVector, ForwardLeftVector, Speed, FinalWorldPolygon, out CollisionLineAxis);
                    Move(LeftCollisionPoint - ForwardLeftVector);

                    //Collision on the left, the collision axis should divert to the right
                    if (Vector2.Dot(PerpendicularAxis, CollisionLineAxis) < 0)
                    {
                        double  WallAngle             = Math.Atan2(CollisionLineAxis.Y, CollisionLineAxis.X);
                        Vector2 WallPerpendicularAxis = new Vector2(-CollisionLineAxis.Y, CollisionLineAxis.X);
                        WallPerpendicularAxis.Normalize();
                        double  WallPerpendicularAngle         = Math.Atan2(WallPerpendicularAxis.Y, WallPerpendicularAxis.X);
                        Vector2 NewExplosionForwardLeftVector  = ForwardLeftVector;
                        Vector2 NewExplosionForwardRightVector = NewExplosionForwardLeftVector + new Vector2((float)Math.Cos(WallPerpendicularAngle) * Size, (float)Math.Sin(WallPerpendicularAngle) * Size);

                        SimpleLinearExplosion FollowingExplosion = new SimpleLinearExplosion(Owner, NewExplosionForwardLeftVector + (NewExplosionForwardRightVector - NewExplosionForwardLeftVector) / 2,
                                                                                             new Vector2((float)Math.Cos(WallAngle) * 3, (float)Math.Sin(WallAngle) * 3));

                        Owner.Add(FollowingExplosion);
                    }
                }
                else if (FinalWorldPolygon.PolygonCollisionPerTriangle(ForwardRightVector.X + FinalMovement.X, ForwardRightVector.Y + FinalMovement.Y))
                {
                    Vector2 PerpendicularAxis = BackRightVector - ForwardRightVector;
                    PerpendicularAxis = new Vector2(-PerpendicularAxis.Y, PerpendicularAxis.X);
                    PerpendicularAxis.Normalize();

                    Vector2 CollisionLineAxis;
                    Vector2 RightCollisionPoint = Polygon.GetCollisionPointFromLine(BackRightVector, ForwardRightVector, Speed, FinalWorldPolygon, out CollisionLineAxis);
                    Move(RightCollisionPoint - ForwardRightVector);

                    //Collision on the right, the collision axis should divert to the left
                    if (Vector2.Dot(PerpendicularAxis, CollisionLineAxis) < 0)
                    {
                    }
                }
                else
                {
                    //Will happen if the collision is on a corner, consider it as a wall.
                }
            }
        }
        public static PolygonCollisionResult PolygonCollision(Polygon a, Polygon b, Vector velocity)
        {
            PolygonCollisionResult result = new PolygonCollisionResult();

            result.WillIntersect = true;
            result.Intersect     = true;

            int    edgeCountA          = a.Edges.Count;
            int    edgeCountB          = b.Edges.Count;
            double minIntervalDistance = double.PositiveInfinity;
            Vector traslationAxis      = new Vector();
            Vector edge;

            for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++)
            {
                if (edgeIndex < edgeCountA)
                {
                    edge = a.Edges[edgeIndex];
                }
                else
                {
                    edge = b.Edges[edgeIndex - edgeCountA];
                }

                Vector axis = edge.PerpendicularVector2D();
                axis = axis.Unit;

                double minA = 0;
                double maxA = 0;
                double minB = 0;
                double maxB = 0;

                ProjectPolygon(axis, a, ref minA, ref maxA);
                ProjectPolygon(axis, b, ref minB, ref maxB);

                if (IntervalDisance(minA, maxA, minB, maxB) > 0)
                {
                    result.Intersect = false;
                }

                double velosityProjection = axis.DotProduct(velocity);

                if (velosityProjection < 0)
                {
                    minA += velosityProjection;
                }
                else
                {
                    maxA += velosityProjection;
                }

                double intervalDistance = IntervalDisance(minA, maxA, minB, maxB);
                if (intervalDistance > 0)
                {
                    result.WillIntersect = false;
                }

                if (!result.Intersect && !result.WillIntersect)
                {
                    break;
                }

                intervalDistance = Math.Abs(intervalDistance);
                if (intervalDistance < minIntervalDistance)
                {
                    minIntervalDistance = intervalDistance;
                    traslationAxis      = axis;

                    Point d = a.Centroid - b.Centroid;
                    if (d.ToVector().DotProduct(traslationAxis) < 0)
                    {
                        traslationAxis = traslationAxis * -1;
                    }
                }
            }

            if (result.WillIntersect)
            {
                result.MinimumTranslationVector = traslationAxis * minIntervalDistance;
            }

            return(result);
        }
        public override void OnFloorCollision(List <Tuple <PolygonCollisionResult, Polygon> > ListFloorCollidingPolygon)
        {
            //Jumping
            if (IsJumping)
            {
                Vector2 MovementCorection = Vector2.Zero;
                foreach (Tuple <PolygonCollisionResult, Polygon> FinalCollisionResult in ListFloorCollidingPolygon)
                {
                    MovementCorection += FinalCollisionResult.Item1.Axis * FinalCollisionResult.Item1.Distance;
                }

                Vector2 FinalMovement = Owner.Speed + MovementCorection;

                Owner.Move(FinalMovement);
                return;
            }

            Owner.Land();

            if (Owner.IsInAir)
            {
                Owner.PlayerSFXGenerator.PlayLandSound();
            }

            bool NeedToMoveUp = true;
            bool HasMovedUp   = false;
            bool HasCollided  = false;

            while (NeedToMoveUp)
            {
                foreach (CollisionPolygon ActivePlayerCollisionPolygon in Owner.ListCollisionPolygon)
                {
                    if (ActivePlayerCollisionPolygon.IsDead || !NeedToMoveUp)
                    {
                        continue;
                    }

                    foreach (Tuple <PolygonCollisionResult, Polygon> FinalCollisionResult in ListFloorCollidingPolygon)
                    {
                        Vector2 GroundAxis = new Vector2(-FinalCollisionResult.Item1.Axis.Y, FinalCollisionResult.Item1.Axis.X);

                        Owner.NormalizedGroundVector = GroundAxis;
                        Owner.NormalizedPerpendicularGroundVector = FinalCollisionResult.Item1.Axis;

                        PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(ActivePlayerCollisionPolygon.ActivePolygon, FinalCollisionResult.Item2, Vector2.Zero, Vector2.Zero);

                        if (CollisionResult.Distance >= 0)
                        {
                            Owner.Move(-FightingZone.GravityVector);
                            HasMovedUp = true;
                            continue;
                        }
                        else
                        {
                            NeedToMoveUp = false;
                        }
                    }
                }
            }

            if (!HasMovedUp)
            {
                float MaxRetry = Vector2.Dot(Owner.Speed, Owner.GravityVector);
                while (!HasCollided && MaxRetry > 0)
                {
                    --MaxRetry;

                    bool NeedToMoveDown = true;
                    foreach (Tuple <PolygonCollisionResult, Polygon> FinalCollisionResult in ListFloorCollidingPolygon)
                    {
                        foreach (CollisionPolygon ActivePlayerCollisionPolygon in Owner.ListCollisionPolygon)
                        {
                            if (ActivePlayerCollisionPolygon.IsDead)
                            {
                                continue;
                            }

                            PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(ActivePlayerCollisionPolygon.ActivePolygon, FinalCollisionResult.Item2, Owner.GravityVector);

                            if (CollisionResult.Distance >= 0)
                            {
                                NeedToMoveDown = false;
                                break;
                            }
                        }
                    }

                    if (NeedToMoveDown)
                    {
                        Owner.Move(FightingZone.GravityVector);
                    }
                    else
                    {
                        HasCollided = true;
                    }
                }
            }

            Vector2 VerticalSpeedCancelVector = Owner.Speed * -Owner.GravityVector;

            Owner.Move(Owner.Speed + VerticalSpeedCancelVector);

            Owner.Speed = Owner.Speed + VerticalSpeedCancelVector + Owner.GravityVector;
        }
Esempio n. 33
0
        // Check if polygon A is going to collide with polygon B for the given velocity
        public static PolygonCollisionResult CheckCollision(FixPolygon polygonA, FixPolygon polygonB, FixVec2 velocity)
        {
            var result = new PolygonCollisionResult {
                Intersect = true, WillIntersect = true
            };

            var edgeCountA          = polygonA.Edges.Length;
            var edgeCountB          = polygonB.Edges.Length;
            var minIntervalDistance = Fix.MaxValue;
            var translationAxis     = new FixVec2();

            // Loop through all the edges of both polygons
            for (var edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++)
            {
                var edge = edgeIndex < edgeCountA ? polygonA.Edges[edgeIndex] : polygonB.Edges[edgeIndex - edgeCountA];

                // ===== 1. Find if the polygons are currently intersecting =====

                // Find the axis perpendicular to the current edge
                var axis = new FixVec2(-edge.Y, edge.X).Normalize();

                // Find the projection of the polygon on the current axis
                Fix minA;
                Fix maxA;
                Fix minB;
                Fix maxB;
                ProjectPolygon(axis, polygonA, out minA, out maxA);
                ProjectPolygon(axis, polygonB, out minB, out maxB);

                // Check if the polygon projections are currently intersecting
                if (IntervalDistance(minA, maxA, minB, maxB) > 0)
                {
                    result.Intersect = false;
                }

                // ===== 2. Now find if the polygons *will* intersect =====

                // Project the velocity on the current axis
                var velocityProjection = axis.Dot(velocity);

                // Get the projection of polygon A during the movement
                if (velocityProjection < 0)
                {
                    minA += velocityProjection;
                }
                else
                {
                    maxA += velocityProjection;
                }

                // Do the same test as above for the new projection
                var intervalDistance = IntervalDistance(minA, maxA, minB, maxB);
                if (intervalDistance > 0)
                {
                    result.WillIntersect = false;
                }

                // If the polygons are not intersecting and won't intersect, exit the loop
                if (!result.Intersect && !result.WillIntersect)
                {
                    break;
                }

                // Check if the current interval distance is the minimum one. If so store
                // the interval distance and the current distance.
                // This will be used to calculate the minimum translation FixVec2
                intervalDistance = FixMath.Abs(intervalDistance);
                if (intervalDistance < minIntervalDistance)
                {
                    minIntervalDistance = intervalDistance;
                    translationAxis     = axis;

                    var d = polygonA.Center - polygonB.Center;
                    if (d.Dot(translationAxis) < 0)
                    {
                        translationAxis = -translationAxis;
                    }
                }
            }

            // The minimum translation FixVec2 can be used to push the polygons apart.
            // First moves the polygons by their velocity
            // then move polygonA by MinimumTranslationVector.
            if (result.WillIntersect)
            {
                result.MinimumTranslationVector = translationAxis * minIntervalDistance;
            }

            return(result);
        }
Esempio n. 34
0
        // Structure that stores the results of the PolygonCollision function

        // Check if polygon A is going to collide with polygon B for the given velocity
        public static PolygonCollisionResult PolygonCollision(Polygon polygonA, Polygon polygonB, Vector2 velocity)
        {
            var result = new PolygonCollisionResult {Intersect = true, WillIntersect = true};

            int edgeCountA = polygonA.Edges.Count;
            int edgeCountB = polygonB.Edges.Count;
            float minIntervalDistance = float.PositiveInfinity;
            var translationAxis = new Vector2();
            Vector2 edge;

            // Loop through all the edges of both polygons
            for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++)
            {
                edge = edgeIndex < edgeCountA ? polygonA.Edges[edgeIndex] : polygonB.Edges[edgeIndex - edgeCountA];

                // ===== 1. Find if the polygons are currently intersecting =====

                // Find the axis perpendicular to the current edge
                var axis = new Vector2(-edge.Y, edge.X);
                axis.Normalize();

                // Find the projection of the polygon on the current axis
                float minA = 0;
                float minB = 0;
                float maxA = 0;
                float maxB = 0;
                ProjectPolygon(axis, polygonA, ref minA, ref maxA);
                ProjectPolygon(axis, polygonB, ref minB, ref maxB);

                // Check if the polygon projections are currentlty intersecting
                if (IntervalDistance(minA, maxA, minB, maxB) > 0) result.Intersect = false;

                // ===== 2. Now find if the polygons *will* intersect =====

                // Project the velocity on the current axis
                float velocityProjection = Vector2.Dot(axis, velocity);

                // Get the projection of polygon A during the movement
                if (velocityProjection < 0)
                {
                    minA += velocityProjection;
                }
                else
                {
                    maxA += velocityProjection;
                }

                // Do the same test as above for the new projection
                float intervalDistance = IntervalDistance(minA, maxA, minB, maxB);
                if (intervalDistance > 0) result.WillIntersect = false;

                // If the polygons are not intersecting and won't intersect, exit the loop
                if (!result.Intersect && !result.WillIntersect) break;

                // Check if the current interval distance is the minimum one. If so store
                // the interval distance and the current distance.
                // This will be used to calculate the minimum translation vector
                intervalDistance = System.Math.Abs(intervalDistance);
                if (intervalDistance < minIntervalDistance)
                {
                    minIntervalDistance = intervalDistance;
                    translationAxis = axis;

                    Vector2 d = polygonA.Center - polygonB.Center;
                    if (Vector2.Dot(d, translationAxis) < 0) translationAxis = -translationAxis;
                }
            }

            // The minimum translation vector can be used to push the polygons appart.
            // First moves the polygons by their velocity
            // then move polygonA by MinimumTranslationVector.
            if (result.WillIntersect) result.MinimumTranslationVector = translationAxis*minIntervalDistance;
            result.IntervalDistance = minIntervalDistance;

            return result;
        }
        public static PolygonCollisionResult PolygonCollision(Polygon a, Polygon b, Vector velocity)
        {
            PolygonCollisionResult result = new PolygonCollisionResult();
            result.WillIntersect = true;
            result.Intersect = true;

            int edgeCountA = a.Edges.Count;
            int edgeCountB = b.Edges.Count;
            double minIntervalDistance = double.PositiveInfinity;
            Vector traslationAxis = new Vector();
            Vector edge;

            for(int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++)
            {
                if(edgeIndex < edgeCountA)
                {
                    edge = a.Edges[edgeIndex];
                }
                else
                {
                    edge = b.Edges[edgeIndex - edgeCountA];
                }

                Vector axis = edge.PerpendicularVector2D();
                axis = axis.Unit;

                double minA = 0;
                double maxA = 0;
                double minB = 0;
                double maxB = 0;

                ProjectPolygon(axis, a, ref minA, ref maxA);
                ProjectPolygon(axis, b, ref minB, ref maxB);

                if (IntervalDisance(minA, maxA, minB, maxB) > 0)
                {
                    result.Intersect = false;
                }

                double velosityProjection = axis.DotProduct(velocity);

                if(velosityProjection < 0)
                {
                    minA += velosityProjection;
                }
                else
                {
                    maxA += velosityProjection;
                }

                double intervalDistance = IntervalDisance(minA, maxA, minB, maxB);
                if(intervalDistance > 0)
                {
                    result.WillIntersect = false;
                }

                if(!result.Intersect && !result.WillIntersect)
                {
                    break;
                }

                intervalDistance = Math.Abs(intervalDistance);
                if(intervalDistance < minIntervalDistance)
                {
                    minIntervalDistance = intervalDistance;
                    traslationAxis = axis;

                    Point d = a.Centroid - b.Centroid;
                    if(d.ToVector().DotProduct(traslationAxis) < 0)
                    {
                        traslationAxis = traslationAxis * -1;
                    }
                }
            }

            if(result.WillIntersect)
            {
                result.MinimumTranslationVector = traslationAxis * minIntervalDistance;
            }

            return result;
        }
Esempio n. 36
0
 public void onCollision(GameTime gameTime, PolygonCollisionResult collisionResult, Vector2 player1Velocity)
 {
     foreach (InventorySlotHud slotHud in slots)
     {
         slotHud.onCollision(gameTime, collisionResult, player1Velocity);
     }
 }
Esempio n. 37
0
        // Check if polygon A is going to collide with polygon B.
        // The last parameter is the *relative* velocity
        // of the polygons (i.e. velocityA - velocityB)
        public static PolygonCollisionResult PolygonCollision(Polygon polygonA,
                                                              Polygon polygonB, Vector velocity)
        {
            PolygonCollisionResult result = new PolygonCollisionResult();

            // If either polygon has no vertices, they do not intersect
            if (polygonA.Points.Count == 0 || polygonB.Points.Count == 0)
            {
                result.Intersect     = false;
                result.WillIntersect = false;
                return(result);
            }

            /*
             * change here to turn off/on collision detection
             * */
            result.Intersect     = true;
            result.WillIntersect = true;

            int    edgeCountA          = polygonA.Points.Count;
            int    edgeCountB          = polygonB.Points.Count;
            int    totalCount          = edgeCountA + edgeCountB;
            float  minIntervalDistance = float.PositiveInfinity;
            Vector translationAxis     = new Vector();
            Vector edge;

            // Loop through all the edges of both polygons
            for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB - 1; edgeIndex++)
            {
                if (edgeIndex < edgeCountA)
                {
                    edge = polygonA.Points[(edgeIndex + 1) % edgeCountA] - polygonA.Points[edgeIndex];
                }
                else
                {
                    int indexB = edgeIndex - edgeCountA;
                    edge = polygonB.Points[(indexB + 1) % edgeCountB] - polygonB.Points[indexB];
                }

                // ===== 1. Find if the polygons are currently intersecting =====

                // Find the axis perpendicular to the current edge
                Vector axis = new Vector(-edge.Y, edge.X);
                axis.Normalize();

                // Find the projection of the polygon on the current axis
                float minA = 0; float minB = 0; float maxA = 0; float maxB = 0;
                ProjectPolygon(axis, polygonA, ref minA, ref maxA);
                ProjectPolygon(axis, polygonB, ref minB, ref maxB);

                // Check if the polygon projections are currentlty intersecting
                if (IntervalDistance(minA, maxA, minB, maxB) >= CollisionThreshold)
                {
                    result.Intersect = false;
                }

                // ===== 2. Now find if the polygons *will* intersect =====

                // Project the velocity on the current axis
                float velocityProjection = (float)Vector.Multiply(velocity, axis);

                // Get the projection of polygon A during the movement
                if (velocityProjection < 0)
                {
                    minA += velocityProjection;
                }
                else
                {
                    maxA += velocityProjection;
                }

                // Do the same test as above for the new projection
                float intervalDistance   = IntervalDistance(minA, maxA, minB, maxB);
                if (intervalDistance >= CollisionThreshold)
                {
                    result.WillIntersect = false;
                }

                // If the polygons are not intersecting and won't intersect, exit the loop
                if (!result.Intersect && !result.WillIntersect)
                {
                    break;
                }

                // Check if the current interval distance is the minimum one. If so store
                // the interval distance and the current distance.
                // This will be used to calculate the minimum translation vector
                intervalDistance = Math.Abs(intervalDistance);
                if (intervalDistance < minIntervalDistance)
                {
                    minIntervalDistance = intervalDistance;
                    translationAxis     = axis;
                    Vector d = getCenter(polygonA) - getCenter(polygonB);
                    //Vector d = polygonA.Center - polygonB.Center;
                    if (Vector.Multiply(d, translationAxis) < 0)
                    {
                        translationAxis = -translationAxis;
                    }
                }
            }

            // The minimum translation vector
            // can be used to push the polygons appart.
            if (result.WillIntersect)
            {
                result.MinimumTranslationVector =
                    translationAxis * minIntervalDistance;
            }

            return(result);
        }
Esempio n. 38
0
 public virtual void OnCollision(PolygonCollisionResult FinalCollisionResult, Polygon FinalCollisionPolygon, out Vector2 CollisionPoint)
 {
     CollisionPoint = Vector2.Zero;
 }
Esempio n. 39
0
        /// <summary>
        /// Check if polygon A is going to collide with polygon B for the given velocity
        /// </summary>
        /// <param name="polygonA">The first polygon to check</param>
        /// <param name="polygonB">The second polygon to check</param>
        /// <param name="resolve">Whether to resolve the collisions using the static polygon references</param>
        /// <returns>A PolygonCollisionResult specifying the result of this test</returns>
        public static PolygonCollisionResult PolygonCollision(Vector2[] polygonA, Vector2[] polygonB, bool resolve = false)
        {
            PolygonCollisionResult result = new PolygonCollisionResult();

            result.Intersect     = true;
            result.WillIntersect = false;

            int     edgeCountA          = polygonA.Length;
            int     edgeCountB          = polygonB.Length;
            float   minIntervalDistance = float.PositiveInfinity;
            Vector2 translationAxis     = Vector2.Zero;
            Vector2 edge;

            Vector2 center1 = Vector2.Zero;
            Vector2 center2 = Vector2.Zero;

            if (resolve)
            {
                // Calculate the center of the polygons
                for (var i = 0; i < polygonA.Length; i += 1)
                {
                    center1 += polygonA[i];
                }
                center1 = center1 / polygonA.Length;

                for (var i = 0; i < polygonB.Length; i += 1)
                {
                    center2 += polygonB[i];
                }
                center2 = center2 / polygonB.Length;
            }

            // Loop through all the edges of both polygons
            for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++)
            {
                if (edgeIndex < edgeCountA)
                {
                    edge = (polygonA[edgeIndex] - polygonA[(edgeIndex + 1) % polygonA.Length]);
                }
                else
                {
                    edge = (polygonB[(edgeIndex - edgeCountA)] - polygonB[((edgeIndex + 1) - edgeCountA) % polygonB.Length]);
                }

                // ===== 1. Find if the polygons are currently intersecting =====

                // Find the axis perpendicular to the current edge
                Vector2 axis = new Vector2(-edge.Y, edge.X);
                axis.Normalize();

                // Find the projection of the polygon on the current axis
                float minA = 0; float minB = 0; float maxA = 0; float maxB = 0;
                ProjectPolygon(axis, polygonA, ref minA, ref maxA);
                ProjectPolygon(axis, polygonB, ref minB, ref maxB);

                // Check if the polygon projections are currentlty intersecting
                if (IntervalDistance(minA, maxA, minB, maxB) > 0)
                {
                    result.Intersect = false;
                }

                // ===== 2. Now find if the polygons *will* intersect =====


                // Project the velocity on the current axis

                float velocityProjection = Vector2.Dot(axis, Vector2.Zero);

                // Get the projection of polygon A during the movement

                if (velocityProjection < 0)
                {
                    minA += velocityProjection;
                }
                else
                {
                    maxA += velocityProjection;
                }

                // Do the same test as above for the new projection

                float intervalDistance   = IntervalDistance(minA, maxA, minB, maxB);
                if (intervalDistance > 0)
                {
                    result.WillIntersect = false;
                }

                // If the polygons are not intersecting and won't intersect, exit the loop

                if (!result.Intersect && !result.WillIntersect)
                {
                    break;
                }

                // Check if the current interval distance is the minimum one. If so store
                // the interval distance and the current distance.
                // This will be used to calculate the minimum translation vector

                if (resolve)
                {
                    intervalDistance = Math.Abs(intervalDistance);
                    if (intervalDistance < minIntervalDistance)
                    {
                        minIntervalDistance = intervalDistance;

                        translationAxis = axis;

                        Vector2 d = center1 - center2;
                        if (Vector2.Dot(d, translationAxis) < 0)
                        {
                            translationAxis = -translationAxis;
                        }
                    }
                }
            }

            if (resolve)
            {
                result.MinimumTranslationVector = translationAxis * minIntervalDistance;
            }

            return(result);
        }
Esempio n. 40
0
 public override void OnCollision(PolygonCollisionResult FinalCollisionResult, Polygon FinalCollisionPolygon, out Vector2 CollisionPoint)
 {
     IsAlive        = false;
     CollisionPoint = Collision.ListCollisionPolygon[0].Center;
 }
Esempio n. 41
0
 public void onCollision(GameTime gameTime, PolygonCollisionResult collisionResult, Vector2 player1Velocity)
 {
     inventoryHud.onCollision(gameTime, collisionResult, player1Velocity);
     questHud.onCollision(gameTime, collisionResult, player1Velocity);
 }