Jypeli  5
The simple game programming library
TileMap.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.IO;
3 using System.Collections.Generic;
4 using System.Linq;
5 
6 namespace Jypeli
7 {
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 
26  public Func<GameObject> this[char c]
27  {
28  get { return oldLegend[c]; }
29  set { oldLegend[c] = value; }
30  }
31 
36  public TileMap( char[,] tiles )
37  : base(tiles)
38  {
39  }
40 
45  public static TileMap FromFile( string path )
46  {
47  char[,] tiles = ReadFromFile( path );
48  return new TileMap( tiles );
49  }
50 
55  public static TileMap FromStringArray(string[] lines)
56  {
57  char[,] tiles = ReadFromStringArray(lines);
58  return new TileMap(tiles);
59  }
60 
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 
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 
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 
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 }
override char Null
Definition: TileMap.cs:18
double X
Olion paikan X-koordinaatti.
double Y
Olion paikan Y-koordinaatti.
TileMap(char[,] tiles)
Luo uuden ruutukartan.
Definition: TileMap.cs:36
double Top
Kentän yläreunan y-koordinaatti.
Definition: Level.cs:160
static Game Instance
Definition: Game.cs:149
void Insert()
Asettaa oliot kenttään aiemmin annettujen merkkien perusteella.
Definition: TileMap.cs:75
void Add(IGameObject o)
Lisää olion peliin. Tavalliset oliot tulevat automaattisesti kerrokselle 0 ja ruutuoliot päällimmäise...
Definition: Game.cs:691
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
static TileMap FromStringArray(string[] lines)
Lukee ruutukentän merkkijonotaulukosta.
Definition: TileMap.cs:55
double Height
Kentän korkeus.
Definition: Level.cs:126
Level Level
Aktiivinen kenttä.
Definition: Game.cs:299
double Width
Kentän leveys.
Definition: Level.cs:117
static TileMap FromFile(string path)
Lukee ruutukentän tiedostosta.
Definition: TileMap.cs:45
static TileMap FromLevelAsset(string assetName)
Lukee ruutukentän Content-projektin tekstitiedostosta.
Definition: TileMap.cs:65
Ruutukartta, jonka avulla olioita voidaan helposti asettaa tasavälein ruudukkoon. Ruutukartta koostuu...
Definition: TileMap.cs:13
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: __GameObject.cs:54
void Insert(double tileWidth, double tileHeight)
Asettaa oliot kenttään aiemmin annettujen merkkien perusteella.
Definition: TileMap.cs:91
double Left
Kentän vasemman reunan x-koordinaatti.
Definition: Level.cs:144