Arjan Egges & Paul Bergervoet

Slides:



Advertisements
Verwante presentaties
Hoofdstuk 2 Hallo, C# !.
Advertisements

Hoofdstuk 8 Objecten en klassen.
Algoritmiek Object-georiënteerd Programmeren
LauwersCollege Buitenpost Java Applet programma dat op een website zichtbaar is Java Application programma dat zelfstandig werkt Javascript Scripttaal.
Opgave 1a: void nvoid staat in de header van een methode die geen resultaatwaarde heeft nde aanroep van een void-methode is dan een opdracht i.p.v. een.
Hoorcollege 5 Herhaling, game object interactie. Ball class class Ball { Texture2D colorRed, colorGreen, colorBlue; Texture2D currentColor; Vector2 position,
The beast has been released! 4 arcade-style games Interviews with famous people in the game industry Develop browsers games for any device (phone, tablet,
Hoorcollege 2 Basis gameprogrammeren. Soorten programma’s Console- applicatie.
Hoorcollege 14 Vijanden, excepties. Overzicht programmaconstructies Opdrachten Toekenning Aanroep void-methode return-opdracht while-opdracht for(each)-opdracht.
Hoorcollege 4 Objecten en methoden. Eigen methode toevoegen class Painter : Game { public void HandleInput() { … } protected override void Update(GameTime.
Tircms02-p les 3 Functies Strings Structuren. Functies 1. main() 2. { int k; k = 10 ; printf(“%d\n”,fac(k)); } 3. int fac(n) int n; 4. { int f; f= 1;
Hoorcollege 3 Game assets, Invoer verwerken. Tutorlunch GroepTutorStutorZaal UPaul BergervoetBob BestBBG 001 VMarries van de HoefSander VerkuilBBG 731.
Tircms03-p les 4 Klassen. Abstracte datatypes in C struct stack { char info[100]; int top; }; void reset(stack *s) { s->top = -1; } void push(stack *s,
Hoofdstuk 3 Methoden om te tekenen.
Hoofdstuk 3 Tekenen en rekenen.
Hoofdstuk 4 Nieuwe methoden. Tekenen g.drawRect(20,60,40,40); g.drawLine(20,60,40,40); g.drawLine(40,40,60,60); g.drawRect(70,60,40,40); g.drawLine(70,60,90,40);
Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 7 Polymorfie en overerving © 2014, Gertjan Laan, versie 2.
Programma opdrachten methoden klasse variabelen en Geheugen objecten klasse zijn gegroepeerd in hebben als type veranderen bewerken.
Klasse uit library Android.App Activity Bij het starten van een app: nOperating system maakt een Activity -object aan… n…en neemt dat onderhanden met de.
Soorten programma’s nConsole- applicatie. Soorten programma’s nConsole- applicatie nWindows- applicatie.
Aangepaste timing nTheorie (16 colleges + 2 deeltentamens) nPraktijk (16 keer, 3 inleveropdrachten) college Tent. 1 Tent. 3 college prakt. 1 prakt. 3 prakt.
De definitie van een object. Een object is een verzameling van eigenschappen en bewerkingen. Veel voorkomende objecten zijn: D (display) Gui (user interface)
Animatie & Game Physics
Windows-applicatie using System.Windows.Forms; using System.Drawing;
Partial Classes, Enemies, Exceptions
Game Object Structuren
Activity Bij het starten van een app:
Aanroep van een methode voert opdrachten uit in de body daarvan
Gameprogrammeren: Objecten en geheugen
Gameprogrammeren: Game Assets
Gameprogrammeren: Lists en interfaces
Gameprogrammeren: Keuzeopdrachten
Gameprogrammeren: Overerving
Hoofdstuk 9.2 Strings.
Gameprogrammeren: Char en String
Gameprogrammeren: Variabelen, declaraties en toekenningen
Gameprogrammeren: Expressies
Windows-applicatie using System.Windows.Forms; using System.Drawing;
Gameprogrammeren: Animatie
Gameprogrammeren: Methoden
Gameprogrammeren: Overerving in Painter
Gameprogrammeren: Player input in Painter
Gameprogrammeren: Programmastructuur
Basis Gameprogrammeren
Gameprogrammeren: Willekeurigheid (Randomness)
Gameprogrammeren: Herhalingen
Declaratie Declaratie reserveert geheugenruimte
1. Een klasse is… Een groepje opdrachten Een groepje variabelen
Gameprogrammeren: Properties
Gameprogrammeren: Game Basics
Game Assets, Invoer Verwerken
Syntax van opdracht opdracht naam naam ( expressie ) ; . , expressie
Arjan Egges & Paul Bergervoet
Voorbeeld: Simulatie van bewegende deeltjes
Voortborduren op eerder gedaan werk
Libraries, Platform Games
Gameprogrammeren: Recursie
Gameprogrammeren: Abstracte klassen
Willekeurigheid en Herhaling
Aanroep van een methode voert opdrachten uit in de body daarvan
Gameprogrammeren: Tiles en File I/O in Tick Tick
Game: omgaan met tijd (Jewel-Jam)
Gameprogrammeren: Klassen en objecten
Arjan Egges & Paul Bergervoet
Object Communication (Jewel Jam)
Exceptions Exception:
Software Development fundamentals
Gameprogrammeren: Enemies in Tick Tick
Gameprogrammeren: Sprite sheets
Gameprogrammeren: Arrays
Transcript van de presentatie:

Arjan Egges & Paul Bergervoet Objecten en Methoden Arjan Egges & Paul Bergervoet

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 resultaatobject methode zonder parameters methode met 1 parameter

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);

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 }

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");

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

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

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...

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

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 - 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 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!

Objecten en geheugen Typen die gebaseerd zijn op een klasse werken anders verwijzing! Texture2D … width height data cannonBarrel

Waarom verwijzingen? Bij een aanroep van een methode wordt niet het hele geheugen gekopieerd, alleen de verwijzing Objecten kunnen worden doorgegeven tussen methoden

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…

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 }

Painter game geërfd van Game zelf gedeclareerd cs-simulatieobjecten

GraphicsDeviceManager Painter game SpriteBatch graphics GraphicsDeviceManager spriteBatch background Texture2D barrelPosition 72 405 barrelOrigin 34 angle cannonBarrel Texture2D cs-simulatieobjecten

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. }

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(…);

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

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.

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);

Objecten Object: groepje variabelen dat bij elkaar hoort 100 w 20 h h ! 255 r g b 3 aantal 199.95 prijs

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

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

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;

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;

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

Properties Sommige properties mag je alleen lezen String.Length Viewport.Width Sommige properties mag je ook schrijven Vector2.X Content.RootDirectory Cannon.Color

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; }

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!

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!

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

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

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);

InputHelper gebruiken protected override void Update(GameTime gameTime) { inputHelper.Update(); HandleInput(inputHelper); // hier nog de game wereld bijwerken }

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!

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

... 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; }

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

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);

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.