2 using System.Collections.Generic;
10 public delegate
void TileMethod(
Vector position,
double width,
double height );
15 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 );
16 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 );
22 public delegate
void TileMethodWithPos<T1, T2, T3, T4>(
Vector position,
double width,
double height,
IntPoint positionInLevelArray, T1 p1, T2 p2, T3 p3, T4 p4);
23 public delegate
void TileMethodWithPos<T1, T2, T3, T4, T5>(
Vector position,
double width,
double height,
IntPoint positionInLevelArray, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5);
24 public delegate
void TileMethodWithPos<T1, T2, T3, T4, T5, T6>(
Vector position,
double width,
double height,
IntPoint positionInLevelArray, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6);
30 public TileMethodWithPos method;
34 public TileMethodCall( TileMethodWithPos m,
int row,
int col )
41 public void Invoke(
double tileWidth,
double tileHeight )
45 method(
new Vector( realX, realY ), tileWidth, tileHeight,
new IntPoint(row, col));
49 private List<TileMethodCall> optimized =
new List<TileMethodCall>();
50 protected Dictionary<TileType, TileMethodWithPos>
legend =
new Dictionary<TileType, TileMethodWithPos>();
53 protected abstract TileType
Null {
get; }
57 if ( tiles.GetLength( 0 ) == 0 || tiles.GetLength( 1 ) == 0 )
58 throw new ArgumentException(
"All dimensions of tiles must be at least 1" );
68 get {
return tiles.GetLength( 0 ); }
76 get {
return tiles.GetLength( 1 ); }
88 legend[tileSymbol] = f;
102 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel ) { f( p, w, h, posInLevel, p1 ); };
118 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel) { f(p, w, h, posInLevel, p1, p2); };
134 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel) { f(p, w, h, posInLevel, p1, p2, p3); };
148 public void SetTileMethod<T1, T2, T3, T4>(TileType tileSymbol,
TileMethodWithPos<T1, T2, T3, T4> f, T1 p1, T2 p2, T3 p3, T4 p4)
150 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel) { f(p, w, h, posInLevel, p1, p2, p3, p4); };
164 public void SetTileMethod<T1, T2, T3, T4, T5>(TileType tileSymbol,
TileMethodWithPos<T1, T2, T3, T4, T5> f, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
166 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel) { f(p, w, h, posInLevel, p1, p2, p3, p4, p5); };
180 public void SetTileMethod<T1, T2, T3, T4, T5, T6>(TileType tileSymbol,
TileMethodWithPos<T1, T2, T3, T4, T5, T6> f, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
182 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel) { f(p, w, h, posInLevel, p1, p2, p3, p4, p5, p6); };
196 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel ) { f( p, w, h ); };
210 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel ) { f( p, w, h, p1 ); };
226 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel ) { f( p, w, h, p1, p2 ); };
242 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel ) { f( p, w, h, p1, p2, p3 ); };
256 public void SetTileMethod<T1, T2, T3, T4>( TileType tileSymbol,
TileMethod<T1, T2, T3, T4> f, T1 p1, T2 p2, T3 p3, T4 p4 )
258 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel ) { f( p, w, h, p1, p2, p3, p4 ); };
272 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 )
274 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel ) { f( p, w, h, p1, p2, p3, p4, p5 ); };
288 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 )
290 legend[tileSymbol] = delegate(
Vector p,
double w,
double h,
IntPoint posInLevel ) { f( p, w, h, p1, p2, p3, p4, p5, p6 ); };
318 public void Execute(
double tileWidth,
double tileHeight )
321 int width = tiles.GetLength( 1 );
322 int height = tiles.GetLength( 0 );
327 foreach ( var m
in optimized )
329 m.Invoke( tileWidth, tileHeight );
332 for (
int y = height - 1; y >= 0; y-- )
334 for (
int x = 0; x < width; x++ )
338 if ( method != null )
340 double realX = game.Level.Left + ( x * tileWidth ) + ( tileWidth / 2 );
341 double realY = game.Level.Top - ( y * tileHeight ) - ( tileHeight / 2 );
342 method(
new Vector( realX, realY ), tileWidth, tileHeight,
new IntPoint(x, y));
350 if ( symbol.Equals(
Null) )
return null;
352 foreach ( var key
in legend.Keys )
363 return a.Equals( b );
373 for (
int i = 0; i < symbols.Length; i++ )
387 throw new ArgumentException(
"Symbol " + sym +
" not added, cannot optimize.");
389 for (
int row = 0; row <
RowCount; row++ )
394 GetGreatestMatchingRectangle( sym, row, col, out w, out h );
396 if ( w > 0 && h > 0 )
398 TileMethodWithPos newMethod = delegate (
Vector oldPos,
double oldWidth,
double oldHeight,
IntPoint oldPosInLevel)
401 Vector newAdjust =
new Vector(oldWidth * w, -oldHeight * h);
402 Vector newPos = oldPos + ( oldAdjust + newAdjust ) / 2;
403 method( newPos, oldWidth * w, oldHeight * h,
new IntPoint(row, col));
405 optimized.Add(
new TileMethodCall( newMethod, row, col ) );
406 SetArea( row, col, w, h,
Null );
413 private void GetGreatestMatchingRectangle( TileType sym,
int row,
int col, out
int width, out
int height )
415 for ( width = 0; width <
ColumnCount - col; width++ )
427 for ( height = 1; height <
RowCount - row; height++ )
429 if ( !RowEquals( row + height, col, width, sym ) )
434 private bool RowEquals(
int row,
int col,
int length, TileType sym )
436 for (
int i = col; i < col + length; i++ )
438 if ( !
SymbolEquals( tiles[row, i], sym ) )
return false;
444 private void SetArea(
int row,
int col,
int width,
int height, TileType sym )
446 for (
int j = row; j < row + height; j++ )
448 for (
int i = col; i < col + width; i++ )
462 return tiles.GetLength( dimension );
473 return tiles[row,col];
483 public void SetTile(
int row,
int col, TileType c )
495 public static TileMethodWithPos
ChangeSize( TileMethodWithPos m,
double newWidth,
double newHeight )
507 public static TileMethodWithPos
ChangeSizeMultiplier( TileMethodWithPos m,
double widthMultiplier,
double heightMultiplier )
509 return new TileMethodWithPos( delegate(
Vector p,
double w,
double h,
IntPoint posInLevel) { m( p, w * widthMultiplier, h * heightMultiplier, posInLevel ); } );
void Optimize(TileType sym)
Optimoi annetut ruudut niin, että useammat vierekkäiset oliot yhdistetään isommiksi olioiksi...
delegate void TileMethodWithPos< T1, T2, T3, T4 >(Vector position, double width, double height, IntPoint positionInLevelArray, T1 p1, T2 p2, T3 p3, T4 p4)
int ColumnCount
Sarakkeiden määrä kentässä (vaakasuoraan).
static TileMethodWithPos ChangeSize(TileMethodWithPos m, double newWidth, double newHeight)
Muuttaa luontialiohjelman tekemän olion kokoa.
double Top
Kentän yläreunan y-koordinaatti.
TileMethodWithPos GetMethodForSymbol(TileType symbol)
void SetTileMethod< T1 >(TileType tileSymbol, TileMethodWithPos< T1 > f, T1 p1)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f...
void SetTileMethod< T1, T2, T3 >(TileType tileSymbol, TileMethodWithPos< 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, T5 >(TileType tileSymbol, TileMethodWithPos< 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...
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 >(Vector position, double width, double height, T1 p1, T2 p2, T3 p3)
void SetTileMethod(TileType tileSymbol, TileMethod f)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f...
delegate void TileMethodWithPos(Vector position, double width, double height, IntPoint positionInLevelArray)
Piste kokonaislukuruudukossa.
void SetTileMethod< T1, T2 >(TileType tileSymbol, TileMethodWithPos< 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 SetTile(int row, int col, TileType c)
Asettaa ruudussa olevan symbolin.
delegate void TileMethod< T1 >(Vector position, double width, double height, T1 p1)
Peliluokka reaaliaikaisille peleille.
AbstractTileMap(TileType[,] tiles)
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)
delegate void TileMethodWithPos< T1, T2, T3 >(Vector position, double width, double height, IntPoint positionInLevelArray, T1 p1, T2 p2, T3 p3)
delegate void TileMethod(Vector position, double width, double height)
static TileMethodWithPos ChangeSizeMultiplier(TileMethodWithPos m, double widthMultiplier, double heightMultiplier)
Muuttaa luontialiohjelman tekemän olion kokoa tietyllä kertoimilla.
void SetTileMethod(TileType tileSymbol, TileMethodWithPos f)
Määrittää, että tietyn ruutukentän symbolin (tileSymbol) kohdalla kutsutaan aliohjelmaa f...
void SetTileMethod< T1, T2, T3, T4, T5, T6 >(TileType tileSymbol, TileMethodWithPos< 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...
double Height
Kentän korkeus.
Level Level
Aktiivinen kenttä.
delegate void TileMethod< T1, T2 >(Vector position, double width, double height, T1 p1, T2 p2)
int RowCount
Rivien määrä kentässä (pystysuoraan).
delegate void TileMethod< T1, T2, T3, T4, T5 >(Vector position, double width, double height, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
delegate void TileMethodWithPos< T1, T2 >(Vector position, double width, double height, IntPoint positionInLevelArray, T1 p1, T2 p2)
double Width
Kentän leveys.
delegate void TileMethodWithPos< T1 >(Vector position, double width, double height, IntPoint positionInLevelArray, T1 p1)
delegate void TileMethodWithPos< T1, T2, T3, T4, T5 >(Vector position, double width, double height, IntPoint positionInLevelArray, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
delegate void TileMethodWithPos< T1, T2, T3, T4, T5, T6 >(Vector position, double width, double height, IntPoint positionInLevelArray, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
TileType GetTile(int row, int col)
Palauttaa ruudussa olevan symbolin.
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...
virtual bool SymbolEquals(TileType a, TileType b)
void Execute(double tileWidth, double tileHeight)
Käy kentän kaikki merkit läpi ja kutsuu SetTileMethod-metodilla annettuja aliohjelmia kunkin merkin k...
Dictionary< TileType, TileMethodWithPos > legend
void SetTileMethod< T1, T2, T3, T4 >(TileType tileSymbol, TileMethodWithPos< 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...
double Left
Kentän vasemman reunan x-koordinaatti.