コード例 #1
0
        /// <summary>
        /// Determines if a moved hitbox intersects with a tilemap. Gives a new, valid solution if the new position is not valid.
        /// </summary>
        /// <param name="currentPosition">current position of the hitbox</param>
        /// <param name="newPosition">new position of the hitbox</param>
        /// <param name="hitBox">dimensions of the hitbox</param>
        /// <returns>A Vector2 determining the hitbox's potentially new location.</returns>
        public Vector2 reloactePosition(Vector2 currentPosition, Vector2 newPosition, Vector2 hitBox)
        {
            if (currentPosition.X < 0 || currentPosition.Y < 0 || currentPosition.X >= size.x * tileSize.X || currentPosition.Y >= size.y * tileSize.Y)
            {
                return(newPosition);
            }

            // get tile coordinates for entity+hitbox
            TileDimensions tilesPosition           = new TileDimensions((int)(currentPosition.X / tileSize.X), (int)(currentPosition.Y / tileSize.Y));
            TileDimensions tilesPositionPlusHitBox = new TileDimensions((int)((currentPosition.X + hitBox.X) / tileSize.X), (int)((currentPosition.Y + hitBox.Y) / tileSize.Y));

            Vector2 delta          = newPosition - currentPosition;
            Vector2 resultLocation = newPosition;

            if (delta.X > 0)
            {
                bool           breakLoop = false;
                TileDimensions pos       = new TileDimensions(-1, -1);

                for (int i = tilesPositionPlusHitBox.x; i < size.x && !breakLoop; i++)
                {
                    for (int j = tilesPosition.y; j <= tilesPositionPlusHitBox.y && j < size.y && !breakLoop; j++)
                    {
                        if (map[i, j] != TileType.NoWall)
                        {
                            breakLoop = true;
                            pos       = new TileDimensions(i, j);
                        }
                    }
                }

                if (breakLoop)
                {
                    resultLocation.X = Math.Min(newPosition.X, (pos.x * tileSize.X) - (hitBox.X + 1));

                    tilesPosition           = new TileDimensions((int)(resultLocation.X / tileSize.X), (int)(currentPosition.Y / tileSize.Y));
                    tilesPositionPlusHitBox = new TileDimensions((int)((resultLocation.X + hitBox.X) / tileSize.X), (int)((currentPosition.Y + hitBox.Y) / tileSize.Y));
                }
            }
            else if (delta.X < 0)
            {
                bool           breakLoop = false;
                TileDimensions pos       = new TileDimensions(-1, -1);

                for (int i = tilesPosition.x; i >= 0 && !breakLoop; i--)
                {
                    for (int j = tilesPosition.y; j <= tilesPositionPlusHitBox.y && j < size.y && !breakLoop; j++)
                    {
                        if (map[i, j] != TileType.NoWall)
                        {
                            breakLoop = true;
                            pos       = new TileDimensions(i, j);
                        }
                    }
                }

                if (breakLoop)
                {
                    resultLocation.X = Math.Max(newPosition.X, ((pos.x + 1) * tileSize.X));

                    tilesPosition           = new TileDimensions((int)(resultLocation.X / tileSize.X), (int)(currentPosition.Y / tileSize.Y));
                    tilesPositionPlusHitBox = new TileDimensions((int)((resultLocation.X + hitBox.X) / tileSize.X), (int)((currentPosition.Y + hitBox.Y) / tileSize.Y));
                }
            }

            if (delta.Y > 0)
            {
                bool           breakLoop = false;
                TileDimensions pos       = new TileDimensions(-1, -1);

                for (int i = tilesPositionPlusHitBox.y; i < size.y && !breakLoop; i++)
                {
                    for (int j = tilesPosition.x; j <= tilesPositionPlusHitBox.x && j < size.x && !breakLoop; j++)
                    {
                        if (map[j, i] != TileType.NoWall)
                        {
                            breakLoop = true;
                            pos       = new TileDimensions(j, i);
                        }
                    }
                }

                if (breakLoop)
                {
                    resultLocation.Y = Math.Min(newPosition.Y, (pos.y * tileSize.Y) - (hitBox.Y + 1));
                }
            }
            else if (delta.Y < 0)
            {
                bool           breakLoop = false;
                TileDimensions pos       = new TileDimensions(-1, -1);

                for (int i = tilesPositionPlusHitBox.y; i > 0 && i < size.y && !breakLoop; i--)
                {
                    for (int j = tilesPosition.x; j <= tilesPositionPlusHitBox.x && j < size.x && !breakLoop; j++)
                    {
                        if (map[j, i] != TileType.NoWall)
                        {
                            breakLoop = true;
                            pos       = new TileDimensions(j, i);
                        }
                    }
                }

                if (breakLoop)
                {
                    resultLocation.Y = Math.Max(newPosition.Y, (pos.y + 1) * tileSize.Y);
                }
            }

            return(resultLocation);
        }
コード例 #2
0
        private int GetTilesCount()
        {
            var sum = TileDimensions.Sum(tileDim => tileDim.Width * tileDim.Height);

            return((int)sum);
        }
