2 using System.Collections.Generic;
14 double[] heights = null;
32 public Surface(
double width,
double[] heights,
double scale )
33 : this( width, heights, scale, CalculateShapeParams( width, heights ) )
38 : base( width, CalculateHeight( heights, scale ), CreateRuggedShape( width, heights, scale ), shapeParameters )
40 InitializeRugged( heights, scale );
48 public Surface(
double width,
double height )
51 InitializeFlat( height );
57 InitializeFlat( height );
60 private void InitializeFlat(
double height )
62 this.heights =
new double[1] { height };
70 private void InitializeRugged(
double[] heights,
double scale )
72 this.heights = heights;
87 public Surface(
double width,
double min,
double max,
int points )
88 : this( width,
RandomGen.NextDoubleArray( Math.Max( min, 1.0f ), max, points ), 1.0 )
93 : this( width,
RandomGen.NextDoubleArray( Math.Max( min, 1.0f ), max, points ), 1.0, shapeParameters )
106 public Surface(
double width,
double min,
double max,
int points,
int maxchange )
107 : this( width,
RandomGen.NextDoubleArray( Math.Max( min, 1.0f ), max, points, maxchange ), 1.0 )
112 : this( width,
RandomGen.NextDoubleArray( Math.Max(min, 1.0f), max, points, maxchange ), 1.0, shapeParameters )
118 #region Static private methods for constructors 120 private static double CalculateHeight(
double[] heights,
double scale )
122 if ( heights.Length < 2 )
123 throw new Exception(
"At least two Y-points needed in order to create ground" );
124 if ( heights.Min() < 1 )
125 throw new Exception(
"The heights must be positive and at least 1" );
127 return heights.Max() * scale;
130 private static Vector[] CalculateVertexes(
double width,
double[] heights,
double scale )
132 int n = heights.Length;
133 double step = width / ( n - 1 );
134 double maxHeight = heights.
Max() * scale;
138 double halfHeight = maxHeight / 2;
143 Vector bottomRight =
new Vector( width / 2, -halfHeight );
146 for (
int i = 0; i < n; i++ )
148 vertexes[i] =
new Vector( bottomRight.
X - ( i * step ), bottomRight.
Y );
151 double left = -width / 2;
154 for (
int i = 0; i < n; i++ )
156 vertexes[n + i] =
new Vector( left + ( i * step ), heights[i] * scale - halfHeight );
162 private static Polygon CreateRuggedShape(
double width,
double[] heights,
double scale )
164 Vector[] vertexes = CalculateVertexes( width, heights, scale );
165 return CreateShape( width, heights, vertexes );
168 private static Polygon CreateShape(
double width,
double[] heights,
Vector[] vertexes )
170 int n = heights.Length;
171 double step = width / ( n - 1 );
173 Int16[] outlineIndices =
new Int16[n * 2];
175 for (
int i = 0; i < n * 2; i++ )
176 outlineIndices[i] = (Int16)i;
177 for (
int i = 0; i < n - 1; i++ )
179 triangles[2 * i] =
new IndexTriangle( i, 2 * n - i - 2, 2 * n - i - 1 );
180 triangles[2 * i + 1] =
new IndexTriangle( i, i + 1, 2 * n - i - 2 );
183 Vector[] outlineVertices =
new Vector[outlineIndices.Length];
184 for (
int i = 0; i < outlineIndices.Length; i++ )
185 outlineVertices[i] = vertexes[outlineIndices[i]];
187 return new Polygon(
new ShapeCache( vertexes, triangles, outlineIndices ),
false );
190 private static double GetMinHeightDifference(
double[] heights )
192 int n = heights.Length;
193 double minHeightDifference =
double.PositiveInfinity;
195 for (
int i = 0; i < n - 1; i++ )
197 double diff = Math.Abs( heights[i + 1] - heights[i] );
198 if ( diff >
double.Epsilon && diff < minHeightDifference ) minHeightDifference = diff;
201 return minHeightDifference;
206 int n = heights.Length;
207 double step = width / ( n - 1 );
217 #region Factory methods 285 double thickness = level.GetBorderThickness();
335 double thickness = level.GetBorderThickness();
385 double thickness = level.GetBorderThickness();
435 double thickness = level.GetBorderThickness();
476 #region Public methods 480 if ( heights == null || x < Left || x >
Right )
return Top;
482 int n = heights.Length;
483 double step =
Width / ( n - 1 );
484 double maxHeight = heights.Max() * scale;
486 double indexX = (
Width / 2 + x ) / step;
487 int lowerIndex = (int)Math.Floor( indexX );
488 int upperIndex = (int)Math.Ceiling( indexX );
490 if ( upperIndex >= n )
return Top;
491 if ( lowerIndex == upperIndex )
return Bottom + scale * heights[lowerIndex];
493 double k = ( heights[upperIndex] - heights[lowerIndex] ) / step;
494 double relX = (
Width / 2 + x ) % step;
496 return Bottom + heights[lowerIndex] + relX * k;
503 int n = heights.Length;
504 double step =
Width / ( n - 1 );
505 double maxHeight = heights.Max() * scale;
507 double indexX = (
Width / 2 + x ) / step;
508 int lowerIndex = (int)Math.Floor( indexX );
509 int upperIndex = (int)Math.Ceiling( indexX );
512 if ( lowerIndex == upperIndex )
517 double k = ( heights[upperIndex] - heights[lowerIndex] ) / step;
static Direction Down
Suunta alas.
void MakeStatic()
Tekee oliosta staattisen. Staattinen olio ei liiku muiden olioiden törmäyksistä, vaan ainoastaan muut...
Surface(double width, double[] heights, double scale, CollisionShapeParameters shapeParameters)
Vector GetGroundNormal(double x)
Surface(double width, double min, double max, int points, CollisionShapeParameters shapeParameters)
static Surface CreateBottom(Level level)
Luo kentälle tasaisen alareunan. Ei lisää reunaa automaattisesti kenttään.
double Right
Olion oikean reunan x-koordinaatti.
Suuntakulma (rajoitettu -180 ja 180 asteen välille) asteina ja radiaaneina. Tietoja kulmasta: http://...
double Top
Kentän yläreunan y-koordinaatti.
static Direction Left
Suunta vasemmalle.
Surface(double width, double min, double max, int points, int maxchange)
Luo satunnaisen pinnan.
Satunnaisgeneraattori. Luo satunnaisia arvoja, mm. lukuja, vektoreita sekä kulmia.
static Surface Create(Level level, Direction direction)
Luo kentälle tasaisen reunan. Ei lisää reunaa automaattisesti kenttään.
double DistanceGridSpacing
static Surface CreateRight(Level level)
Luo kentälle tasaisen oikean reunan. Ei lisää reunaa automaattisesti kenttään.
static readonly Vector UnitY
Pystysuuntainen yksikkövektori (pituus 1, suunta ylös).
Surface(double width, double[] heights, double scale)
Helppo tapa lisätä kenttään epätasainen pinta. Pinta kuvataan luettelemalla Y-koordinaatteja vasemmal...
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
static Surface CreateBottom(Level level, double min, double max, int points)
Luo kentälle epätasaisen alareunan. Ei lisää reunaa automaattisesti kenttään.
Törmäyskuvion laatuun vaikuttavat parametrit.
override Angle Angle
Kulma, jossa olio on. Oliota voi pyörittää kulmaa vaihtamalla.
bool TextureFillsShape
Jos true, kuva piirretään niin, ettei se mene olion muodon ääriviivojen yli. Toisin sanoen kuva piirr...
double Bottom
Olion alareunan y-koordinaatti.
Surface(double width, double height, CollisionShapeParameters shapeParameters)
double Top
Olion yläreunan y-koordinaatti.
readonly Vector Center
Kentän keskipiste.
static readonly Angle RightAngle
Suora kulma (90 astetta).
static readonly Angle StraightAngle
Oikokulma (180 astetta).
static Surface CreateTop(Level level, double min, double max, int points)
Luo kentälle epätasaisen yläreunan. Ei lisää reunaa automaattisesti kenttään.
Pelikenttä, johon voi lisätä olioita. Kentällä voi myös olla reunat ja taustaväri tai taustakuva...
Sisältää valmiiksi lasketut kolmiot, joiden avulla piirtäminen on suoraviivaista. ...
static Surface CreateBottom(Level level, double min, double max, int points, int maxchange)
Luo kentälle epätasaisen alareunan. Ei lisää reunaa automaattisesti kenttään.
static Surface CreateTop(Level level, double min, double max, int points, int maxchange)
Luo kentälle epätasaisen yläreunan. Ei lisää reunaa automaattisesti kenttään.
static Surface CreateRight(Level level, double min, double max, int points, int maxchange)
Luo kentälle epätasaisen oikean reunan. Ei lisää reunaa automaattisesti kenttään. ...
Surface(double width, double min, double max, int points, int maxchange, CollisionShapeParameters shapeParameters)
Tasainen tai epätasainen pinta.
double Bottom
Kentän alareunan y-koordinaatti.
static Surface CreateLeft(Level level, double min, double max, int points, int maxchange)
Luo kentälle epätasaisen vasemman reunan. Ei lisää reunaa automaattisesti kenttään.
static Surface CreateRight(Level level, double min, double max, int points)
Luo kentälle epätasaisen oikean reunan. Ei lisää reunaa automaattisesti kenttään. ...
Surface(double width, double min, double max, int points)
Luo satunnaisen pinnan.
static Surface CreateLeft(Level level)
Luo kentälle tasaisen vasemman reunan. Ei lisää reunaa automaattisesti kenttään.
double Height
Kentän korkeus.
static Vector Max(params Vector[] vectors)
Palauttaa pisimmän vektorin.
static Surface Create(Level level, Direction direction, double min, double max, int points)
Luo kentälle epätasaisen reunan. Ei lisää reunaa automaattisesti kenttään.
static Surface CreateTop(Level level)
Luo kentälle tasaisen yläreunan. Ei lisää reunaa automaattisesti kenttään.
double Width
Kentän leveys.
override Vector Position
Olion paikka koordinaatistossa. Käsittää sekä X- että Y-koordinaatin.
static Angle ArcTan(double d)
Palauttaa kulman joka vastaa d:n arcus-tangentti.
static Surface Create(Level level, Direction direction, double min, double max, int points, int maxchange)
Luo kentälle epätasaisen reunan. Ei lisää reunaa automaattisesti kenttään.
static Direction Right
Suunta oikealle.
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
static Direction Up
Suunta ylös.
double Right
Kentän oikean reunan x-koordinaatti.
static Surface CreateLeft(Level level, double min, double max, int points)
Luo kentälle epätasaisen vasemman reunan. Ei lisää reunaa automaattisesti kenttään.
Surface(double width, double height)
Luo tasaisen pinnan.
static readonly Color ForestGreen
Metsänvihreä.
Muotojen määrityksessä käytettävä kolmio.
double GetGroundHeight(double x)
double Left
Kentän vasemman reunan x-koordinaatti.