source: 2014/24/EemeliK/Zombieland/Jypeli/Levels/TileMap.cs @ 5974

Revision 5974, 5.6 KB checked in by empaheik, 4 years ago (diff)
Line 
1using System;
2using System.IO;
3using System.Collections.Generic;
4using System.Linq;
5
6namespace Jypeli
7{
8    /// <summary>
9    /// Ruutukartta, jonka avulla olioita voidaan helposti asettaa tasavälein ruudukkoon.
10    /// Ruutukartta koostuu kirjoitusmerkeistä (<c>char</c>), joihin voi liittää
11    /// aliohjelman, joka luo merkkiä vastaavan olion.
12    /// </summary>
13    public class TileMap : AbstractTileMap<char>
14    {
15        private Dictionary<char, Func<GameObject>> oldLegend = new Dictionary<char, Func<GameObject>>();
16
17        protected override char Null
18        {
19            get { return ' '; }
20        }
21
22        /// <summary>
23        /// Asettaa merkin vastaamaan aliohjelmaa, joka luo olion. Huom! Käytä tämän
24        /// syntaksin kanssa metodia <c>Insert</c>.
25        /// </summary>
26        public Func<GameObject> this[char c]
27        {
28            get { return oldLegend[c]; }
29            set { oldLegend[c] = value; }
30        }
31       
32        /// <summary>
33        /// Luo uuden ruutukartan.
34        /// </summary>
35        /// <param name="tiles">Kaksiulotteinen taulukko merkeistä.</param>
36        public TileMap( char[,] tiles )
37            : base(tiles)
38        {
39        }
40
41        /// <summary>
42        /// Lukee ruutukentän tiedostosta.
43        /// </summary>
44        /// <param name="path">Tiedoston polku.</param>
45        public static TileMap FromFile( string path )
46        {
47            char[,] tiles = ReadFromFile( path );
48            return new TileMap( tiles );
49        }
50
51        /// <summary>
52        /// Lukee ruutukentän merkkijonotaulukosta.
53        /// </summary>
54        /// <param name="lines">Merkkijonotaulukko</param>       
55        public static TileMap FromStringArray(string[] lines)
56        {
57            char[,] tiles = ReadFromStringArray(lines);
58            return new TileMap(tiles);
59        }
60
61        /// <summary>
62        /// Lukee ruutukentän Content-projektin tekstitiedostosta.
63        /// </summary>
64        /// <param name="assetName">Tiedoston nimi</param>       
65        public static TileMap FromLevelAsset(string assetName)
66        {
67            string[] lines = Game.Instance.Content.Load<string[]>(assetName);
68            char[,] tiles = ReadFromStringArray(lines);
69            return new TileMap(tiles);
70        }
71       
72        /// <summary>
73        /// Asettaa oliot kenttään aiemmin annettujen merkkien perusteella.
74        /// </summary>
75        public void Insert()
76        {
77            double h = Game.Instance.Level.Height / tiles.GetLength(0);
78            double w = Game.Instance.Level.Width / tiles.GetLength(1);
79            Insert(w, h);
80        }
81
82        /// <summary>
83        /// Asettaa oliot kenttään aiemmin annettujen merkkien perusteella.
84        /// </summary>
85        /// <remarks>
86        /// Huom! Tiilien asettaminen muuttaa kentän kokoa. Jos lisäät kenttään reunat
87        /// tai zoomaat kameraa, tee se vasta tämän aliohjelman kutsun jälkeen.
88        /// </remarks>
89        /// <param name="tileWidth">Ruudun leveys.</param>
90        /// <param name="tileHeight">Ruudun korkeus.</param>
91        public void Insert( double tileWidth, double tileHeight )
92        {
93            Game game = Game.Instance;
94            int width = tiles.GetLength( 1 );
95            int height = tiles.GetLength( 0 );
96
97            game.Level.Width = width * tileWidth;
98            game.Level.Height = height * tileHeight;
99
100            for ( int y = height - 1; y >= 0; y-- )
101            {
102                for ( int x = 0; x < width; x++ )
103                {
104                    char symbol = tiles[y, x];
105                    if ( oldLegend.ContainsKey( symbol ) )
106                    {
107                        Func<GameObject> create = oldLegend[symbol];
108                        GameObject o = create();
109                        o.X = game.Level.Left + ( x * tileWidth ) + ( tileWidth / 2 );
110                        o.Y = game.Level.Top - ( y * tileHeight ) - ( tileHeight / 2 );
111                        game.Add( o );
112                    }
113                }
114            }
115        }
116
117        /// <summary>
118        /// Lukee kentän ruudut tiedostosta.
119        /// </summary>
120        /// <param name="path">Tiedoston polku</param>
121        /// <returns>Kentän ruudut kaksiulotteisessa taulukossa</returns>
122        internal static char[,] ReadFromFile( string path )
123        {
124            var tileBuffer = new List<char[]>();           
125
126            using (StreamReader input = File.OpenText(path))
127            {
128                string line;
129                while ( ( line = input.ReadLine() ) != null )
130                {
131                    tileBuffer.Add( line.ToCharArray() );
132                }
133            }
134
135            return ListToArray(tileBuffer);
136        }
137
138        internal static char[,] ReadFromStringArray(string[] lines)
139        {
140            var tileBuffer = new List<char[]>();
141
142            for (int i = 0; i < lines.Length; i++ )
143            {
144
145                tileBuffer.Add(lines[i].ToCharArray());
146
147            }
148
149            return ListToArray(tileBuffer);
150        }   
151
152        private static char[,] ListToArray(List<char[]> list)
153        {
154            int finalWidth = list.Max(cs => cs.Length);
155
156            char[,] tiles = new char[list.Count, finalWidth];
157
158            for (int y = 0; y < list.Count; y++)
159            {
160                char[] row = list.ElementAt(y);
161
162                for (int x = 0; x < row.Length; x++)
163                {
164                    tiles[y, x] = row[x];
165                }
166            }
167
168            return tiles;
169        }
170    }
171}
Note: See TracBrowser for help on using the repository browser.