コード例 #3
0
        public TileMap(LevelState parent, DungeonGenerator.DungeonRoom[,] room, Vector2 tileSize)
        {
            tileSkin = new Texture2D[5];

            this.size     = new TileDimensions(room.GetLength(0) * GlobalGameConstants.TilesPerRoomWide, room.GetLength(1) * GlobalGameConstants.TilesPerRoomHigh);
            this.tileSize = tileSize;

            this.parent = parent;

            map      = new TileType[size.x, size.y];
            floorMap = new FloorType[size.x, size.y];
            mapMod   = new WallMod[size.x, size.y];

            Random rand = new Random();

            for (int i = 0; i < floorMap.GetLength(0); i++)
            {
                for (int j = 0; j < floorMap.GetLength(1); j++)
                {
                    int randVal = Game1.rand.Next() % 100;

                    if (randVal > 15)
                    {
                        floorMap[i, j] = Game1.rand.Next() % 2 == 0 ? FloorType.A : FloorType.B;
                    }
                    else if (randVal > 10)
                    {
                        floorMap[i, j] = Game1.rand.Next() % 2 == 0 ? FloorType.C : FloorType.D;
                    }
                    else if (randVal > 5)
                    {
                        floorMap[i, j] = Game1.rand.Next() % 2 == 0 ? FloorType.E : FloorType.F;
                    }
                    else
                    {
                        floorMap[i, j] = Game1.rand.Next() % 2 == 0 ? FloorType.G : FloorType.H;
                    }
                }
            }

            for (int i = 0; i < room.GetLength(0); i++)
            {
                for (int j = 0; j < room.GetLength(1); j++)
                {
                    if (room[i, j].attributes != null)
                    {
                        ChunkManager.Chunk c = ChunkLib.getRandomChunkByValues(room[i, j].attributes.ToArray(), rand);

                        if (c == null)
                        {
                            throw new Exception("NO CHUNK FOR VALUES");
                        }

                        if (c != null)
                        {
                            foreach (ChunkManager.Chunk.ChunkAttribute attr in c.Attributes)
                            {
                                if (!room[i, j].attributes.Contains(attr.AttributeName))
                                {
                                    room[i, j].attributes.Add(attr.AttributeName);
                                }
                            }

                            if (c != null)
                            {
                                for (int p = 0; p < GlobalGameConstants.TilesPerRoomWide; p++)
                                {
                                    for (int q = 0; q < GlobalGameConstants.TilesPerRoomHigh; q++)
                                    {
                                        map[(i * GlobalGameConstants.TilesPerRoomWide) + p, (j * GlobalGameConstants.TilesPerRoomHigh) + q] = (TileType)(c.tilemap[(q * GlobalGameConstants.TilesPerRoomHigh) + p]);
                                    }
                                }

                                room[i, j].chunkName = c.Name;

                                if (room[i, j].attributes.Contains("start"))
                                {
                                    int startX = 0;
                                    int startY = 0;

                                    while (c.tilemap[startY * GlobalGameConstants.TilesPerRoomHigh + startX] == 1)
                                    {
                                        startX = rand.Next() % GlobalGameConstants.TilesPerRoomWide;
                                        startY = rand.Next() % GlobalGameConstants.TilesPerRoomHigh;
                                    }

                                    startPosition.X = (i * GlobalGameConstants.TilesPerRoomWide * GlobalGameConstants.TileSize.X) + ((GlobalGameConstants.TilesPerRoomWide / 2) * GlobalGameConstants.TileSize.X);
                                    startPosition.Y = (j * GlobalGameConstants.TilesPerRoomHigh * GlobalGameConstants.TileSize.Y) + ((GlobalGameConstants.TilesPerRoomHigh / 2) * GlobalGameConstants.TileSize.Y);
                                }

                                if (room[i, j].intensity > 0.95f)
                                {
                                    endFlagPosition.X = (i * GlobalGameConstants.TilesPerRoomWide * GlobalGameConstants.TileSize.X) + ((GlobalGameConstants.TilesPerRoomWide / 2) * GlobalGameConstants.TileSize.X);
                                    endFlagPosition.Y = (j * GlobalGameConstants.TilesPerRoomHigh * GlobalGameConstants.TileSize.Y) + ((GlobalGameConstants.TilesPerRoomHigh / 2) * GlobalGameConstants.TileSize.Y);
                                }
                            }
                            else
                            {
                                for (int p = 0; p < GlobalGameConstants.TilesPerRoomWide; p++)
                                {
                                    for (int q = 0; q < GlobalGameConstants.TilesPerRoomHigh; q++)
                                    {
                                        map[(i * GlobalGameConstants.TilesPerRoomWide) + p, (j * GlobalGameConstants.TilesPerRoomHigh) + q] = TileType.TestWall;
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        //fill a room with empty tiles if it is empty
                        for (int p = 0; p < GlobalGameConstants.TilesPerRoomWide; p++)
                        {
                            for (int q = 0; q < GlobalGameConstants.TilesPerRoomHigh; q++)
                            {
                                map[(i * GlobalGameConstants.TilesPerRoomWide) + p, (j * GlobalGameConstants.TilesPerRoomHigh) + q] = TileType.TestWall;
                            }
                        }
                    }
                }
            }

            convertTestWallsToWalls();
        }