コード例 #1
0
        // updates this grid based on the motion of obj
        public void Update(CollidableObject obj, CollisionBox oldBox, CollisionBox newBox)
        {
            int oldMinX = (int)(oldBox.Min.X / squareSize);
            int oldMaxX = (int)(oldBox.Max.X / squareSize);
            int oldMinY = (int)(oldBox.Min.Y / squareSize);
            int oldMaxY = (int)(oldBox.Max.Y / squareSize);
            int newMinX = (int)(newBox.Min.X / squareSize);
            int newMaxX = (int)(newBox.Max.X / squareSize);
            int newMinY = (int)(newBox.Min.Y / squareSize);
            int newMaxY = (int)(newBox.Max.Y / squareSize);

            for (int x = oldMinX; x <= oldMaxX; x++)
            {
                for (int y = oldMinY; y <= oldMaxY; y++)
                {
                    if (x >= 0 && y >= 0 && x < grid.GetLength(0) && y < grid.GetLength(1))
                    {
                        grid[x, y].Remove(obj);
                    }
                }
            }
            for (int x = newMinX; x <= newMaxX; x++)
            {
                for (int y = newMinY; y <= newMaxY; y++)
                {
                    if (x >= 0 && y >= 0 && x < grid.GetLength(0) && y < grid.GetLength(1))
                    {
                        grid[x, y].Add(obj);
                    }
                }
            }
        }
コード例 #2
0
        // returns true if the collision is with a hiddenblock on its left, right, or top side
        public static bool HiddenBlockSpecialCase(CollidableObject objA, CollidableObject objB)
        {
            CollisionBox tempABox = new CollisionBox(objA.CollisionBox.Min - objA.Velocity, objA.CollisionBox.Max - objA.Velocity);
            CollisionBox tempBBox = new CollisionBox(objB.CollisionBox.Min - objB.Velocity, objB.CollisionBox.Max - objB.Velocity);

            if (objA is QuestionBlock && (objA as QuestionBlock).State is HiddenQuestionBlock)
            {
                return(!tempABox.TopOf(tempBBox));
            }
            else if (objA is BrickBlock && (objA as BrickBlock).State is HiddenBrickBlock)
            {
                return(!tempABox.TopOf(tempBBox));
            }
            else if (objB is QuestionBlock && (objB as QuestionBlock).State is HiddenQuestionBlock)
            {
                return(!tempABox.BottomOf(tempBBox));
            }
            else if (objB is BrickBlock && (objB as BrickBlock).State is HiddenBrickBlock)
            {
                return(!tempABox.BottomOf(tempBBox));
            }
            else
            {
                return(false);
            }
        }
コード例 #3
0
ファイル: Koopa.cs プロジェクト: satwinders97/MyProjects
 public override void CollideBottom(CollidableObject obj) {
     if (obj is Block) {
         _velocity.Y = 0;
     } else if (obj is Fireball) {
         Die();
     }
 }
コード例 #4
0
 // removes all instances of obj from the grid
 public void Remove(CollidableObject obj)
 {
     foreach (var objList in grid)
     {
         objList.Remove(obj);
     }
 }
コード例 #5
0
 public override void CollideTop(CollidableObject obj)
 {
     if (obj is Sanitizerball)
     {
         Die();
     }
 }
コード例 #6
0
 public override void CollideTop(CollidableObject obj)
 {
     if (obj is Fireball)
     {
         Die();
     }
 }
