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, PC)
Hoorcollege 6 Afronding Painter, overerving
opdrachten methoden variabelen objecten klasse zijn gegroepeerd in hebben als type veranderen bewerken Programma en geheugen
Dat moet handiger kunnen! Voortborduren op eerder gedaan werk Veel dingen zijn hetzelfde tussen de Cannon, PaintCan en Ball klassen – Bijna dezelfde membervariabelen – Constructormethoden lijken op elkaar – Draw-methode is soms helemaal hetzelfde!
class Painter : Game Painter is een subklasse van Game Game is de superklasse van Painter Elk Painter-object is tevens een Game-object Een Painter-object is een bijzonder geval van een Game-object Subklassen
Over-erving Objecten van een subklasse erven variabelen en methoden&properties van de superklasse Overgeërfd Zelf gedeclareerd Painter IsMouseVisible Content GraphicsDevice game spriteBatch screen inputHelper randomgameWorld graphics
Een object uitbreiden Hoe kunnen we een object uitbreiden? – Meer variabelen toevoegen – Extra methoden/properties toevoegen – Bestaande methoden/properties veranderen/vervangen Hiervoor gebruiken we het keyword virtual in combinatie met override
Een object uitbreiden Voorbeeld: Painter klasse als subklasse van Game – Variabelen toevoegen (spriteBatch, …) – Methodes toevoegen (HandleInput) – Methodes vervangen (Update, Draw, …) Ander voorbeeld: ThreeColorGameObject klasse als basis voor alle game objecten in Painter (Ball, PaintCan, Cannon)
class ThreeColorGameObject { protected Texture2D colorRed, colorGreen, colorBlue; protected Texture2D currentColor; protected Vector2 position, velocity; protected Color color; public ThreeColorGameObject(Texture2D colorRed, Texture2D colorGreen, Texture2D colorBlue) { this.colorRed = colorRed; this.colorGreen = colorGreen; this.colorBlue = colorBlue; Color = Color.Blue; position = Vector2.Zero; velocity = Vector2.Zero; } … Toegang verlenen aan subklassen Parameters van de constructormethode
Protectiemechanisme public – Iedereen mag het gebruiken protected – Alleen subklassen mogen het gebruiken private – Alleen de eigen klasse mag het gebruiken Mechanisme kun je gebruiken voor membervariabelen, methoden en properties
Protectiemechanisme In Painter: class Ball {... protected float mass; public Vector2 position; public float Mass { get {... } } public void Update(); private void InterneMethode();... } Ball ball = new Ball(...); float a = ball.mass; float s = ball.Mass; ball.position = Vector2.Zero; ball.Update(); ball.InterneMethode(); Nee, dat mag niet! Ja, dat mag! Ja, dat mag ook! En zelfs dat mag. Maar dit mag niet!
class ThreeColorGameObject {... public virtual void HandleInput(InputHelper inputHelper) { } public virtual void Update(GameTime gameTime) { position += velocity * (float)gameTime.ElapsedGameTime.TotalSeconds; } public virtual void Draw(GameTime gameTime, SpriteBatch spriteBatch) { spriteBatch.Draw(currentColor, position, Color.White); } Handige methoden voor game objecten! = de methode mag vervangen worden in een subklasse
De klasse ThreeColorGameObject class ThreeColorGameObject {... public Vector2 Center { get { return new Vector2(currentColor.Width, currentColor.Height) / 2; } public Vector2 Position { get { return position; } } public Color Color... } Handige properties voor game objecten!
De nieuwe Ball-klasse class Ball : ThreeColorGameObject { bool shooting; public Ball(ContentManager Content) : base(Content.Load ("spr_ball_red"), Content.Load ("spr_ball_green"), Content.Load ("spr_ball_blue")) { } … Informatie doorgeven aan ThreeColorGameObject constructormethode Speciale versie van ThreeColorGameObject… base wijst naar het huidige object alsof hij het type van de superklasse heeft! … namelijk met een extra membervariabele!
Base versus this Painter IsMouseVisible Content GraphicsDevice game this “base this” spriteBatch screen inputHelper randomgameWorld graphics base
Een Ball object maken Declaratie Geheugen reserveren Base constructor This constructor Toekenning object aan variabele Ball b; b = new Ball(Content); b Ball colorRed positionvelocitycolor colorBlue currentColor colorGreen shooting false Texture2D
Omdat Ball ook een ThreeColorGameObject is, mag dit ook: Aanroepen van methode: – Die van Ball! Dit effect noemen we polymorfisme Object-verwijzingen ThreeColorGameObject b = new Ball(Content); b.HandleInput(); Welke versie van HandleInput wordt nu aangeroepen?
Virtual - Override A a = new B (); dit mag, als class B : A a. m( ); deze methode komt uit klasse: B als m virtual in A en override in B A anders
Voordelen van overerving Je hoeft je code niet telkens te knippen/plakken Uitbreidingen van ThreeColorGameObject kun je in alle subklassen gebruiken Vastleggen van interface voor gebruik Als we de PaintCan-klasse laten overerven van ThreeColorGameObject – gratis property Center!
Superklassen in libraries Texture2D : Texture Texture : GraphicsResource superklasse super- superklasse
Ball public override void HandleInput(InputHelper inputHelper) { if (inputHelper.MouseLeftButtonPressed() && !shooting) { shooting = true; velocity = (inputHelper.MousePosition - position) * 1.2f; } Vervang de originele versie
public override void Reset() { base.Reset(); position = new Vector2(65, 390); velocity = Vector2.Zero; shooting = false; } Roep de originele versie aan Andere methoden in de Ball klasse
Ball public override void Update(GameTime gameTime) { if (shooting) { velocity.X *= 0.99f; velocity.Y += 6; } else { Color = Painter.GameWorld.Cannon.Color; position = Painter.GameWorld.Cannon.BallPosition - Center; } if (Painter.GameWorld.IsOutsideWorld(position)) Reset(); base.Update(gameTime); } Welke versie wordt hier aangeroepen?
Omgaan met ‘game over’ Member variabelen in de GameWorld klasse: Texture2D background, gameover; Ball ball; PaintCan can1, can2, can3; Cannon cannon; int lives; Texture2D livesSprite; Game over overlay Bijhouden en tekenen aantal levens
HandleInput public void HandleInput(InputHelper inputHelper) { if (lives > 0) { cannon.HandleInput(inputHelper); ball.HandleInput(inputHelper); } else { if (inputHelper.KeyPressed(Keys.Space)) Reset(); } Ander gedrag afhankelijk van het aantal overgebleven levens
Update public void Update(GameTime gameTime) { if (lives > 0) { ball.Update(gameTime); can1.Update(gameTime); can2.Update(gameTime); can3.Update(gameTime); } Objecten alleen updaten indien speler nog levens heeft
public void Draw(GameTime gameTime, SpriteBatch spriteBatch) { spriteBatch.Begin(); spriteBatch.Draw(background, Vector2.Zero, Color.White); ball.Draw(gameTime, spriteBatch); cannon.Draw(gameTime, spriteBatch); can1.Draw(gameTime, spriteBatch); can2.Draw(gameTime, spriteBatch); can3.Draw(gameTime, spriteBatch); for (int i = 0; i < lives; i++) spriteBatch.Draw(livesSprite, new Vector2(i * livesSprite.Width + 15, 20), Color.White); if (lives <= 0) spriteBatch.Draw(gameover, new Vector2(Painter.Screen.X – gameover.Width, Painter.Screen.Y - gameover.Height) / 2, Color.White); spriteBatch.End(); } Teken game over overlay
Tekst op het scherm tekenen Gebruik de methode DrawString uit de SpriteBatch klasse Type: string – Lijst van karakters Er is ook een type om 1 karakter te representeren: char
1970s:6 bits = 64 symbols 26 letters, 10 digits, 28 leestekens 1980s: 7 bits = 128 symbols +26 lowercase, +5 leestekens, 33 control 1990s: 8 bits = 256 symbols +letters met accenten 2000s: 16 bits = symbols +Grieks, Cyrillisch, Japans, Devangari,... IBM/DOS Geschiedenis van char ASCII ANSI/ISO Unicode
Character coding code 0 code 127 code 48 code 32 code 65 code 97
char bijzonderheden alfabetisch geordend char c; if ( ’A’<=c && c<=’Z’ ) … converteerbaar naar int int n; n = c + 32; en terug c = (char) n;
Conversies Conversie (cast) naar “grotere” waarde kan altijd double d; int n; d = n; int n; char c; n = c; ThreeColorGameObject x; Ball b = new Ball(Content); x = b; Conversie naar “kleinere” waarde is gevaarlijk n = (int) d;c = (char) n; b=(Ball) x;
twee tekens in de broncode, toch één character! Speciale char-waarden Letterlijk symbool Speciaal symbool Het quote-symbool Het backslash-symbool ’A’ ’\n’ ’\’’ ’\\’ ’&’ ’\t’ ’\”’
Strings string altijd tussen dubbele aanhalingstekens: Syntaxdiagram voor constanten: string test = "Dit is een test";
Score op het scherm tekenen Draw methode van GameWorld uitbreiden: public void Draw(GameTime gameTime, SpriteBatch spriteBatch) { spriteBatch.Begin(); spriteBatch.Draw(background… …. spriteBatch.DrawString(gameFont, "Score: " + score, new Vector2(20, 18), Color.White); for (int i = 0; i < lives; i++) spriteBatch.Draw(livesSprite, … if (lives <= 0) spriteBatch.Draw(gameover, … spriteBatch.End(); } Tekst op het scherm tekenen
Geluidseffecten ( finishing touch ) In de Ball klasse: – Membervariabele toevoegen: – Effect laden in constructor: – Afspelen bij afschieten: protected SoundEffect ballShot; ballShot = Content.Load ("snd_shoot_paint"); if (inputHelper.MouseLeftButtonPressed() && !shooting) { shooting = true; velocity = (inputHelper.MousePosition - position) * 1.2f; ballShot.Play(); }
Hiërarchie-ontwerp class Voertuig :Vervoermiddel class Boot :Vervoermiddel “is een” Vervoer middel Voertuig Boot
Hiërarchie-ontwerp ontwerpkeuze: ondergrond gaat voor motorisatie ontwerpkeuze: motorfiets is meer motor dan fiets Vervoer middel Auto Motor Fiets Voertuig Boot Vliegtuig Vracht Wagen Stoom Boot Motor Voertuig Fiets Motor Boot Zeil Boot
Practicumdeadline Komende zondag – Middernacht Lever je opdracht in via Submit …probeer dat eerder dan 23:59:59 te doen Te laat inleveren = geen practicumcijfer!
Toets vrijdag Zaal: Ruppert-Blauw Tijd: uur Let op: geen open-boek! Je krijgt een bijlage met XNA/C# klassen en methoden Vrijdag zijn er geen andere bijeenkomsten voor Gameprogrammeren!