Jypeli 10
The simple game programming library
DebugScreen.cs
Siirry tämän tiedoston dokumentaatioon.
1using System.Text;
2using Microsoft.Xna.Framework;
3
4namespace Jypeli
5{
6 public partial class Game
7 {
8 private string fpsText = "00";
9 private int fpsSkipCounter;
11 private Matrix canvasTransform = Matrix.Identity;
12 private Camera camera { get => Game.Instance.Camera; }
13
14 #region debugsettings
18 public struct DebugViewSettings
19 {
23 public static bool DrawOutlines = true;
24
29 public static bool DrawPhysicsOutlines = true;
30
34 public static bool DrawCircleRotation = true;
35
40
45
50
55
60 }
61 #endregion
62
67 public Layer DebugLayer { get; private set; }
68
72 public bool DebugKeyEnabled { get; set; }
73
77 public bool DebugScreenVisible { get; set; }
78
82 public Window FPSWindow { get; private set; }
83
87 public Label FPSDisplay { get; private set; }
88
92 public Window LayerWindow { get; private set; }
93
97 public Label LayerDisplay { get; private set; }
98
99 private void InitDebugScreen()
100 {
101 debugCanvas = new Canvas();
102
104 DebugLayer.Objects.ItemAdded += OnObjectAdded;
105 DebugLayer.Objects.ItemRemoved += OnObjectRemoved;
106
107 FPSWindow = new Window();
108 FPSWindow.IsModal = false;
109 FPSWindow.Color = new Color(Color.HotPink, 100);
111
112 FPSDisplay = new Label("00");
117
118 LayerWindow = new Window();
119 LayerWindow.IsModal = false;
120 LayerWindow.Color = new Color(Color.Blue, 100);
122
123 LayerDisplay = new Label("Layers: no data");
128
129
130 DebugKeyEnabled = true;
131 DebugScreenVisible = false;
132 }
133
134 private StringBuilder layerTextBuilder = new StringBuilder();
135 private const string layerTextTitle = "Layers:\n";
136
142 private void UpdateFps(GameTime gameTime)
143 {
144 fpsText = (10000000.0 / gameTime.ElapsedGameTime.Ticks).ToString("F2");
145 if (fpsSkipCounter++ > 10)
146 {
147 fpsSkipCounter = 0;
148 }
149 }
150
151 private void UpdateDebugScreen(Time time)
152 {
153 if (DebugKeyEnabled && Keyboard.GetKeyState(Key.F12) == ButtonState.Pressed)
154 {
156
157 // Päivitetään elementtien sijainti ruudulle oikeaan kohtaan
158 UpdateLayerWindow(); // Ensimmäistä aukaisua varten pitää täydentää elementtien sisällöt
160
163
166 }
167
168 DebugLayer.Update(time);
169
171 return;
172
175 }
176
177 private void UpdateLayerWindow()
178 {
179 layerTextBuilder.Clear();
181
182 for (int i = Layers.FirstIndex; i <= Layers.LastIndex; i++)
183 {
184 layerTextBuilder.Append("[");
185 layerTextBuilder.Append(i);
186 layerTextBuilder.Append("]: ");
187 layerTextBuilder.Append(Layers[i].Objects.Count);
188 layerTextBuilder.AppendLine();
189 }
190
193 }
194
195 private void DrawDebugScreen()
196 {
198 return;
199
204
206 }
207
208 private void PaintShapeOutlines(Canvas canvas, IGameObject obj, Color color)
209 {
210 var vertexes = obj.Shape.Cache.OutlineVertices;
211 double wmul = obj.Shape.IsUnitSize ? obj.Width : 1;
212 double hmul = obj.Shape.IsUnitSize ? obj.Height : 1;
213
214 canvas.BrushColor = color;
215
216 Matrix transform =
217 Matrix.CreateRotationZ((float)obj.Angle.Radians)
218 * Matrix.CreateTranslation((float)obj.Position.X, (float)obj.Position.Y, 0f)
219 * Matrix.CreateTranslation(-(float)camera.Position.X, -(float)camera.Position.Y, 0f)
220 * Matrix.CreateScale((float)(camera.ZoomFactor), (float)(camera.ZoomFactor), 1f);
221
222 for (int j = 0; j < vertexes.Length - 1; j++)
223 {
224 double x1 = wmul * vertexes[j].X;
225 double y1 = hmul * vertexes[j].Y;
226 double x2 = wmul * vertexes[j + 1].X;
227 double y2 = hmul * vertexes[j + 1].Y;
228
229 var t1 = Vector2.Transform(new Vector2((float)x1, (float)y1), transform);
230 var t2 = Vector2.Transform(new Vector2((float)x2, (float)y2), transform);
231
232 canvas.DrawLine(t1.X, t1.Y, t2.X, t2.Y);
233 }
234
235 if (vertexes.Length > 2)
236 {
237 double x1 = wmul * vertexes[vertexes.Length - 1].X;
238 double y1 = hmul * vertexes[vertexes.Length - 1].Y;
239 double x2 = wmul * vertexes[0].X;
240 double y2 = hmul * vertexes[0].Y;
241
242 var t1 = Vector2.Transform(new Vector2((float)x1, (float)y1), transform);
243 var t2 = Vector2.Transform(new Vector2((float)x2, (float)y2), transform);
244
245 canvas.DrawLine(t1.X, t1.Y, t2.X, t2.Y);
246 }
248 {
249 double x1 = 0;
250 double y1 = 0;
251 double x2 = obj.Width / 2;
252 double y2 = 0;
253
254 var t1 = Vector2.Transform(new Vector2((float)x1, (float)y1), transform);
255 var t2 = Vector2.Transform(new Vector2((float)x2, (float)y2), transform);
256
257 canvas.DrawLine(t1.X, t1.Y, t2.X, t2.Y);
258 }
259 }
260
261 private void PaintPhysicsOutlines(Canvas canvas, PhysicsObject obj, Color color)
262 {
263 if (obj.Body == null || obj.Body.Shape == null || obj.Body.Shape.Cache == null)
264 return;
265
266 var vertices = obj.Body.Vertices;
267 double wmul = 100; // Farseerin SimToDisplay-kerroin. Tämä pitäiis varmaan yhdistää jotenkin siihen.
268 double hmul = 100;
269
270 canvas.BrushColor = color;
271
272 Matrix transform =
273 Matrix.CreateRotationZ((float)obj.Angle.Radians)
274 * Matrix.CreateTranslation((float)obj.Position.X, (float)obj.Position.Y, 0f)
275 * Matrix.CreateTranslation(-(float)camera.Position.X, -(float)camera.Position.Y, 0f)
276 * Matrix.CreateScale((float)(camera.ZoomFactor), (float)(camera.ZoomFactor), 1f);
277
278 foreach (var vertexes in vertices)
279 {
280 for (int j = 0; j < vertexes.Count - 1; j++)
281 {
282 double x1 = wmul * vertexes[j].X;
283 double y1 = hmul * vertexes[j].Y;
284 double x2 = wmul * vertexes[j + 1].X;
285 double y2 = hmul * vertexes[j + 1].Y;
286
287 var t1 = Vector2.Transform(new Vector2((float)x1, (float)y1), transform);
288 var t2 = Vector2.Transform(new Vector2((float)x2, (float)y2), transform);
289
290 canvas.DrawLine(t1.X, t1.Y, t2.X, t2.Y);
291 }
292
293 if (vertexes.Count > 2)
294 {
295 double x1 = wmul * vertexes[vertexes.Count - 1].X;
296 double y1 = hmul * vertexes[vertexes.Count - 1].Y;
297 double x2 = wmul * vertexes[0].X;
298 double y2 = hmul * vertexes[0].Y;
299
300 var t1 = Vector2.Transform(new Vector2((float)x1, (float)y1), transform);
301 var t2 = Vector2.Transform(new Vector2((float)x2, (float)y2), transform);
302
303 canvas.DrawLine(t1.X, t1.Y, t2.X, t2.Y);
304 }
305 }
306 }
307
308 private void PaintDebugScreen(Canvas canvas)
309 {
310 for (int i = Layers.FirstIndex; i <= Layers.LastIndex; i++)
311 {
312 foreach (var obj in Layers[i].Objects)
313 {
314 if (obj == null || obj.Shape == null || obj.Shape.Cache == null || obj.Layer == null || obj is Widget) // Toistaiseksi ei piirretä widgettien ääriviivoja (halutaanko edes?)
315 continue;
316
317 if (obj is PhysicsObject)
318 {
322 }
323 else
324 {
325 if (obj is PhysicsStructure)
326 {
328 foreach (var o in ps.Objects)
329 {
331 }
332 }
333 else
335 }
336 }
337 }
338 }
339 }
340}
System.Numerics.Vector2 Vector2
System.Drawing.Color Color
Kamera. Määrittää mikä osa pelitasosta on kerralla näkyvissä.
Definition: Camera.cs:40
Vector Position
Kameran sijainti.
Definition: Camera.cs:53
double ZoomFactor
Kameran zoomauskerroin. Oletuksena 1.0. Mitä suurempi zoomauskerroin, sitä lähempänä kamera on (esim ...
Definition: Camera.cs:99
Piirtoalusta.
Definition: Canvas.cs:39
void End()
Lopettaa piirtämisen. Sinun ei tarvitse kutsua tätä.
Definition: Canvas.cs:111
void Begin(ref Matrix worldMatrix, Dimensional dimensionSource)
Aloittaa canvaksen piirtämisen. Sinun ei tarvitse kutsua tätä.
Definition: Canvas.cs:99
void DrawLine(Vector startPoint, Vector endPoint)
Piirtää janan.
Definition: Canvas.cs:141
Color BrushColor
Pensselin väri.
Definition: Canvas.cs:86
Layer DebugLayer
Debug-ruutukerros, joka näkyy kun painetaan F12. Voit lisätä olioita myös tälle kerrokselle.
Definition: DebugScreen.cs:67
Label FPSDisplay
FPS-näyttö.
Definition: DebugScreen.cs:87
Camera camera
Definition: DebugScreen.cs:12
int fpsSkipCounter
Definition: DebugScreen.cs:9
virtual void OnObjectAdded(IGameObject obj)
Kun olio lisätään kerrokselle
Definition: Layers.cs:99
Matrix canvasTransform
Definition: DebugScreen.cs:11
bool DebugKeyEnabled
Debug-ruutu F12-näppäimestä päällä / pois.
Definition: DebugScreen.cs:72
bool DebugScreenVisible
Debug-ruutu näkyvissä / pois.
Definition: DebugScreen.cs:77
string fpsText
Definition: DebugScreen.cs:8
void PaintPhysicsOutlines(Canvas canvas, PhysicsObject obj, Color color)
Definition: DebugScreen.cs:261
void UpdateDebugScreen(Time time)
Definition: DebugScreen.cs:151
Window FPSWindow
FPS-ikkuna.
Definition: DebugScreen.cs:82
virtual void OnObjectRemoved(IGameObject obj)
Kun olio poistetaan kerrokselta
Definition: Layers.cs:114
Camera Camera
Kamera, joka näyttää ruudulla näkyvän osan kentästä. Kameraa voidaan siirtää, zoomata tai asettaa seu...
Definition: Game.cs:130
void DrawDebugScreen()
Definition: DebugScreen.cs:195
StringBuilder layerTextBuilder
Definition: DebugScreen.cs:134
void PaintDebugScreen(Canvas canvas)
Definition: DebugScreen.cs:308
Label LayerDisplay
"Layers"-näyttö.
Definition: DebugScreen.cs:97
const string layerTextTitle
Definition: DebugScreen.cs:135
void UpdateLayerWindow()
Definition: DebugScreen.cs:177
SynchronousList< Layer > Layers
Kerrokset, joilla pelioliot viihtyvät.
Definition: Layers.cs:14
static Game Instance
Käynnissä olevan pelin pääolio.
Definition: Game.cs:96
Window LayerWindow
"Layers"-ikkuna. Huom. asettaa kokonsa automaattisesti.
Definition: DebugScreen.cs:92
static ScreenView Screen
Näytön dimensiot, eli koko ja reunat.
Definition: Graphics.cs:90
void PaintShapeOutlines(Canvas canvas, IGameObject obj, Color color)
Definition: DebugScreen.cs:208
Canvas debugCanvas
Definition: DebugScreen.cs:10
void UpdateFps(GameTime gameTime)
Jypelin aika pitää sisällään tiedon edellisestä pelin päivityksestä, MonoGamen aika edellisestä ruudu...
Definition: DebugScreen.cs:142
void InitDebugScreen()
Definition: DebugScreen.cs:99
Pelialueella liikkuva olio. Käytä fysiikkapeleissä PhysicsObject-olioita.
Definition: Appearance.cs:34
override Vector?? Position
Definition: Dimensions.cs:72
override Vector Size
Olion koko pelimaailmassa. Kertoo olion äärirajat, ei muotoa.
Definition: Dimensions.cs:44
void Add(IGameObject childObject)
Lisää annetun peliolion tämän olion lapseksi. Lapsiolio liikkuu tämän olion mukana.
Definition: ChildObjects.cs:98
virtual Color Color
Väri, jonka värisenä olio piirretään, jos tekstuuria ei ole määritelty.
Definition: Appearance.cs:65
double Top
Olion yläreunan y-koordinaatti.
double Left
Olion vasemman reunan x-koordinaatti.
double Right
Olion oikean reunan x-koordinaatti.
Näppäimistö.
Definition: Keyboard.cs:41
ButtonState GetKeyState(Key k)
Palauttaa annetun näppäimen tilan (ks. ButtonState).
Definition: Keyboard.cs:105
Tekstikenttä.
Definition: Label.cs:70
override Vector Size
Tekstikentän koko. Jos SizeMode on SizeMode.StretchText, teksti venytetään kentän koon mukaiseksi.
Definition: Label.cs:264
virtual string Text
Teksti.
Definition: Label.cs:96
Color TextColor
Tekstin väri.
Definition: Label.cs:204
Kerros. Vastaa olioiden piirtämisestä.
Definition: Layer.cs:32
void Draw(Camera camera)
Definition: Layer.cs:226
void Add(IGameObject o)
Definition: Layer.cs:185
void Update(Time time)
Ajaa päivityksen kerroksen olioille ja efekteille
Definition: Layer.cs:220
static Layer CreateStaticLayer()
Luo staattisen kerroksen (ei liiku kameran mukana)
Definition: Layer.cs:141
SynchronousList< IGameObject > Objects
Kerroksen oliot
Definition: Layer.cs:79
Hiiri.
Definition: Mouse.cs:46
static bool IsCursorOn(ScreenView screen, MouseState state, GameObject obj)
Onko hiiren kursori annetun olion päällä.
Definition: Mouse.cs:320
Kappale joka noudattaa fysiikan lakeja, johon voi törmätä. Vaatii että käytössä on fysiikkapeli.
Definition: Collisions.cs:7
IPhysicsBody Body
Fysiikkamoottorin käsittelemä fysiikkakappale.
Definition: Dimensions.cs:12
override Angle?? Angle
Definition: Dimensions.cs:55
override Vector?? Position
Definition: Dimensions.cs:30
Rakenne, joka pitää fysiikkaoliot kiinteän matkan päässä toisistaan.
double Top
Näytön yläreunan y-koordinaatti.
Definition: View.cs:308
double Left
Näytön vasemman reunan x-koordinaatti.
Definition: View.cs:292
double Right
Näytön oikean reunan x-koordinaatti.
Definition: View.cs:300
readonly Vector[] OutlineVertices
Ulkoreunan verteksit, lueteltuna vastapäivään.
Definition: Shapes.cs:636
Kuvio.
Definition: Shapes.cs:47
static readonly Ellipse Circle
Ympyrä tai ellipsi.
Definition: Shapes.cs:63
abstract bool IsUnitSize
If true, the shape must be scaled by the size of the object that has the shape. Typically,...
Definition: Shapes.cs:53
abstract ShapeCache Cache
Muodon verteksit sisällään pitävä olio.
Definition: Shapes.cs:58
Käyttöliittymän komponentti.
Definition: Appearance.cs:6
bool IsModal
Jos true, pelin sekä ikkunan alla olevien widgettien ohjaimet eivät ole käytössä kun ikkuna on n...
Definition: Control.cs:25
Ikkuna.
Definition: Window.cs:37
override Color Color
Ikkunan väri.
Definition: Window.cs:51
new double Width
Leveys.
Definition: Dimensional.cs:77
new double Height
Korkeus.
Definition: Dimensional.cs:82
Yhteinen rajapinta kaikille peliolioille.
Definition: IGameObject.cs:11
new Vector Position
Paikka.
Definition: Positional.cs:32
ButtonState
Napin (minkä tahansa) asento.
Definition: ButtonState.cs:37
Key
Näppäimistön näppäin.
Definition: Key.cs:39
Microsoft.Xna.Framework.Matrix Matrix
Definition: Mouse.cs:36
double Radians
Palauttaa tai asettaa kulman radiaaneina.
Definition: Angle.cs:85
Väri.
Definition: Color.cs:13
static readonly Color Blue
Sininen.
Definition: Color.cs:566
static readonly Color White
Valkoinen.
Definition: Color.cs:956
static readonly Color DarkRed
Tumma punainen.
Definition: Color.cs:651
static readonly Color LightGray
Vaalea harmaa.
Definition: Color.cs:751
static readonly Color Salmon
Lohenpunainen.
Definition: Color.cs:886
static readonly Color HotPink
Pinkki.
Definition: Color.cs:721
static readonly Color LightGreen
Vaalea vihreä.
Definition: Color.cs:756
static readonly Color Gray
Harmaa.
Definition: Color.cs:696
Debug-näkymän (F12) piirtoasetuksia
Definition: DebugScreen.cs:19
static bool DrawOutlines
Piirretäänkö objektien ääriviivoja
Definition: DebugScreen.cs:23
static bool DrawPhysicsOutlines
Piirretäänkö fysiikkamuotojen verteksien ääriviivat. Toimii ainoastaan Farseer-moottorilla.
Definition: DebugScreen.cs:29
static bool DrawCircleRotation
Piirretäänkö ympyrän keskikohdasta viiva sen oikeaan reunaan.
Definition: DebugScreen.cs:34
static Color PhysicsObjectHoverColor
Millä värillä PhysicsObjectien ääriviivat piirretään kun hiiri on niiden päällä
Definition: DebugScreen.cs:54
static Color GameObjectColor
Millä värillä GameObjectien ääriviivat piirretään
Definition: DebugScreen.cs:39
static Color GameObjectHoverColor
Millä värillä GameObjectien ääriviivat piirretään kun hiiri on niiden päällä
Definition: DebugScreen.cs:44
static Color PhysicsObjectVertexColor
Millä värillä PhysicsObjectien fysiikkamuotojen verteksien ääriviivat piirretään
Definition: DebugScreen.cs:59
static Color PhysicsObjectColor
Millä värillä PhysicsObjectien ääriviivat piirretään
Definition: DebugScreen.cs:49
Sisältää tiedon ajasta, joka on kulunut pelin alusta ja viime päivityksestä.
Definition: Time.cs:14
double Y
Vektorin Y-komponentti
Definition: Vector.cs:339
double X
Vektorin X-komponentti.
Definition: Vector.cs:334