Gameprogrammeren: Methoden Arjan Egges Paul Bergervoet Wouter van Toll
Herhaling: Klassen versus objecten Een klasse is een blauwdruk voor objecten Een object is een instantie van een klasse Voorbeeld: Een Enemy-klasse die beschrijft wat vijanden zijn/doen (in het algemeen) Een game die meerdere Enemy-objecten bevat (= instanties van de Enemy-klasse) (= objecten van het type Enemy) Variabelen + methoden
Herhaling: Inhoud van een klasse class BasicXNAGame : Game { Color background; BasicXNAGame() background = Color.White; ... } ... Update(...) int red = gameTime…/…; background = new Color(red, 0,0); ... Draw(...) GraphicsDevice.Clear(background); Onderdelen: Opsomming van methoden Opsommingen van variabelen die een object omschrijven Methoden bewerken variabelen
Eigen methode toevoegen class Painter : Game { public void HandleInput() … } protected override void Update(GameTime gameTime) HandleInput(); Eigen bedachte methode!
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; }
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();
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");
Methode-headers public static void Main() { … } public void HandleInput() protected override void Update(GameTime gameTime) static methode (bewerkt geen object) methode zonder parameters methode zonder resultaatobject methode met 1 parameter
Methoden met resultaat Vergelijkbaar met wiskundige functie f(x) = x2; In het gebruik: ...en we leveren een float op. public float CalculateSquare(float x) { return x*x; } We stoppen er een float in... Met return geven we aan wat opgeleverd wordt. float f = CalculateSquare(10.0f);
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, // dus geen “else” nodig }
Methoden met resultaat Return-waarde kun je 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");
Tekenen of opleveren? Resultaat meteen op het scherm tonen: Console.WriteLine(x, ...) spriteBatch.Draw(cannon, Vector2.Zero,...) Resultaat teruggeven aan de aanroeper: return x; Aanroeper kan zelf beslissen wat-ie ermee doet
Declaraties vs. parameters Lijken erg op elkaar public float SquareRoot(float f) { if (f < 0.0f) return 0.0f; … } Gebruiken we als lokale variabele protected override void Update(GameTime gameTime) { int red; red = gameTime.TotalGameTime.Milliseconds; … } Lokale variabele Gebruiken we als lokale variabele
public, protected, private Aangeven hoe toegankelijk een methode is public methode mag je van overal aanroepen private methode mag alleen vanuit objecten met hetzelfde type protected mag alleen vanuit objecten met hetzelfde type, of objecten die daarvan overerven (komt later) “Alles public maken” is een makkelijk begin... ...maar denk na over wat je wel/niet wilt kunnen aanpassen van buitenaf Anders kan je programma een chaos worden!
static Aangeven of een methode op een specifiek object werkt, of op de gehele klasse waar dat object bij hoort class Cannon { … public void Update() { … } public static int X() { … } // doet niets met een specifiek object } ... cannon.Update(); // werkt op een specifiek Cannon-object int x = cannon.X(); // mag niet! int x = Cannon.X(); // mag wel: nu gebruik je de algemene klasse Cannon
static Meest voorkomende voorbeeld: de Main()-methode van elke applicatie! Op dat moment is er nog geen specifiek object Het allereerste ding moet je dus wel in een static methode aanmaken public static void Main() { MyGame game = new MyGame(); ... }
Hoeveelheid parameters Hoe meer parameters, des te flexibeler de methode Veel parameters? Vaak een teken dat je je code moet her-ontwerpen Bijvoorbeeld een hulp-object 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...