Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdFloris van Dongen Laatst gewijzigd meer dan 6 jaar geleden
1
Arjan Egges & Paul Bergervoet
Objecten en Methoden Arjan Egges & Paul Bergervoet
2
Eigen methode toevoegen
class Painter : Game { public void HandleInput() … } protected override void Update(GameTime gameTime) HandleInput(); Eigen bedachte methode!
3
De ‘HandleInput’ methode
public void HandleInput() { prevMS = currMS; prevKS = currKS; currMS = Mouse.GetState(); currKS = Keyboard.GetState(); if (currKS.IsKeyDown(Keys.R) && prevKS.IsKeyUp(Keys.R)) cannonColor = Color.Red; else if (currKS.IsKeyDown(Keys.G) && prevKS.IsKeyUp(Keys.G)) cannonColor = Color.Green; else if (currKS.IsKeyDown(Keys.B) && prevKS.IsKeyUp(Keys.B)) cannonColor = Color.Blue; }
4
Verschillende soorten methoden
Methoden met een resultaat object: Methoden zonder een resultaat object: Methoden met parameters: Methoden zonder parameters: currMS = Mouse.GetState(); GraphicsDevice.Clear(Color.Olive); currKS.IsKeyDown(Keys.G) spriteBatch.Begin()
5
Verschillende soorten methoden
Sommige methoden bewerken objecten Sommige methoden bewerken geen objecten (maar horen wel bij een klasse) Deze methoden noemen we static In de methode header kun je zien wat voor soort methode het is! spriteBatch.Begin() Console.WriteLine("Hallo");
6
Methode headers public static void Main() { … }
public void HandleInput() protected override void Update(GameTime gameTime) static methode (bewerkt geen object) methode zonder resultaatobject methode zonder parameters methode met 1 parameter
7
Methoden met resultaat
We stoppen er een float in... ...en we leveren een float op. public float CalculateSquare(float x) { return x*x; } Met return geven we aan wat opgeleverd wordt. Vergelijkbaar met wiskundige functie f(x) = x2; In het gebruik: float f = CalculateSquare(10.0f);
8
Methoden met resultaat
Na een return stopt de methode Daar kunnen we gebruik van maken! public int SomeMethod() { return 12; int tmp = 45; } Wordt nooit uitgevoerd! public float SquareRoot(float f) { if (f < 0.0f) return 0.0f; // Hier weten we nu zeker dat altijd geldt dat f >= 0 }
9
Methoden met resultaat
Return waarde kunnen we in een variabele bewaren: Maar dat hoeft niet! float f = CalculateSquare(10.0f); if (CalculateSquare(10.0f) != 100.0f) Console.WriteLine("Your processor is broken");
10
Tekenen of opleveren? Console.Writeline (x, ...)
spriteBatch.Draw(cannon, Vector2.Zero,...) return x; resultaat komt meteen op het scherm resultaat wordt teruggegeven aan de aanroeper, die zelf kan beslissen wat hij ermee doet
11
Declaraties vs. parameters
Lijken erg op elkaar public float SquareRoot(float f) { if (f < 0.0f) return 0.0f; … } Gebruiken we als locale variabele protected override void Update(GameTime gameTime) { int red; red = gameTime.TotalGameTime.Milliseconds; … } Locale variabele
12
en des te lastiger aan te roepen...
Methoden Hoe meer parameters, des te flexibeler de methode public void Draw(Texture2D sprite, Vector2 position, Color col, float rotation, float scale, bool mirror, float transparency, Rectangle part, Vector2 origin, Rectangle destination, …) { … en des te lastiger aan te roepen...
13
Flexibiliteit Veel parameters: Nu lastig om te programmeren
In de toekomst misschien gemakkelijk uit te breiden Weinig parameters: Nu gemakkelijk om te programmeren In de toekomst misschien lastig te onderhouden
14
Programma en geheugen opdrachten variabelen methoden objecten klasse
veranderen zijn gegroepeerd in zijn gegroepeerd in methoden objecten bewerken zijn gegroepeerd in hebben als type klasse klasse klasse
15
Objecten en geheugen Built-in types in het geheugen
- Numerieke typen (int, double, ...) - Tekst (strings) - Waarheidswaarden int i = 12; double pi = 3.14; 12 i 3.14 pi string s = "hallo, "; s += "Arjan"; "hallo, " s "hallo, Arjan" bool b = true; b = !b; true b false
16
Objecten en geheugen Gevolg: public void keerTwee(int getal) {
} public void keerTwee(int i) { i *= 2; } int i = 3; keerTwee(i); // wat is nu de waarde van i? Nog steeds 3, want de waarde wordt gekopieerd bij het doorgeven aan de keerTwee methode!
17
Objecten en geheugen Typen die gebaseerd zijn op een klasse werken anders verwijzing! Texture2D … width height data cannonBarrel
18
Waarom verwijzingen? Bij een aanroep van een methode wordt niet het hele geheugen gekopieerd, alleen de verwijzing Objecten kunnen worden doorgegeven tussen methoden
19
Verwijzingen Built-in types (int, double, float)
Values Speciaal geval: string “non-mutable” Object-typen gedefinieerd door klassen References (verwijzingen) Object-typen gedefinieerd door structs Values (!) Wordt gebruikt voor simpele datastructuren Voorbeelden: Vector2, Point, Color…
20
Creatie van objecten Opbouw van object is gespecificeerd in de klasse
Overgeërfd uit de Game-klasse class Painter { : Game GraphicsDeviceManager graphics; SpriteBatch spriteBatch; Texture2D background, cannonBarrel; Vector2 barrelPosition, barrelOrigin; float angle; // methoden... Painter game IsMouseVisible Content GraphicsDevice spriteBatch barrelPosition barrelOrigin background cannonBarrel graphics angle }
21
Painter game geërfd van Game zelf gedeclareerd cs-simulatieobjecten
22
GraphicsDeviceManager
Painter game SpriteBatch graphics GraphicsDeviceManager spriteBatch background Texture2D barrelPosition 72 405 barrelOrigin 34 angle cannonBarrel Texture2D cs-simulatieobjecten
23
De Cannon klasse Groepeer alle member variabelen die bij het kannon horen in een klasse Cannon class Cannon { Texture2D cannonBarrel; Texture2D colorRed, colorGreen, colorBlue; Texture2D currentColor; Vector2 position; Vector2 barrelOrigin, colorOrigin; Color color; float angle; // methoden worden nog toegevoegd. }
24
Declaratie Declaratie reserveert geheugenruimte
Voor een primitieve waarde zoals be- schreven in struct Vector2 int x; x 5 x = 5; zoals be- schreven in klasse SpriteBatch Voor een object-waarde p Vector2 p; X 10 p = new Vector2(10,20); Y 20 Voor een object-verwijzing SpriteBatch s; s s = new SpriteBatch(…);
25
Constructie van nieuw object
new-expressie doet twee dingen: cannon cannon = new Cannon (…) ; position cannonBarrel Cannon color … 72 405 Texture2D 255 Geheugenruimte klaarzetten Constructormethode aanroepen waarde is pijl naar het nieuwe object die je kunt opslaan
26
Geen return type! Parameter(s) van de constructormethode public Cannon(ContentManager Content) { this.cannonBarrel = Content.Load<Texture2D>("spr_cannon_barrel"); this.colorRed = Content.Load<Texture2D>("spr_cannon_red"); this.colorGreen = Content.Load<Texture2D>("spr_cannon_green"); this.colorBlue = Content.Load<Texture2D>("spr_cannon_blue"); this.currentColor = colorBlue; color = Color.Blue; barrelOrigin = new Vector2(cannonBarrel.Height, cannonBarrel.Height) / 2; colorOrigin = new Vector2(currentColor.Width, currentColor.Height) / 2; position = new Vector2(72, 405); } Member- variabelen krijgen een waarde.
27
Constructie van een nieuw object
class Painter : Game { ... Cannon cannon; ... protected override LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); background = Content.Load<Texture2D>("spr_background"); } Membervariabele cannon = new Cannon(Content); Informatie doorgeven via parameters!
28
null Als een variabele nog nergens naar wijst, dan zeggen we dat de variabele null is: Dit kunnen we zelfs in condities gebruiken: Of korter: Cannon cannon; if (cannon == null) cannon = new Cannon(Content); null mapt naar de booleanwaarde false if (!cannon) cannon = new Cannon(Content);
29
Objecten Object: groepje variabelen dat bij elkaar hoort 100 w 20 h h
! 255 r g b 3 aantal 199.95 prijs
30
Objecten "vraag niet hoe het kan... " Om een object te gebruiken, hoef je niet te weten uit welke variabelen het object bestaat "maar profiteer ervan! " Je hoeft alleen te weten - welke methoden er zijn - welke properties er zijn
31
Game objecten ontwerpen
Wat doet een game object? Invoer van de speler afhandelen Zichzelf bijwerken (update) Zichzelf tekenen (draw) Bijbehorende methoden: HandleInput Update Draw Daarnaast: Reset
32
Methoden in Cannon public void Draw(GameTime gameTime, SpriteBatch spriteBatch) { spriteBatch.Draw(cannonBarrel, position, null, Color.White, angle, barrelOrigin, 1f, SpriteEffects.None, 0); spriteBatch.Draw(currentColor, position, null, Color.White, 0f, colorOrigin, 1f, SpriteEffects.None, 0); } public void Reset() currentColor = colorBlue; color = Color.Blue; angle = 0.0f;
33
Property voor lezen positie
Type van de property Naam van de property public Vector2 Position { get return position; } Property lezen Zo gebruiken we de property: Vector2 cannonPos = cannon.Position;
34
public Color Color { get { return color; } set if (value != Color.Red && value != Color.Green && value != Color.Blue) return; color = value; if (color == Color.Red) currentColor = colorRed; else if (color == Color.Green) currentColor = colorGreen; else if (color == Color.Blue) currentColor = colorBlue; } Property lezen Controleren of het wel mag. Property schrijven value bevat de rechterkant van de toekenning
35
Properties Sommige properties mag je alleen lezen
String.Length Viewport.Width Sommige properties mag je ook schrijven Vector2.X Content.RootDirectory Cannon.Color
36
Properties Properties hoeven niet altijd direct met een waarde van een membervariabele te corresponderen, bijv.: public Vector2 Center { get return new Vector2(sprite.Width, sprite.Height) / 2; }
37
Spelerinvoer afhandelen
Spelerinvoer afhandelen is nogal omslachtig momenteel: previousMS = currentMS; previousKS = currentKS; currentMS = Mouse.GetState(); currentKS = Keyboard.GetState(); if (currentKS.IsKeyDown(Keys.R) && previousKS.IsKeyUp(Keys.R)) cannon.Color = Color.Red; else if (currentKS.IsKeyDown(Keys.G) && previousKS.IsKeyUp(Keys.G)) cannon.Color = Color.Green; else if (currentKS.IsKeyDown(Keys.B) && previousKS.IsKeyUp(Keys.B)) cannon.Color = Color.Blue; ... Veel dubbele code, dus je maakt snel fouten!
38
De InputHelper klasse class InputHelper Deze informatie wordt bewaard
{ MouseState currMS, prevMS; KeyboardState currKS, prevKS; // methoden en properties } Deze informatie wordt bewaard in een InputHelper object De klasse InputHelper beschrijft hoe een object van het type InputHelper eruit ziet!
39
class Painter : Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; InputHelper inputHelper; … static void Main() { Painter game = new Painter(); game.Run(); } public Painter() { Content.RootDirectory = "Content"; graphics = new GraphicsDeviceManager(this); inputHelper = new InputHelper(); Declaratie Toekenning en maken van een instantie
40
bijwerken in zijn eigen
Handige methoden class InputHelper { MouseState currMS, prevMS; KeyboardState currKS, prevKS; public void Update() prevMS = currMS; prevKS = currKS; currMS = Mouse.GetState(); currKS = Keyboard.GetState(); } … InputHelper object bijwerken in zijn eigen Update methode
41
Handige methoden = deze methode mag in een andere klasse
aangeroepen worden. public bool MouseLeftButtonPressed() { return currMS.LeftButton == ButtonState.Pressed && prevMS.LeftButton == ButtonState.Released; } public bool KeyPressed(Keys k) return currKS.IsKeyDown(k) && prevKS.IsKeyUp(k);
42
InputHelper gebruiken
protected override void Update(GameTime gameTime) { inputHelper.Update(); HandleInput(inputHelper); // hier nog de game wereld bijwerken }
43
Cannon krijgt zijn eigen HandleInput
public void HandleInput(InputHelper inputHelper) { if (inputHelper.KeyPressed(Keys.R)) Color = Color.Red; else if (inputHelper.KeyPressed(Keys.G)) Color = Color.Green; else if (inputHelper.KeyPressed(Keys.B)) Color = Color.Blue; double opposite = inputHelper.MousePosition.Y - position.Y; double adjacent = inputHelper.MousePosition.X - position.X; angle = (float)Math.Atan2(opposite, adjacent); } Veel korter en veel overzichtelijker!
44
GameWorld klasse class GameWorld { Texture2D background;
Cannon cannon; public GameWorld(ContentManager Content) background = Content.Load<Texture2D>("spr_background"); cannon = new Cannon(Content); } public void HandleInput(InputHelper inputHelper) cannon.HandleInput(inputHelper); ... Game wereld bestaat uit alle game objecten
45
... public void Update(GameTime gameTime) { } public void Draw(GameTime gameTime, SpriteBatch spriteBatch) spriteBatch.Begin(); spriteBatch.Draw(background, Vector2.Zero, Color.White); cannon.Draw(gameTime, spriteBatch); spriteBatch.End(); public Cannon Cannon get { return cannon; }
46
GraphicsDeviceManager graphics; SpriteBatch spriteBatch;
class Painter : Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; InputHelper inputHelper; static GameWorld gameWorld; … protected override void LoadContent() spriteBatch = new SpriteBatch(GraphicsDevice); gameWorld = new GameWorld(Content); } public static GameWorld GameWorld get { return gameWorld; } Static member variabele Constructie van de game wereld Static property om erbij te kunnen
47
protected override void Update(GameTime gameTime)
{ inputHelper.Update(); gameWorld.HandleInput(inputHelper); gameWorld.Update(gameTime); } protected override void Draw(GameTime gameTime) GraphicsDevice.Clear(Color.White); gameWorld.Draw(gameTime, spriteBatch);
48
Overzicht programma-constructies
waarde-verzameling van een expressie geeft het type van variabelen Declaratie Lokale variabele voor tijdelijk gebruik Membervariabele permanent deel van het object Parameter om waarden door te spelen aan methoden Type Primitief type int double bool, enz. Object-type Color, Vector2 enz. Game, SpriteBatch, enz.
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.