Beispiel #1
0
        public void Update(GameTime gameTime)
        {
            SecondsBeforeExplosion -= gameTime.ElapsedGameTime.TotalSeconds;

            if (SecondsBeforeExplosion <= 0)
            {
                Owner.Remove(this);
                SimpleLinearExplosion ExplosionUp    = new SimpleLinearExplosion(Owner, CollisionBox.Position, new Vector2(0f, -1f));
                SimpleLinearExplosion ExplosionDown  = new SimpleLinearExplosion(Owner, CollisionBox.Position, new Vector2(0f, 1f));
                SimpleLinearExplosion ExplosionLeft  = new SimpleLinearExplosion(Owner, CollisionBox.Position, new Vector2(-1f, 0f));
                SimpleLinearExplosion ExplosionRight = new SimpleLinearExplosion(Owner, CollisionBox.Position, new Vector2(1f, 0f));

                Owner.Add(ExplosionUp);
                Owner.Add(ExplosionDown);
                Owner.Add(ExplosionLeft);
                Owner.Add(ExplosionRight);
            }
        }
Beispiel #2
0
 public void DropBomb()
 {
     Owner.Add(new Bomb(Owner, Position));
 }
Beispiel #3
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.
                }
            }
        }