2using System.Collections.Generic;
14#pragma warning disable CS1591
20 public delegate
void TileMethod<T1, T2, T3, T4, T5>(
Vector position,
double width,
double height, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5);
21 public delegate
void TileMethod<T1, T2, T3, T4, T5, T6>(
Vector position,
double width,
double height, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6);
23 public delegate
void RouteMethod(List<Vector> route,
double width,
double height);
25#pragma warning restore CS1591
40 public void Invoke(
double tileWidth,
double tileHeight)
48 private List<TileMethodCall>
optimized =
new List<TileMethodCall>();
53 protected Dictionary<TileType, TileMethod>
legend =
new Dictionary<TileType, TileMethod>();
63 protected abstract TileType
Null {
get; }
72 if (
tiles.GetLength(0) == 0 ||
tiles.GetLength(1) == 0)
73 throw new ArgumentException(
"All dimensions of tiles must be at least 1");
83 get {
return tiles.GetLength(0); }
91 get {
return tiles.GetLength(1); }
117 legend[tileSymbol] = delegate (
Vector p,
double w,
double h) { f(p, w, h, p1); };
133 legend[tileSymbol] = delegate (
Vector p,
double w,
double h) { f(p, w, h, p1, p2); };
151 legend[tileSymbol] = delegate (
Vector p,
double w,
double h) { f(p, w, h, p1, p2, p3); };
169 public void SetTileMethod<T1, T2, T3, T4>(TileType tileSymbol,
TileMethod<T1, T2, T3, T4> f, T1 p1, T2 p2, T3 p3, T4 p4)
171 legend[tileSymbol] = delegate (
Vector p,
double w,
double h) { f(p, w, h, p1, p2, p3, p4); };
191 public void SetTileMethod<T1, T2, T3, T4, T5>(TileType tileSymbol,
TileMethod<T1, T2, T3, T4, T5> f, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
193 legend[tileSymbol] = delegate (
Vector p,
double w,
double h) { f(p, w, h, p1, p2, p3, p4, p5); };
215 public void SetTileMethod<T1, T2, T3, T4, T5, T6>(TileType tileSymbol,
TileMethod<T1, T2, T3, T4, T5, T6> f, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
217 legend[tileSymbol] = delegate (
Vector p,
double w,
double h) { f(p, w, h, p1, p2, p3, p4, p5, p6); };
231 if (tileSymbols ==
null || tileSymbols.Length < 1)
232 throw new ArgumentException(
"Pass at least one tile symbol!");
235 int vectorsAdded = 0;
237 for (
int i = 0; i < tileSymbols.Length; i++)
240 legend[tileSymbols[i]] = delegate (
Vector p,
double w,
double h)
242 vectorTable[index] = p;
243 if (++vectorsAdded >= tileSymbols.Length)
244 f(vectorTable.ToList(), w, h);
272 public void Execute(
double tileWidth,
double tileHeight)
275 int width =
tiles.GetLength(1);
276 int height =
tiles.GetLength(0);
283 m.Invoke(tileWidth, tileHeight);
286 for (
int y = height - 1; y >= 0; y--)
288 for (
int x = 0; x < width; x++)
294 double realX = game.Level.Left + (x * tileWidth) + (tileWidth / 2);
295 double realY = game.Level.Top - (y * tileHeight) - (tileHeight / 2);
296 method(
new Vector(realX, realY), tileWidth, tileHeight);
309 if (symbol.Equals(
Null))
return null;
311 foreach (var key
in legend.Keys)
338 for (
int i = 0; i < symbols.Length; i++)
352 throw new ArgumentException(
"Symbol " + sym +
" not added, cannot optimize.");
354 for (
int row = 0; row <
RowCount; row++)
363 TileMethod newMethod = delegate (
Vector oldPos,
double oldWidth,
double oldHeight)
366 Vector newAdjust =
new Vector(oldWidth * w, -oldHeight * h);
367 Vector newPos = oldPos + (oldAdjust + newAdjust) / 2;
368 method(newPos, oldWidth * w, oldHeight * h);
380 for (width = 0; width <
ColumnCount - col; width++)
392 for (height = 1; height <
RowCount - row; height++)
394 if (!
RowEquals(row + height, col, width, sym))
399 private bool RowEquals(
int row,
int col,
int length, TileType sym)
401 for (
int i = col; i < col + length; i++)
409 private void SetArea(
int row,
int col,
int width,
int height, TileType sym)
411 for (
int j = row; j < row + height; j++)
413 for (
int i = col; i < col + width; i++)
427 return tiles.GetLength(dimension);
438 return tiles[row, col];
448 public void SetTile(
int row,
int col, TileType c)
462 return new TileMethod(delegate (
Vector p,
double w,
double h) { m(p, newWidth, newHeight); });
474 return new TileMethod(delegate (
Vector p,
double w,
double h) { m(p, w * widthMultiplier, h * heightMultiplier); });
Abstrakti ruutukartta. Tätä luokkaa et voi muodostaa. Katso ColorTileMap ja TileMap
void SetTileMethod< T1, T2, T3, T4, T5, T6 >(TileType tileSymbol, TileMethod< T1, T2, T3, T4, T5, T6 > f, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f....
void SetTileMethod< T1, T2, T3, T4, T5 >(TileType tileSymbol, TileMethod< T1, T2, T3, T4, T5 > f, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f....
delegate void TileMethod(Vector position, double width, double height)
delegate void TileMethod< T1, T2 >(Vector position, double width, double height, T1 p1, T2 p2)
void Execute()
Käy kentän kaikki merkit läpi ja kutsuu SetTileMethod-metodilla annettuja aliohjelmia kunkin merkin k...
delegate void TileMethod< T1, T2, T3, T4, T5, T6 >(Vector position, double width, double height, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
static TileMethod ChangeSizeMultiplier(TileMethod m, double widthMultiplier, double heightMultiplier)
Muuttaa luontialiohjelman tekemän olion kokoa tietyllä kertoimilla.
static TileMethod ChangeSize(TileMethod m, double newWidth, double newHeight)
Muuttaa luontialiohjelman tekemän olion kokoa.
TileType GetTile(int row, int col)
Palauttaa ruudussa olevan symbolin.
void SetTileMethod< T1 >(TileType tileSymbol, TileMethod< T1 > f, T1 p1)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f....
delegate void RouteMethod(List< Vector > route, double width, double height)
delegate void TileMethod< T1, T2, T3, T4, T5 >(Vector position, double width, double height, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
void SetTileMethod< T1, T2 >(TileType tileSymbol, TileMethod< T1, T2 > f, T1 p1, T2 p2)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f....
int GetLength(int dimension)
Palauttaa annetun dimension pituuden (merkkeinä, ei pikseleinä).
void GetGreatestMatchingRectangle(TileType sym, int row, int col, out int width, out int height)
List< TileMethodCall > optimized
delegate void TileMethod< T1, T2, T3, T4 >(Vector position, double width, double height, T1 p1, T2 p2, T3 p3, T4 p4)
void Optimize(params TileType[] symbols)
Optimoi annetut ruudut niin, että useammat vierekkäiset oliot yhdistetään isommiksi olioiksi....
TileMethod GetMethodForSymbol(TileType symbol)
Antaa ruutukartan symbolia vastaavan metodin
delegate void TileMethod< T1, T2, T3 >(Vector position, double width, double height, T1 p1, T2 p2, T3 p3)
void SetArea(int row, int col, int width, int height, TileType sym)
bool RowEquals(int row, int col, int length, TileType sym)
void Execute(double tileWidth, double tileHeight)
Käy kentän kaikki merkit läpi ja kutsuu SetTileMethod-metodilla annettuja aliohjelmia kunkin merkin k...
void SetTileMethod(TileType tileSymbol, TileMethod f)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f....
Dictionary< TileType, TileMethod > legend
Ruutuja vastaavat metodit
void SetRouteMethod(RouteMethod f, params TileType[] tileSymbols)
Kokoaa reitin useammasta ruutukentän symbolista.
abstract TileType Null
Tyhjä ruutumerkki
int ColumnCount
Sarakkeiden määrä kentässä (vaakasuoraan).
void Optimize(TileType sym)
Optimoi annetut ruudut niin, että useammat vierekkäiset oliot yhdistetään isommiksi olioiksi....
AbstractTileMap(TileType[,] tiles)
Ruutukartan oletusmuodostaja. Tätä luokkaa et voi muodostaa.
int RowCount
Rivien määrä kentässä (pystysuoraan).
delegate void TileMethod< T1 >(Vector position, double width, double height, T1 p1)
void SetTile(int row, int col, TileType c)
Asettaa ruudussa olevan symbolin.
virtual bool SymbolEquals(TileType a, TileType b)
Ovatko ruutukartan merkit samat
void SetTileMethod< T1, T2, T3 >(TileType tileSymbol, TileMethod< T1, T2, T3 > f, T1 p1, T2 p2, T3 p3)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f....
void SetTileMethod< T1, T2, T3, T4 >(TileType tileSymbol, TileMethod< T1, T2, T3, T4 > f, T1 p1, T2 p2, T3 p3, T4 p4)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f....
Level Level
Aktiivinen kenttä.
static Game Instance
Käynnissä olevan pelin pääolio.
double Top
Kentän yläreunan y-koordinaatti.
double Left
Kentän vasemman reunan x-koordinaatti.
double Width
Kentän leveys.
double Height
Kentän korkeus.
TileMethodCall(TileMethod m, int row, int col)
void Invoke(double tileWidth, double tileHeight)