2 using System.Collections.Generic;
3 using System.ComponentModel;
5 using System.Runtime.CompilerServices;
6 using Microsoft.Xna.Framework;
7 using Microsoft.Xna.Framework.Graphics;
11 using XnaColor = Microsoft.Xna.Framework.Color;
41 static readonly
Vector[] squareVertices =
52 static readonly Int16[] squareIndices =
61 static readonly
Vector[] triangleVertices =
65 new Vector( -0.5f, -0.5f ),
71 static readonly Int16[] triangleIndices = { 0, 1, 2 };
73 static readonly TextureCoordinates defaultCoords =
new TextureCoordinates()
75 TopLeft =
new Vector2(0.0f, 0.0f),
76 TopRight =
new Vector2(1.0f, 0.0f),
77 BottomLeft =
new Vector2(0.0f, 1.0f),
78 BottomRight =
new Vector2(1.0f, 1.0f),
82 private List<ParticleSystem> effects =
new List<ParticleSystem>();
84 private List<IGameObject> objectsWithImage =
new List<IGameObject>();
85 private List<IGameObject> objectsWithoutImage =
new List<IGameObject>();
86 private List<IGameObject> objectsWithDrawMethod =
new List<IGameObject>();
101 [EditorBrowsable(EditorBrowsableState.Never)]
111 get {
return _relativeTransition; }
112 set { _relativeTransition = value; }
146 effects.
Add( (ParticleSystem)obj );
150 objectsWithDrawMethod.Add( obj );
152 else if ( obj.
Image != null )
155 var index = objectsWithImage.FindLastIndex( o => o.Image.GetHashCode() == hash );
159 objectsWithImage.Add( obj );
164 objectsWithImage.Insert( index + 1, obj );
169 objectsWithoutImage.Add( obj );
178 effects.
Remove( (ParticleSystem)obj );
179 objectsWithDrawMethod.Remove( obj );
180 objectsWithImage.Remove( obj );
181 objectsWithoutImage.Remove( obj );
199 objectsWithImage.Clear();
200 objectsWithoutImage.Clear();
201 objectsWithDrawMethod.Clear();
207 ObjectCount.Value = Objects.
Count;
211 for (
int i = 0; i < effects.
Count; i++)
218 internal void Draw(
Camera camera)
228 DrawEfficientlyInNoParticularOrder(ref worldMatrix);
231 DrawInOrderFromFirstToLast(ref worldMatrix);
237 for (
int i = 0; i < effects.
Count; i++)
239 effects[i].Draw(worldMatrix);
244 DrawGrid( ref worldMatrix );
248 private void DrawGrid( ref Matrix matrix )
250 Graphics.LineBatch.Begin( ref matrix );
254 Vector topLeft = camera.ScreenToWorld(
new Vector( screen.Left, screen.Top ) );
255 Vector topRight = camera.ScreenToWorld(
new Vector( screen.Right, screen.Top ) );
256 Vector bottomLeft = camera.ScreenToWorld(
new Vector( screen.Left, screen.Bottom ) );
257 Vector bottomRight = camera.ScreenToWorld(
new Vector( screen.Right, screen.Bottom ) );
259 int horizontalCount = (int)Math.Ceiling( ( topRight.
X - topLeft.
X ) /
Grid.
CellSize.
X );
260 int leftmostLine = (int)Math.Ceiling( topLeft.
X /
Grid.
CellSize.
X );
263 for (
int i = 0; i < horizontalCount; i++ )
268 Graphics.LineBatch.Draw( startPoint, endPoint,
Grid.
Color );
271 int verticalCount = (int)Math.Ceiling( ( topRight.
Y - bottomRight.
Y ) /
Grid.
CellSize.
Y );
272 int bottommostLine = (int)Math.Ceiling( bottomRight.
Y /
Grid.
CellSize.
Y );
275 for (
int i = 0; i < verticalCount; i++ )
280 if ( y == 0.0 ) y += 0.1;
284 Graphics.LineBatch.Draw( startPoint, endPoint,
Grid.
Color );
287 Graphics.LineBatch.End();
290 private void DrawInOrderFromFirstToLast(ref Matrix worldMatrix)
294 for (
int i = 0; i < Objects.
Count; i++)
300 if ( o.IsVisible ) ( (CustomDrawable)o ).Draw( worldMatrix );
305 Draw( o, ref worldMatrix );
309 DrawChildObjects( worldMatrix );
314 private void DrawEfficientlyInNoParticularOrder(ref Matrix worldMatrix)
317 DrawObjectsWithoutImages( worldMatrix );
318 DrawObjectsWithImages( worldMatrix );
319 DrawCustomDrawables( worldMatrix );
320 DrawChildObjects( worldMatrix );
324 private void DrawObjectsWithoutImages( Matrix worldMatrix )
326 Graphics.ShapeBatch.Begin( ref worldMatrix );
327 for (
int i = 0; i < objectsWithoutImage.Count; i++)
329 var o = objectsWithoutImage[i];
335 bool isSimple = !hasChildObjects && !o.TextureFillsShape;
341 DrawShape( o, ref worldMatrix );
345 Draw( o, ref worldMatrix );
348 Graphics.ShapeBatch.End();
351 private void DrawObjectsWithImages( Matrix worldMatrix )
356 Graphics.ImageBatch.Begin( ref worldMatrix, null );
358 Image previousImage = null;
360 for (
int i = 0; i < objectsWithImage.Count; i++)
362 var o = objectsWithImage[i];
368 bool isSimple = !hasChildObjects && !o.TextureFillsShape;
372 if ( isSimple && ( o.Image != null ) )
374 if ( !Object.ReferenceEquals( o.Image, previousImage ) )
379 Graphics.ImageBatch.End();
380 Graphics.ImageBatch.Begin( ref worldMatrix, o.Image.XNATexture );
381 previousImage = o.Image;
383 DrawTexture( o, ref worldMatrix );
387 Draw( o, ref worldMatrix );
391 Graphics.ImageBatch.End();
394 private void DrawCustomDrawables( Matrix worldMatrix )
396 for (
int i = 0; i < objectsWithDrawMethod.Count; i++)
401 o.Draw( worldMatrix );
406 private void DrawChildObjects( Matrix worldMatrix )
410 for (
int i = 0; i < Objects.
Count; i++ )
416 if ( go.Shape.IsUnitSize )
419 Vector2 position =
new Vector2( (
float)go.Position.X, (
float)go.Position.Y );
420 Vector2 scale =
new Vector2( (
float)drawScale.
X, (
float)drawScale.
Y );
421 float rotation = go.RotateImage ? (float)go.Angle.Radians : 0;
423 Matrix childTransformation =
424 Matrix.CreateRotationZ( rotation )
425 * Matrix.CreateTranslation( position.X, position.Y, 0f )
432 for (
int j = 0; j < go._childObjects.Count; j++ )
434 Draw( go._childObjects[j], ref childTransformation );
441 private void DrawTexture(
IGameObject o, ref Matrix parentTransformation)
444 Vector2 scale =
new Vector2((
float)o.
Size.
X, (
float)o.
Size.
Y);
451 Graphics.ImageBatch.Draw( defaultCoords, position, scale, rotation );
457 float left = (float)( -wx / 2 + 0.5 );
458 float right = (float)( wx / 2 + 0.5 );
459 float top = (float)( -wy / 2 + 0.5 );
460 float bottom = (float)( wy / 2 + 0.5 );
462 TextureCoordinates customCoords =
new TextureCoordinates()
464 TopLeft =
new Vector2( left, top ),
465 TopRight =
new Vector2( right, top ),
466 BottomLeft =
new Vector2( left, bottom ),
467 BottomRight =
new Vector2( right, bottom ),
473 Graphics.ImageBatch.Draw( customCoords, position, scale, rotation );
480 Vector2 newScale =
new Vector2(
488 Vector2 newPosition = position +
new Vector2( ( topLeftX + x ) * newScale.X, ( topLeftY + y ) * newScale.Y );
489 Graphics.ImageBatch.Draw( customCoords, newPosition, newScale, rotation );
496 private void DrawShape(
IGameObject o, ref Matrix parentTransformation)
499 Vector2 scale =
new Vector2((
float)o.
Size.
X, (
float)o.
Size.
Y);
509 vertices = squareVertices;
510 indices = squareIndices;
514 vertices = triangleVertices;
515 indices = triangleIndices;
519 vertices =
new Vector[] { };
520 indices =
new Int16[] { };
523 Graphics.ShapeBatch.Draw(vertices, indices, o.
Color, position, scale, rotation);
527 private void Draw(
IGameObject o, ref Matrix parentTransformation)
534 Vector2 scale =
new Vector2((
float)drawScale.
X, (
float)drawScale.
Y);
539 Matrix transformation =
540 Matrix.CreateScale(scale.X, scale.Y, 1f)
541 * Matrix.CreateRotationZ(rotation)
542 * Matrix.CreateTranslation(position.X, position.Y, 0f)
543 * parentTransformation;
547 ((CustomDrawable)o).Draw(parentTransformation);
553 else if (o.
Image != null)
564 internal void GetObjectsAboutToBeAdded( List<IGameObject> result )
566 result.AddRange( Objects.GetObjectsAboutToBeAdded() );
static void DrawShape(Shape shape, ref Matrix transformation, ref Matrix textureTransformation, Image texture, Vector textureWrapSize, Color color)
Piirtää kuvion niin, että tekstuuri täyttää sen.
Jypelin sisäiset metodit ja propertyt joihin käyttäjän ei tarvitse päästä käsiksi kuuluvat tähän luokkaan...
Järjestelmä partikkelien käsittelyyn
static Layer CreateStaticLayer()
Luo staattisen kerroksen (ei liiku kameran mukana)
DrawOrder
Piirtojärjestys.
Vector RelativeTransition
Kuinka paljon tämän kerroksen olioiden paikka muuttuu kameran siirtyessä suhteessa muihin kerroksiin...
static void DrawImage(Image texture, ref Matrix matrix, Vector wrapSize)
void Update(Time time)
Lisää ja poistaa jonossa olevat elementit sekä kutsuu niiden Update-metodia.
static readonly Rectangle Rectangle
Suorakulmio.
double ZoomFactor
Kameran zoomauskerroin. Oletuksena 1.0. Mitä suurempi zoomauskerroin, sitä lähempänä kamera on (esim ...
Image Image
Olion kuva. Voi olla null, jolloin piirretään vain väri.
Rajapinta päivittyville olioille.
Rajapinta olioille, joilla on oma Draw-metodi.
static readonly Vector Zero
Nollavektori.
Mittari, joka mittaa double-tyyppisiä arvoja. Sidottavissa näyttöihin, kuten ValueDisplay ja BarGauge...
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Kamera. Määrittää mikä osa pelitasosta on kerralla näkyvissä.
static readonly Triangle Triangle
Tasasivuinen kolmio.
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
Vector Position
Kameran sijainti.
bool IgnoresZoom
Jättää kameran zoomin huomiotta jos asetettu.
Peliluokka reaaliaikaisille peleille.
Kerros. Vastaa olioiden piirtämisestä.
static readonly Vector Diagonal
Diagonaalivektori (1,1)
double Radians
Palauttaa tai asettaa kulman radiaaneina.
static bool LightingEnabled
Oliot piirretään siinä järjestyksessä missä ne on lisätty peliin.
Action< T > ItemAdded
Tapahtuu kun uusi elementti on lisätty listaan.
int Count
Kuinka monta elementtiä listassa nyt on. Ei laske mukaan samalla päivityskierroksella tehtyjä muutoks...
Yhteinen rajapinta kaikille peliolioille.
Luokka, joka sisältää metodeita kuvioiden ja tekstuurien piirtämiseen 2D-tasossa. ...
Synkroninen lista, eli lista joka päivittyy vasta kun sen Update-metodia kutsutaan. Jos listalle lisätään IUpdatable-rajapinnan toteuttavia olioita, kutsutaan myös niiden Update-metodeja samalla.
Camera Camera
Kamera, joka näyttää ruudulla näkyvän osan kentästä. Kameraa voidaan siirtää, zoomata tai asettaa seu...
Action< T > ItemRemoved
Tapahtuu kun elementti on poistettu listasta.
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
override int GetHashCode()
abstract bool IsUnitSize
If true, the shape must be scaled by the size of the object that has the shape. Typically, an unit-sized object has width and height of 1.0.