コード例 #7
0
ファイル: Avatar.cs プロジェクト: satwinders97/MyProjects
        public override void CollideTop(CollidableObject obj)
        {
            if (obj is Block || obj is WarpPipe || obj is Cloud)
            {
                DownAction();
                _velocity.Y = 0;
            }
            else if (obj is Flagpole)
            {
                Game1.SoundMap["FlagPole"].Play();
                TimeWon      = new TimeSpan();
                OnFlagpole   = true;
                _velocity.Y  = 0.5f;
                Acceleration = new Vector2(0, 0);
                DownAction();
            }
            else if (obj is Peach)
            {
                TimeWon      = new TimeSpan();
                OnFlagpole   = true;
                Acceleration = new Vector2(0, 0);
                DownAction();
            }
            else if (obj is PowerUp)
            {
                CollidePowerUp(obj as PowerUp);
            }

            if ((obj is MiniCovid || obj is CovidBoss) && !Sprite.IsMasked)
            {
                TakeToxicDamage(18);
                DownAction();
            }
        }
コード例 #8
0
ファイル: Peach.cs プロジェクト: satwinders97/MyProjects
 public override void CollideTop(CollidableObject obj)
 {
     if (obj is Avatar)
     {
         Game1.HUDMap["Score"] += 500;
     }
 }
コード例 #9
0
ファイル: Cloud.cs プロジェクト: satwinders97/MyProjects
 public override void CollideRight(CollidableObject obj)
 {
     if (!(obj is Avatar))
     {
         _velocity.X *= -1;
     }
 }
コード例 #10
0
        // returns true if only obj1's position needs to change to revert intersection
        // if fails, then reverts its changes
        private static bool TryFixObj(CollidableObject obj1, CollidableObject obj2)
        {
            // determine whether to fix X or Y first
            if (Math.Abs(obj1.Velocity.X) < Math.Abs(obj1.Velocity.Y))
            {
                if (!TryUpdateX(obj1, obj2))
                {
                    if (!TryUpdateY(obj1, obj2))
                    {
                        return(TryUpdateXAndY(obj1, obj2));
                    }
                }
            }
            else
            {
                if (!TryUpdateY(obj1, obj2))
                {
                    if (!TryUpdateX(obj1, obj2))
                    {
                        return(TryUpdateXAndY(obj1, obj2));
                    }
                }
            }

            return(false);
        }
コード例 #11
0
ファイル: Cloud.cs プロジェクト: satwinders97/MyProjects
 public override void CollideBottom(CollidableObject obj)
 {
     if (!(obj is Avatar))
     {
         _velocity.Y *= -1;
     }
 }
コード例 #12
0
 public override void CollideTop(CollidableObject obj)
 {
     _velocity.Y = verticalSpeed;
     if (obj is Sanitizerball)
     {
         TakeDamage();
     }
 }
コード例 #13
0
 public override void CollideRight(CollidableObject obj)
 {
     _velocity.X  = -horizontalSpeed;
     isFacingLeft = true;
     if (obj is Sanitizerball)
     {
         TakeDamage();
         Game1.SoundMap["BatScreech"].Play();
     }
 }
コード例 #14
0
ファイル: Fireball.cs プロジェクト: satwinders97/MyProjects
 public override void CollideBottom(CollidableObject obj)
 {
     if (obj is Block)
     {
         _velocity.Y = -2;
     }
     else
     {
         Explode();
     }
 }
コード例 #15
0
ファイル: Flagpole.cs プロジェクト: satwinders97/MyProjects
 public override void CollideTop(CollidableObject obj)
 {
     if (obj is Avatar)
     {
         if (!isFalling)
         {
             Game1.HUDMap["Lives"]++;
             isFalling = true;
             Animate   = true;
         }
     }
 }
コード例 #16
0
        // returns true if only obj1's y needs to change to revert intersection
        // if fails, then reverts its changes
        private static bool TryUpdateY(CollidableObject obj1, CollidableObject obj2)
        {
            obj1.Position = new Vector2(obj1.Position.X, obj1.Position.Y - obj1.Velocity.Y);

            if (!obj1.CollisionBox.Intersects(obj2.CollisionBox))
            {
                return(true);
            }
            else
            {
                obj1.Position = new Vector2(obj1.Position.X, obj1.Position.Y + obj1.Velocity.Y);
                return(false);
            }
        }
