Пример #1
0
        //Item collision testing
        public void TestGroundItem(Item_Base spr, Tile[,] tileData)
        {
            int y1 = (int)((spr.Position.Y + spr.Height) / 16);

            int x1 = (int)(spr.Position.X) / 16;
            int x2 = (int)(spr.Position.X + 16) / 16;

            if (tileData[x1, y1].isSolid == true)
            {
                spr.airState = Phys_Const.AirState.GROUND;
            }
            else if (tileData[x2, y1].isSolid == true)
            {
                spr.airState = Phys_Const.AirState.GROUND;
            }
            else
                spr.airState = Phys_Const.AirState.AIR;

            if (spr.airState == Phys_Const.AirState.GROUND)
            {
                spr.Position.Y = (y1 * 16) - spr.Source.Height;
                spr.vVelocity.Y = 0;
            }
            else
                spr.airState = Phys_Const.AirState.AIR;
        }
Пример #2
0
        public Level()
        {
            for (int i = 0; i < 200; i++)
            {
                for (int n = 0; n < 50; n++)
                {
                    tileData[i, n] = new Tile();
                    tileData[i, n].isSolid = false;

                    if (n > 25)
                    {
                        tileData[i, n].isSolid = true;
                        tileData[i, n].isVisible = true;
                    }

                    if (n == 26)
                    {
                        tileData[i, n].isTop = true;
                        tileData[i, n].isVisible = true;
                    }
                }
            }
            tileData[20, 25].isSolid = true;
            tileData[20, 25].isStone = true;
            tileData[20, 25].isVisible = true;
            tileData[20, 25].isVisible = true;

            tileData[51, 25].isSolid = true;
            tileData[51, 25].isVisible = true;

            tileData[40, 25].isSolid = true;
            tileData[51, 20].isSolid = true;
            tileData[52, 20].isSolid = true;
            tileData[53, 20].isSolid = true;

            tileData[40, 25].isStone = true;
            tileData[51, 25].isStone = true;
            tileData[51, 20].isStone = true;
            tileData[52, 20].isStone = true;
            tileData[53, 20].isStone = true;

            tileData[40, 25].isVisible = true;
            tileData[51, 20].isVisible = true;
            tileData[52, 20].isVisible = true;
            tileData[53, 20].isVisible = true;

            blockSprite = new Sprite();
            blockSprite.Source = new Rectangle(0, 0, 16, 16);

            npcMan.currentLevel = this;
        }
Пример #3
0
        public void TestCeilingItem(Item_Base spr, Tile[,] tileData)
        {
            if (spr.vVelocity.Y < 0)
            {
                int y1 = (int)((spr.Position.Y) / 16);

                int x1 = (int)(spr.Position.X) / 16;
                int x2 = (int)(spr.Position.X + 14) / 16;

                if (tileData[x1, y1].isSolid == true)
                {
                    spr.vVelocity.Y = 0;
                    spr.Position.Y = (y1 * 16) + 16;
                }
                else if (tileData[x2, y1].isSolid == true)
                {
                    spr.vVelocity.Y = 0;
                    spr.Position.Y = (y1 * 16) + 16;
                }
            }
        }
Пример #4
0
        public void WallTestNPC(NPC_Base spr, Tile[,] tileData)
        {
            int y1 = (int)((spr.Position.Y + (spr.Source.Height - 16)) / 16);
            //int y2 = (int)(((spr.Position.Y + 16)) / 16);

            int x1 = (int)(spr.Position.X - 2) / 16;
            int x2 = (int)(spr.Position.X + 16) / 16;

            if (spr.isMovingLeft == false)
            {
                if (tileData[x2, y1].isSolid == true)
                {
                    spr.Position.X = (x2 * 16) - 16;
                    spr.HandleCollision(ConstHelper.CollisionDir.RIGHT, "wall");
                }
            }
            else
            {
                if (tileData[x1, y1].isSolid == true)
                {
                    spr.Position.X = (x1 * 16) + 16;
                    spr.HandleCollision(ConstHelper.CollisionDir.LEFT, "wall");
                }
            }
        }
Пример #5
0
        public void Update(GameTime time, Tile[,] tileData, List<Block> blocks)
        {
            for (int i = 0; i < listNPC.Count; i++)
            {
                NPC_Base npc = listNPC[i];
                npc.Update(time);

                if (npc.Collide == true)
                {
                    TestGroundNPC(npc, tileData);
                    WallTestNPC(npc, tileData);
                    TestCeilingNPC(npc, tileData, blocks);
                }
            }
        }
Пример #6
0
        public void TestGroundNPC(NPC_Base spr, Tile[,] tileData)
        {
            int y1 = (int)((spr.Position.Y + spr.Height) / 16);

            int x1 = (int)(spr.Position.X + 4) / 16;
            int x2 = (int)(spr.Position.X + 14) / 16;

            if (tileData[x1, y1].isSolid == true)
            {
                spr.airState = ConstHelper.AirState.GROUND;
            }
            else if (tileData[x2, y1].isSolid == true)
            {
                spr.airState = ConstHelper.AirState.GROUND;
            }
            else
            {
                if (spr is NPC_Turtle)
                {
                    NPC_Turtle turtle = (NPC_Turtle)spr;
                    if (turtle.isRed == true && turtle.isShell == false)
                    {
                        if (turtle.airState == ConstHelper.AirState.GROUND)
                        {
                            turtle.isMovingLeft = !turtle.isMovingLeft;
                            turtle.FlipHorz = !turtle.FlipHorz;
                        }
                    }
                    else
                        spr.airState = ConstHelper.AirState.AIR;
                }
                else
                    spr.airState = ConstHelper.AirState.AIR;
            }

            if (spr.airState == ConstHelper.AirState.GROUND)
            {
                spr.Position.Y = (y1 * 16) - spr.Source.Height;
                spr.vVelocity.Y = 0;
            }
            else
                spr.airState = ConstHelper.AirState.AIR;
        }
Пример #7
0
        public void TestCeilingNPC(NPC_Base spr, Tile[,] tileData, List<Block> blocks)
        {
            if (spr.vVelocity.Y < 0)
            {
                int y1 = (int)((spr.Position.Y) / 16);

                int x1 = (int)(spr.Position.X + 4) / 16;
                int x2 = (int)(spr.Position.X + 14) / 16;

                if (tileData[x1, y1].isSolid == true)
                {
                    spr.vVelocity.Y = 0;
                    spr.Position.Y = (y1 * 16) + 16;
                }
                else if (tileData[x2, y1].isSolid == true)
                {
                    spr.vVelocity.Y = 0;
                    spr.Position.Y = (y1 * 16) + 16;
                }
            }

            foreach (NPC_Base npc in listNPC.ToArray())
            {
                if (npc is NPC_Turtle)
                {
                    NPC_Turtle turtle = (NPC_Turtle)npc;
                    foreach (Block blockTest in blocks)
                    {
                        if (turtle.GetRect().Intersects(blockTest.GetRect()) &&
                            turtle.isShell && turtle.isHeld == false)
                        {
                            blockTest.HandleCollision(ConstHelper.CollisionDir.DOWN, "shell");
                        }
                    }
                }
            }
        }
Пример #8
0
        public void Update(Tile[,] tileData)
        {
            for (int i = 0; i < listItem.Count; i++)
            {
                Item_Base item = listItem[i];
                item.Update();

                if (item.isWithinBlock == false)
                {
                    TestGroundItem(item, tileData);
                    WallTestItem(item, tileData);
                    TestCeilingItem(item, tileData);
                }
            }
        }