Jypeli  5
The simple game programming library
DebugScreen.cs
Siirry tämän tiedoston dokumentaatioon.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Jypeli.Widgets;
6 using Microsoft.Xna.Framework;
7 
8 namespace Jypeli
9 {
10  public partial class Game
11  {
12  private string fpsText = "00";
13  private int fpsSkipCounter;
14  private Canvas debugCanvas;
15  private Matrix canvasTransform = Matrix.Identity;
16 
21  public Layer DebugLayer { get; private set; }
22 
26  public bool DebugKeyEnabled { get; set; }
27 
31  public bool DebugScreenVisible { get; set; }
32 
36  public Window FPSWindow { get; private set; }
37 
41  public Label FPSDisplay { get; private set; }
42 
46  public Window LayerWindow { get; private set; }
47 
51  public Label LayerDisplay { get; private set; }
52 
53  private void InitDebugScreen()
54  {
55  debugCanvas = new Canvas();
56 
58  DebugLayer.Objects.ItemAdded += OnObjectAdded;
59  DebugLayer.Objects.ItemRemoved += OnObjectRemoved;
60 
61  FPSWindow = new Window();
62  FPSWindow.IsModal = false;
63  FPSWindow.Color = new Color( Color.HotPink, 100 );
64  DebugLayer.Add( FPSWindow );
65 
66  FPSDisplay = new Label( "00" );
68  FPSWindow.Size = 1.5 * FPSDisplay.Size;
70 
73 
74  LayerWindow = new Window();
75  LayerWindow.IsModal = false;
76  LayerWindow.Color = new Color( Color.Blue, 100 );
77  DebugLayer.Add( LayerWindow );
78 
79  LayerDisplay = new Label( "Layers: no data" );
84  LayerWindow.Top = Screen.Top - 200;
85 
86  DebugKeyEnabled = true;
87  DebugScreenVisible = false;
88  }
89 
90  private StringBuilder layerTextBuilder = new StringBuilder();
91  private const string layerTextTitle = "Layers:\n";
92 
93  private void UpdateDebugScreen( Time time )
94  {
95  if ( DebugKeyEnabled && Keyboard.GetKeyState( Key.F12 ) == ButtonState.Pressed )
97 
98  DebugLayer.Update( time );
99 
100  if ( !DebugScreenVisible )
101  return;
102 
103  if ( fpsSkipCounter++ > 10 )
104  {
105  fpsSkipCounter = 0;
106  fpsText = ( 1.0 / Time.SinceLastUpdate.TotalSeconds ).ToString( "F2" );
107  }
108 
109  FPSDisplay.Text = fpsText;
110 
111  layerTextBuilder.Clear();
112  layerTextBuilder.Append( layerTextTitle );
113 
114  for (int i = Layers.FirstIndex; i <= Layers.LastIndex; i++)
115  {
116  layerTextBuilder.Append( "[" );
117  layerTextBuilder.Append( i );
118  layerTextBuilder.Append( "]: " );
119  layerTextBuilder.Append( Layers[i].Objects.Count );
120  layerTextBuilder.AppendLine();
121  }
122 
123  LayerDisplay.Text = layerTextBuilder.ToString();
125  }
126 
127  private void DrawDebugScreen()
128  {
129  if ( !DebugScreenVisible )
130  return;
131 
132  debugCanvas.Begin( ref canvasTransform, Game.Screen );
133  PaintDebugScreen( debugCanvas );
134  debugCanvas.End();
135 
136  DebugLayer.Draw( Camera );
137  }
138 
139  private void PaintShapeOutlines( Canvas canvas, IGameObject obj )
140  {
141  var vertexes = obj.Shape.Cache.OutlineVertices;
142  double wmul = obj.Shape.IsUnitSize ? obj.Width : 1;
143  double hmul = obj.Shape.IsUnitSize ? obj.Height : 1;
144 
145  canvas.BrushColor = ( obj is GameObject && Mouse.IsCursorOn( (GameObject)obj ) ) ? Color.LightGreen : Color.LightGray;
146 
147  Vector3 center = (Vector3)Camera.WorldToScreen( obj.AbsolutePosition, obj.Layer );
148  Matrix transform = Matrix.CreateScale( (float)( Camera.ZoomFactor ) ) * Matrix.CreateRotationZ( (float)obj.AbsoluteAngle.Radians ) * Matrix.CreateTranslation( center );
149 
150  for ( int j = 0; j < vertexes.Length - 1; j++ )
151  {
152  double x1 = wmul * vertexes[j].X;
153  double y1 = hmul * vertexes[j].Y;
154  double x2 = wmul * vertexes[j + 1].X;
155  double y2 = hmul * vertexes[j + 1].Y;
156 
157  var t1 = Vector2.Transform( new Vector2( (float)x1, (float)y1 ), transform );
158  var t2 = Vector2.Transform( new Vector2( (float)x2, (float)y2 ), transform );
159 
160  canvas.DrawLine( t1.X, t1.Y, t2.X, t2.Y );
161  }
162 
163  if ( vertexes.Length > 2 )
164  {
165  double x1 = wmul * vertexes[vertexes.Length - 1].X;
166  double y1 = hmul * vertexes[vertexes.Length - 1].Y;
167  double x2 = wmul * vertexes[0].X;
168  double y2 = hmul * vertexes[0].Y;
169 
170  var t1 = Vector2.Transform( new Vector2( (float)x1, (float)y1 ), transform );
171  var t2 = Vector2.Transform( new Vector2( (float)x2, (float)y2 ), transform );
172 
173  canvas.DrawLine( t1.X, t1.Y, t2.X, t2.Y );
174  }
175  }
176 
177  private void PaintPhysicsOutlines( Canvas canvas, PhysicsObject obj )
178  {
179  if ( obj.Body == null || obj.Body.Shape == null || obj.Shape.Cache == null )
180  return;
181 
182  var vertexes = obj.Shape.Cache.OutlineVertices;
183  double wmul = obj.Shape.IsUnitSize ? obj.Width : 1;
184  double hmul = obj.Shape.IsUnitSize ? obj.Height : 1;
185 
186  canvas.BrushColor = ( obj is GameObject && Mouse.IsCursorOn( (GameObject)obj ) ) ? Color.Salmon : Color.DarkRed;
187 
188  Vector3 center = (Vector3)Camera.WorldToScreen( obj.AbsolutePosition, obj.Layer );
189  Matrix transform = Matrix.CreateScale( (float)( Camera.ZoomFactor ) ) * Matrix.CreateRotationZ( (float)obj.AbsoluteAngle.Radians ) * Matrix.CreateTranslation( center );
190 
191  for ( int j = 0; j < vertexes.Length - 1; j++ )
192  {
193  double x1 = wmul * vertexes[j].X;
194  double y1 = hmul * vertexes[j].Y;
195  double x2 = wmul * vertexes[j + 1].X;
196  double y2 = hmul * vertexes[j + 1].Y;
197 
198  var t1 = Vector2.Transform( new Vector2( (float)x1, (float)y1 ), transform );
199  var t2 = Vector2.Transform( new Vector2( (float)x2, (float)y2 ), transform );
200 
201  canvas.DrawLine( t1.X, t1.Y, t2.X, t2.Y );
202  }
203 
204  if ( vertexes.Length > 2 )
205  {
206  double x1 = wmul * vertexes[vertexes.Length - 1].X;
207  double y1 = hmul * vertexes[vertexes.Length - 1].Y;
208  double x2 = wmul * vertexes[0].X;
209  double y2 = hmul * vertexes[0].Y;
210 
211  var t1 = Vector2.Transform( new Vector2( (float)x1, (float)y1 ), transform );
212  var t2 = Vector2.Transform( new Vector2( (float)x2, (float)y2 ), transform );
213 
214  canvas.DrawLine( t1.X, t1.Y, t2.X, t2.Y );
215  }
216  }
217 
218  private void PaintDebugScreen( Canvas canvas )
219  {
220  // Draw the object outlines as determined by their shape
221 
222  for ( int i = Layers.FirstIndex; i <= Layers.LastIndex; i++ )
223  {
224  foreach ( var obj in Layers[i].Objects )
225  {
226  if ( obj == null || obj.Shape == null || obj.Shape.Cache == null || obj.Layer == null )
227  continue;
228 
229  PaintShapeOutlines( canvas, obj );
230 
231  if ( obj is PhysicsObject )
232  PaintPhysicsOutlines( canvas, (PhysicsObject)obj );
233  }
234  }
235  }
236  }
237 }
Window FPSWindow
FPS-ikkuna.
Definition: DebugScreen.cs:36
Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
readonly Vector [] OutlineVertices
Ulkoreunan verteksit, lueteltuna vastapäivään.
Definition: Shapes.cs:586
override Shape Shape
Olion muoto.
Definition: Dimensions.cs:89
bool DebugScreenVisible
Debug-ruutu näkyvissä / pois.
Definition: DebugScreen.cs:31
static new JypeliWindow Window
Ikkuna.
Definition: Game.cs:201
virtual string Text
Teksti.
Definition: Label.cs:94
static Layer CreateStaticLayer()
Luo staattisen kerroksen (ei liiku kameran mukana)
Definition: Layer.cs:138
static readonly Color LightGray
Vaalea harmaa.
Definition: Color.cs:694
double Right
Olion oikean reunan x-koordinaatti.
Angle AbsoluteAngle
Olion absoluuttinen kulma pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
double Left
Olion vasemman reunan x-koordinaatti.
void DrawLine(Vector startPoint, Vector endPoint)
Piirtää janan.
Definition: Canvas.cs:131
double ZoomFactor
Kameran zoomauskerroin. Oletuksena 1.0. Mitä suurempi zoomauskerroin, sitä lähempänä kamera on (esim ...
Definition: Camera.cs:99
void Begin(ref Matrix worldMatrix, Dimensional dimensionSource)
Definition: Canvas.cs:93
Layer DebugLayer
Debug-ruutukerros, joka näkyy kun painetaan F12. Voit lisätä olioita myös tälle kerrokselle.
Definition: DebugScreen.cs:21
Tekstikenttä.
Definition: Label.cs:65
override Vector Size
Olion koko pelimaailmassa. Kertoo olion äärirajat, ei muotoa.
Definition: __GameObject.cs:98
ButtonState
Napin (minkä tahansa) asento.
Definition: ButtonState.cs:37
Peliolio, joka noudattaa fysiikkamoottorin määräämiä fysiikan lakeja. Voidaan kuitenkin myös laittaa ...
Definition: Coefficients.cs:36
bool DebugKeyEnabled
Debug-ruutu F12-näppäimestä päällä / pois.
Definition: DebugScreen.cs:26
TimeSpan SinceLastUpdate
Aika joka on kulunut viime päivityksestä.
Definition: Time.cs:24
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:13
Kamera. Määrittää mikä osa pelitasosta on kerralla näkyvissä.
Definition: Camera.cs:42
double Top
Olion yläreunan y-koordinaatti.
double Left
Näytön vasemman reunan x-koordinaatti.
Definition: View.cs:90
void End()
Definition: Canvas.cs:101
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
Definition: Game.cs:95
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
Definition: Game.cs:194
Peliluokka reaaliaikaisille peleille.
Definition: DebugScreen.cs:10
static readonly Color LightGreen
Vaalea vihreä.
Definition: Color.cs:699
Color BrushColor
Pensselin väri.
Definition: Canvas.cs:86
void Update(Time time)
Definition: Layer.cs:204
Label LayerDisplay
"Layers"-näyttö.
Definition: DebugScreen.cs:51
static readonly Color HotPink
Pinkki.
Definition: Color.cs:664
Keyboard Keyboard
Näppäimistö.
Definition: Game.cs:248
Kerros. Vastaa olioiden piirtämisestä.
Definition: Layer.cs:36
double X
Definition: Vector.cs:274
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:86
static readonly Color Blue
Sininen.
Definition: Color.cs:504
double Top
Näytön yläreunan y-koordinaatti.
Definition: View.cs:106
override Vector Size
Tekstikentän koko. Jos SizeMode on SizeMode.StretchText, teksti venytetään kentän koon mukaiseksi...
Definition: Label.cs:264
Body Body
Fysiikkamoottorin käyttämä tietorakenne.
Definition: Dimensions.cs:42
Väri.
Definition: Color.cs:13
virtual void OnObjectAdded(IGameObject obj)
Definition: Game.cs:580
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:14
Color TextColor
Tekstin väri.
Definition: Label.cs:215
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana, ja sen paikka ja koko ilmaistaan suhteessa tähän olioon.
bool IsModal
Jos true, pelin sekä ikkunan alla olevien widgettien ohjaimet eivät ole käytössä kun ikkuna on näkyvissä. ...
Definition: Control.cs:20
Piirtoalusta.
Definition: Canvas.cs:38
Label FPSDisplay
FPS-näyttö.
Definition: DebugScreen.cs:41
double Right
Näytön oikean reunan x-koordinaatti.
Definition: View.cs:98
double Width
Olion leveys (X-suunnassa, leveimmässä kohdassa).
override Color Color
Ikkunan väri.
Definition: Window.cs:57
Window LayerWindow
"Layers"-ikkuna. Huom. asettaa kokonsa automaattisesti.
Definition: DebugScreen.cs:46
Key
Näppäimistön näppäin.
Definition: Key.cs:37
Mouse Mouse
Hiiri.
Definition: Game.cs:253
static readonly Color DarkRed
Tumma punainen.
Definition: Color.cs:594
Layer Layer
Kerros, jolle peliolio on lisätty.
Vector WorldToScreen(Vector point)
Muuntaa annetun pisteen maailmankoordinaateista ruutukoordinaatteihin.
Definition: Camera.cs:176
double Width
Näytön leveys x-suunnassa.
Definition: View.cs:66
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: __GameObject.cs:54
static readonly Color Salmon
Lohenpunainen.
Definition: Color.cs:824
Vector AbsolutePosition
Olion absoluuttinen paikka pelimaailmassa. Jos olio ei ole minkään toisen peliolion lapsiolio...
static readonly Color White
Valkoinen.
Definition: Color.cs:894
virtual void OnObjectRemoved(IGameObject obj)
Definition: Game.cs:591
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.
Definition: Shapes.cs:55
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).