コード例 #17
0
 public override void CollideTop(CollidableObject obj)
 {
     if (obj is Avatar)
     {
         ToBeRemoved = true;
         Game1.SoundMap["CoinCollect"].Play();
         Game1.HUDMap["Coins"]++;
         Game1.HUDMap["Score"] += 200;
         if (Game1.HUDMap["Coins"] % 10 == 0)
         {
             Game1.HUDMap["Lives"]++;
         }
     }
 }
コード例 #18
0
        // returns true if only obj1's position needs to change to revert intersection
        // if fails, then reverts its changes
        private static bool TryUpdateXAndY(CollidableObject obj1, CollidableObject obj2)
        {
            obj1.Position -= obj1.Velocity;

            if (!obj1.CollisionBox.Intersects(obj2.CollisionBox))
            {
                return(true);
            }
            else
            {
                obj1.Position += obj1.Velocity;
                return(false);
            }
        }
コード例 #19
0
 public override void CollideTop(CollidableObject obj)
 {
     if (obj is Avatar)
     {
         ToBeRemoved = true;
         if (State is LifeMushroom)
         {
             Game1.SoundMap["LifeShroom"].Play();
         }
         else if (State is SuperMushroom)
         {
             Game1.SoundMap["PUpShroom"].Play();
         }
     }
 }
コード例 #20
0
 public override void CollideBottom(CollidableObject obj)
 {
     if (obj is Avatar)
     {
         var powerState = (obj as Avatar).PowerState;
         if (powerState is SuperState || powerState is FireState)
         {
             BreakAction();
         }
         else
         {
             BumpAction();
         }
     }
 }
コード例 #21
0
ファイル: Goomba.cs プロジェクト: satwinders97/MyProjects
 public override void CollideLeft(CollidableObject obj)
 {
     leftCol  = true;
     rightCol = false;
     if (obj is Fireball)
     {
         Die();
     }
     else if (obj is Koopa)
     {
         if ((obj as Koopa).Type is GreenProjectile || (obj as Koopa).Type is RedProjectile)
         {
             Die();
         }
     }
 }
コード例 #22
0
 public override void CollideRight(CollidableObject obj)
 {
     rightCol = true;
     leftCol  = false;
     if (obj is Sanitizerball)
     {
         Die();
     }
     else if (obj is Koopa)
     {
         if ((obj as Koopa).Type is GreenProjectile || (obj as Koopa).Type is RedProjectile)
         {
             Die();
         }
     }
 }
コード例 #23
0
ファイル: Avatar.cs プロジェクト: satwinders97/MyProjects
 public override void CollideRight(CollidableObject obj)
 {
     if (obj is Block || obj is Cloud)
     {
         LeftAction();
     }
     else if (obj is WarpPipe)
     {
         bool canFit = CollisionBox.Min.Y >= (obj as WarpPipe).CollisionBox.Min.Y && CollisionBox.Max.Y <= (obj as WarpPipe).CollisionBox.Max.Y;
         if (HorizontalState is RunningRightAvatar && (obj as WarpPipe).Type is Side && canFit)
         {
             InitWarpRight(obj as WarpPipe);
         }
         else
         {
             LeftAction();
         }
     }
     else if (obj is Flagpole)
     {
         Game1.SoundMap["FlagPole"].Play();
         TimeWon      = new TimeSpan();
         OnFlagpole   = true;
         _velocity.Y  = 0.5f;
         Acceleration = new Vector2(0, 0);
         LeftAction();
     }
     else if (obj is Peach)
     {
         TimeWon      = new TimeSpan();
         OnFlagpole   = true;
         Acceleration = new Vector2(0, 0);
         LeftAction();
     }
     else if (obj is PowerUp)
     {
         CollidePowerUp(obj as PowerUp);
     }
     else if (obj is Gate)
     {
         ReachedGate = true;
     }
     if ((obj is MiniCovid || obj is CovidBoss) && !Sprite.IsMasked)
     {
         TakeToxicDamage(18);
     }
 }
