Gameprogrammeren: Player input in Painter

Slides:



Advertisements
Verwante presentaties
Het type int Tekenen met Java operatoren
Advertisements

Hoofdstuk 2 Hallo, C# !.
Static Keyword static voor functieleden functie niet voor een object aangeroepen class K {... static int minimum( int i, int j); } aanroep: K::minimum(
Algoritmiek Object-georiënteerd Programmeren
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.
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 Tekenen en rekenen.
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.
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.
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
GUI & classes Een Gui in een class steken en het object gebruiken.
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:
Objectgeoriënteerd Programmeren (2)
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: Introductie
Gameprogrammeren: Overerving
Gameprogrammeren: Char en String
Arjan Egges & Paul Bergervoet
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: Overerving in Painter
Gameprogrammeren: Programmastructuur
Basis Gameprogrammeren
Gameprogrammeren: Tiles in Tick Tick
Gameprogrammeren: Afsluiting
Gameprogrammeren: Willekeurigheid (Randomness)
Gameprogrammeren: Herhalingen
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
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)
Gameprogrammeren: Enemies in Tick Tick
Gameprogrammeren: Sprite sheets
Gameprogrammeren: Arrays
Transcript van de presentatie:

Gameprogrammeren: Player input in Painter Arjan Egges Paul Bergervoet Wouter van Toll

Onderwerpen in dit voorbeeld Sprites tekenen Variabelen Input handling Methoden (Klassen)

De Painter-game Screenshot: Heeft een kanon dat de muispointer volgt

Roterend kanon Membervariabelen in de Painter-klasse: GraphicsDeviceManager graphics; SpriteBatch spriteBatch; Texture2D background, cannonBarrel; Vector2 barrelPosition, barrelOrigin; float angle;

Roterend kanon LoadContent-methode protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); background = Content.Load<Texture2D>("spr_background"); cannonBarrel = Content.Load<Texture2D>("spr_cannon_barrel"); barrelPosition = new Vector2(72, 405); barrelOrigin = new Vector2(cannonBarrel.Height, cannonBarrel.Height) / 2; } Height

Roterend kanon Hoek uitrekenen in de Update-methode: protected override void Update(GameTime gameTime) { MouseState mouse = Mouse.GetState(); double opposite = mouse.Y - barrelPosition.Y; double adjacent = mouse.X - barrelPosition.X; angle = (float)Math.Atan2(opposite, adjacent); }

Roterend kanon Alles tekenen protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.White); spriteBatch.Begin(); spriteBatch.Draw(background, Vector2.Zero, Color.White); spriteBatch.Draw(cannonBarrel, barrelPosition, null, Color.White, angle, barrelOrigin, 1.0f, SpriteEffects.None, 0); spriteBatch.End(); } De hoek geven we mee als parameter

Als de muisknop is ingedrukt (maar niet per se wordt) Roterend kanon Hoek kanon alleen aanpassen nadat je geklikt hebt protected override void Update(GameTime gameTime) { MouseState mouse = Mouse.GetState(); if (mouse.LeftButton == ButtonState.Pressed) double opposite = mouse.Y - barrelPosition.Y; double adjacent = mouse.X - barrelPosition.X; angle = (float)Math.Atan2(opposite, adjacent); } Als de muisknop is ingedrukt (maar niet per se wordt)

Toggling/wisselen Actie eenmalig uitvoeren als de speler de muisknop indrukt Wanneer drukt de speler op een knop? 1: als de speler de vorige keer de muisknop nog niet had ingedrukt 2: als de speler nu de muisknop wel ingedrukt heeft

Vorige + huidige status Twee MouseState membervariabelen: In de Update-methode: MouseState current, previous; protected override void Update(GameTime gameTime) { previous = current; current = Mouse.GetState(); // doe iets… }

Vorige + huidige status Muisklik afhandelen: protected override void Update(GameTime gameTime) { previous = current; current = Mouse.GetState(); if (current.LeftButton == ButtonState.Pressed && previous.LeftButton == ButtonState.Released) double opposite = current.Y - barrelPosition.Y; double adjacent = current.X - barrelPosition.X; angle = (float)Math.Atan2(opposite, adjacent); }

Alternatief met toetsenbord protected override void Update(GameTime gameTime) { KeyboardState k = Keyboard.GetState(); if (k.isKeyDown(Keys.K)) double opposite = mouse.Y - barrelPosition.Y; double adjacent = mouse.X - barrelPosition.X; angle = (float)Math.Atan2(opposite, adjacent); } Wordt alleen uitgevoerd als de K-toets ingedrukt is!

Spelerinvoer afhandelen Wordt omslachtig door previous/current states… 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 We maken een hulpklasse: class InputHelper { 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 IsMouseLeftButtonPressed() { return currMS.LeftButton == ButtonState.Pressed && prevMS.LeftButton == ButtonState.Released; } public bool IsKeyPressed(Keys k) return currKS.IsKeyDown(k) && prevKS.IsKeyUp(k);

InputHelper gebruiken in de game protected override void Update(GameTime gameTime) { inputHelper.Update(); HandleInput(inputHelper); // hier nog de game wereld bijwerken } Sla het verschil in keyboard/mouse state op Doe er iets mee

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!