Gameprogrammeren: Objecten en geheugen Arjan Egges Paul Bergervoet Wouter van Toll
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
Objecten en geheugen Built-in types in het geheugen: primitieven 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
Objecten en geheugen Wat is nu de waarde van i? public void keerTwee(int getal) { getal *= 2; } Wat is nu de waarde van i? Nog steeds 3, want de waarde wordt gekopieerd bij het doorgeven aan de keerTwee-methode! int i = 3; keerTwee(i);
Objecten en geheugen Typen die gebaseerd zijn op een klasse werken anders verwijzing! Texture2D … width height data cannonBarrel
Kopiëren of verwijzen? Bij een methode-aanroep worden: primitieven geheel gekopieerd objecten niet gekopieerd, alleen de verwijzing ernaar (Primitieven hebben een beperkte grootte; objecten kunnen heel groot zijn) Objecten kun je doorgeven tussen methoden Ook wel “(passing by) reference” genoemd Als je iets via zo’n reference verandert, verander je dus ook het oorspronkelijke object!
Kopiëren of verwijzen? Built-in types (int, double, float) Values Speciaal geval: string “non-mutable” Object-types gedefinieerd door klassen References (verwijzingen) Object-types gedefinieerd door structs Values (!) Wordt gebruikt voor simpele datastructuren Voorbeelden: Vector2, Point, Color… (Verder weinig verschil tussen class en struct)
Opbouw van objecten Opbouw van object is gespecificeerd in de klasse Overgeërfd uit de Game-klasse class Painter { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; Texture2D background, cannonBarrel; Vector2 barrelPosition, barrelOrigin; float angle; // methoden... } : Game Painter game IsMouseVisible Content GraphicsDevice spriteBatch barrelPosition barrelOrigin background cannonBarrel graphics angle
Opbouw van objecten Painter game geërfd van Game zelf gedeclareerd cs-simulatieobjecten
GraphicsDeviceManager Opbouw van objecten Painter game SpriteBatch graphics GraphicsDeviceManager spriteBatch background Texture2D barrelPosition 72 405 barrelOrigin 34 cs-simulatieobjecten angle cannonBarrel Texture2D
Voorbeeld: De Cannon-klasse Groepeer alle membervariabelen die bij het kanon horen class Cannon { Texture2D cannonBarrel; Texture2D colorRed, colorGreen, colorBlue; Texture2D currentColor; Vector2 position; Vector2 barrelOrigin, colorOrigin; Color color; float angle; // methoden worden nog toegevoegd. }
Declaratie Declaratie reserveert geheugenruimte Voor een primitieve waarde Voor een object-waarde Voor een object-verwijzing zoals beschreven in struct Vector2 int x; x 5 x = 5; zoals beschreven in klasse SpriteBatch p Vector2 p; X 10 p = new Vector2(10,20); Y 20 SpriteBatch s; s s = new SpriteBatch(…);
Constructie van nieuw object new-expressie doet twee dingen: Geheugenruimte klaarzetten Constructormethode aanroepen Waarde is een verwijzing naar het nieuwe object, die je kunt opslaan Cannon cannon = new Cannon (…); cannon position cannonBarrel Cannon color … 72 405 Texture2D 255
Voorbeeld: de Cannon-constructor Parameter(s) van de constructormethode Geen return type! 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.
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!
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);
null Je kunt variabelen ook weer terug op null zetten: Hiermee verwijder je een verwijzing, maar niet per se het object zelf Waarom niet? Er kunnen nog andere variabelen naar wijzen! cannon = null;
Meerdere verwijzingen Meerdere variabelen mogen naar hetzelfde object verwijzen Voorbeeld: elk object in je game laten wijzen naar de Game waar-ie in zit
Spelen met verwijzingen Wat gebeurt er per regel? cannon1 cannon2 … Cannon cannon1 = new Cannon(...); Cannon cannon2; cannon2 = cannon1; cannon1 = new Cannon(...); cannon2 = null; position cannonBarrel Cannon color … position cannonBarrel Cannon color … Geen verwijzingen meer! Wordt vanzelf een keer verwijderd (“garbage collection”)
Objecten verwijderen Een object wordt vanzelf een keer uit het geheugen verwijderd... ...zodra er geen verwijzingen meer naar bestaan
Objecten Object: groepje variabelen dat bij elkaar hoort 100 w 20 h h ! 255 r g b 3 aantal 199.95 prijs
Objecten Om een object te gebruiken, hoef je niet te weten uit welke variabelen het object bestaat Je hoeft alleen te weten welke methoden/properties het heeft "vraag niet hoe het kan..." "maar profiteer ervan!"