コード例 #24
0
ファイル: Flagpole.cs プロジェクト: satwinders97/MyProjects
        public override void CollideRight(CollidableObject obj)
        {
            if (obj is Avatar)
            {
                if (obj is Avatar)
                {
                    if (!isFalling)
                    {
                        if (Level.Avatar.Position.Y > 0 && Level.Avatar.Position.Y <= 6)
                        {
                            Game1.HUDMap["Lives"]++;
                            isFalling = true;
                        }
                        else if (Level.Avatar.Position.Y > 6 && Level.Avatar.Position.Y <= 32)
                        {
                            Game1.HUDMap["Score"] += 4000;
                            isFalling              = true;
                        }
                        else if (Level.Avatar.Position.Y > 32 && Level.Avatar.Position.Y <= 78)
                        {
                            Game1.HUDMap["Score"] += 2000;
                            isFalling              = true;
                        }
                        else if (Level.Avatar.Position.Y > 78 && Level.Avatar.Position.Y <= 102)
                        {
                            Game1.HUDMap["Score"] += 1000;
                            isFalling              = true;
                        }
                        else if (Level.Avatar.Position.Y > 102 && Level.Avatar.Position.Y <= 142)
                        {
                            Game1.HUDMap["Score"] += 400;
                            isFalling              = true;
                        }
                        else if (Level.Avatar.Position.Y > 142 && Level.Avatar.Position.Y <= 160)
                        {
                            Game1.HUDMap["Score"] += 100;
                            isFalling              = true;
                        }

                        Animate = true;
                    }
                }
            }
        }
コード例 #25
0
ファイル: Koopa.cs プロジェクト: satwinders97/MyProjects
        public override void CollideTop(CollidableObject obj) {
            if (obj is Avatar) {
                if (Type is GreenKoopa) {
                    Type = new GreenShell();
                    GreenShell();

                } else if (Type is RedKoopa) {
                    Type = new RedShell();
                    RedShell();

                } else if (Type is GreenProjectile) {
                    GreenShell();
                } else if (Type is RedProjectile) {
                    RedShell();
                }

            } else if (obj is Fireball) {
                Die();
            }
        }
コード例 #26
0
ファイル: Koopa.cs プロジェクト: satwinders97/MyProjects
        public override void CollideRight(CollidableObject obj) {
            if (obj is Avatar) {
                if (Type is GreenShell) {
                    GreenProjectile();
                    rGreenCollide = true;
                    lGreenCollide = false;
                } else if (Type is RedShell) {
                    RedProjectile();
                    rRedCollide = true;
                    lRedCollide = false;
                }
            }

            rightCol = true;
            leftCol = false;

            if (obj is Fireball) {
                Die();
            }
        }
コード例 #27
0
ファイル: Game1.cs プロジェクト: satwinders97/MyProjects
        private void UpdateCollisions()
        {
            var movingObjects = new HashSet <CollidableObject>(GameObjects.Where(x => x is CollidableObject && (x as CollidableObject).Velocity.Length() > 0).Cast <CollidableObject>());
            HashSet <Tuple <CollidableObject, CollidableObject> > possibleCollisions = ColliderGrid.GetPossibleCollisionPairs(movingObjects);
            List <Collision> actualCollisions = new List <Collision>();

            foreach (var pair in possibleCollisions)
            {
                CollidableObject objA = pair.Item1;
                CollidableObject objB = pair.Item2;

                if (objA.CollisionBox.Intersects(objB.CollisionBox))
                {
                    actualCollisions.Add(new Collision(objA, objB));
                }
            }

            foreach (var coll in actualCollisions)
            {
                coll.UpdatePostCollision();
            }
        }
コード例 #28
0
 public override void CollideTop(CollidableObject obj)
 {
 }
コード例 #29
0
 public override void CollideRight(CollidableObject obj)
 {
 }
コード例 #30
0
 public override void CollideLeft(CollidableObject obj)
 {
 }