Gameprogrammeren: Overerving in Painter

Slides:



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

Hoorcollege 8 Game object structuren. Arrays in games Grid-gebaseerd speelveld (zoals Tetris) Lijst van spelers Lijst van inventory items Lijst van alle.
Hoofdstuk 8.5 Subklassen. versie-management problematiek Voortborduren op eerder gedaan werk nEerste poging: “knip&plak” class Twee { int x, y; int oud.
Hoorcollege 14 Vijanden, excepties. Wat zit allemaal in een level? Startpositie van de speler Waterdruppels Tiles Vijanden Einde van het level Achtergronden.
Static Keyword static voor functieleden functie niet voor een object aangeroepen class K {... static int minimum( int i, int j); } aanroep: K::minimum(
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.
Overerving: It’s a kind of magic…. Principes van OO: 1) Overerving 2) Encapsulatie 3) Polymorphisme = (deel van het) OO. paradigma.
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.
Constructoren Genesis 1:1 Aarde a1 = new Aarde(“Adam”, “Eva”);
Animatie nAnimatie: “tekenfilm” programma toont automatisch veranderende beelden nGemakkelijk te programmeren met gebruik van de klasse Thread “draadje”
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 8.5 Subklassen. versie-management problematiek Voortborduren op eerder gedaan werk nEerste poging: “knip&plak” class Twee { int x, y; int oud.
Scope. Scope van variaben/methoden Een variabele is te gebruiken binnen de { en } waarbinnen hij is aangemaakt. Hetzelfde geld voor een methode { int.
Polymorphisme en Interfaces: inleiding
Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 7 Polymorfie en overerving © 2014, Gertjan Laan, versie 2.
 C++ heeft een inheritance mechanisme  Manier om functionaliteit te ‘erfen’ van een parrent class ◦ Polymorphisme ◦ Zoals we het ook in C# kennen.
Soorten programma’s nConsole- applicatie. Soorten programma’s nConsole- applicatie nWindows- applicatie.
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
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
Partial Classes, Enemies, Exceptions
Game Object Structuren
Objectgeoriënteerd Programmeren (2)
1e Deeltentamen Nagekeken werk ligt voor in de zaal (alfabetisch op achternaam) Neem het even mee, de uitwerking wordt in het college besproken Discussies.
Gameprogrammeren: Objecten en geheugen
Gameprogrammeren: Game Assets
Gameprogrammeren: Lists en interfaces
Gameprogrammeren: Keuzeopdrachten
Gameprogrammeren: Overerving
Gameprogrammeren: Char en String
Gameprogrammeren: Variabelen, declaraties en toekenningen
Gameprogrammeren: Expressies
Windows-applicatie using System.Windows.Forms; using System.Drawing;
Gameprogrammeren: Animatie
Gameprogrammeren: Methoden
Arjan Egges & Paul Bergervoet
Gameprogrammeren: Player input in Painter
Gameprogrammeren: Programmastructuur
Basis Gameprogrammeren
Gameprogrammeren: Tiles in Tick Tick
Gameprogrammeren: Afsluiting
Gameprogrammeren: Willekeurigheid (Randomness)
Gameprogrammeren: Herhalingen
Declaratie Declaratie reserveert geheugenruimte
1. Een klasse is… Een groepje opdrachten Een groepje variabelen
Gameprogrammeren: Properties
Arjan Egges & Paul Bergervoet
Gameprogrammeren: Game Basics
Game Assets, Invoer Verwerken
Arjan Egges & Paul Bergervoet
Voortborduren op eerder gedaan werk
Libraries, Platform Games
Gameprogrammeren: Recursie
Gameprogrammeren: Abstracte klassen
Willekeurigheid en Herhaling
Gameprogrammeren: Interfaces
Arjan Egges Paul Bergervoet Wouter van Toll
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:
Gameprogrammeren: Enemies in Tick Tick
Gameprogrammeren: Sprite sheets
Gameprogrammeren: Arrays
Transcript van de presentatie:

Gameprogrammeren: Overerving in Painter Arjan Egges Paul Bergervoet Wouter van Toll

Onderwerpen in dit voorbeeld Klassen en objecten Overerving (Abstracte klassen)

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)

de constructormethode 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

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); = de methode mag vervangen worden in een subklasse Handige methoden voor game-objecten!

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<Texture2D>("spr_ball_red"), Content.Load<Texture2D>("spr_ball_green"), Content.Load<Texture2D>("spr_ball_blue")) } … Speciale versie van ThreeColorGameObject… … namelijk met een extra membervariabele! Informatie doorgeven aan constructormethode van ThreeColorGameObject base wijst naar het huidige object alsof hij het type van de superklasse heeft!

Ball overschrijft HandleInput Vervang de originele versie public override void HandleInput(InputHelper inputHelper) { if (inputHelper.MouseLeftButtonPressed() && !shooting) shooting = true; velocity = (inputHelper.MousePosition - position) * 1.2f; }

Andere methoden in de Ball-klasse 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 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’ Membervariabelen 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

GameWorld: 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

GameWorld: 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

Teken ‘game over’-overlay 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

Geluidseffecten (finishing touch) In de Ball-klasse: Membervariabele toevoegen: Effect laden in constructor: Afspelen bij afschieten: protected SoundEffect ballShot; ballShot = Content.Load<SoundEffect>("snd_shoot_paint"); if (inputHelper.MouseLeftButtonPressed() && !shooting) { shooting = true; velocity = (inputHelper.MousePosition - position) * 1.2f; ballShot.Play(); }

Abstracte klasse? ThreeColorGameObject mag abstract zijn Je maakt altijd een Ball, PaintCain, etc., en nooit een “gewone” ThreeColorGameObject Met abstract class ThreeColorGameObject { ... } kun je dit afdwingen