Basis Gameprogrammeren Arjan Egges & Paul Bergervoet Soorten programma’s • Consoleapplicatie Soorten programma’s • Consoleapplicatie • Windowsapplicatie Soorten programma’s • Consoleapplicatie • Windowsapplicatie • Webapplicatie Soorten programma’s • Consoleapplicatie • Windowsapplicatie • Webapplicatie • Game Soorten programma’s • Consoleapplicatie • Windowsapplicatie • Webapplicatie • Game • App Opbouw broncode • Opdrachten om het geheugen te veranderen • Opdrachten zijn gegroepeerd in methoden • Methoden zijn gegroepeerd in klassen Soorten opdrachten • Toekennings -opdracht: verander het geheugen • Aanroep van een andere methode: voer eerst de opdrachten in die methode uit, en ga daarna verder waar je gebleven was en dat kunnen zelf ook weer aanroepen zijn van weer andere methodes... dus de “waar was ik gebleven” administratie is best ingewikkeld! Voorbeeld C#-programma using System; één klasse ...met één methode ...met twee opdrachten class Hallo { static void Main ( ) { Console.WriteLine("Hallo!"); Console.ReadLine( ); } } accolades begrenzen klasse, resp. methode Klasse- en methode-header using System; naam: bedacht door de programmeur één van de methodes moet Main heten class Hallo { static void Main ( ) { Console.WriteLine("Hallo!"); Console.ReadLine( ); } } Opdracht: methode-aanroep using System; opdrachten: aanroep van andere methoden class Hallo { static void Main( ) { Console.WriteLine("Hallo!"); Console.ReadLine ( ); } } klasse waaruit de methode komt altijd een punt naam van de methode overige details Klasse-bibliotheken library-klassen mag je gebruiken... als je ze maar aangeeft in welke library ze staan using System; class Hallo { static void Main( ) { Console.WriteLine("Hallo!"); Console.ReadLine( ); } } Methode-header en -aanroep using System; methodeheader methodeaanroep class Hallo { static void Main( ) { Console.WriteLine("Hallo!"); Console.ReadLine( ); } } Syntax en semantiek • Syntax: de vorm van het programma • Semantiek: wat het programma betekent Syntax van toplevel-declaratie De gamewereld • Bestaat uit twee onderdelen: – Informatie (aantal levens, spelerpositie, de score) • Staat in het geheugen – Gedrag (botsingen tussen game objecten afhandelen, strategie van een vijand, andere game physics) • Wordt afgehandeld door de game loop • Oftewel: instructies die uitgevoerd worden door een processor De game loop • Belangrijkste onderdelen: – UPDATE – pas de toestand van de gamewereld aan – DRAW – teken de gamewereld op het scherm • Beide acties worden steeds opnieuw aangeroepen – In de vorm van methoden! UPDATE DRAW using Microsoft.Xna.Framework; class LeegSpel : Game using: welke bibliotheken gebruiken we { static void Main() { LeegSpel game = new LeegSpel(); game.Run(); Methode om de game } te initializeren (constructor-methode). public LeegSpel() { } De Update actie protected override void Update(GameTime gameTime) { } protected override void Draw(GameTime gameTime) { } } De Draw actie Achtergrondkleur class BasicXNAGame : Game { GraphicsDeviceManager graphics; static void Main() { BasicXNAGame game = new BasicXNAGame(); game.Run(); Constructor } Initialiseer graphics device public BasicXNAGame() { graphics = new GraphicsDeviceManager(this); } … Achtergrondkleur … protected override void Update(GameTime gameTime) { } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Olive); } } Verander de achtergrondkleur De gamewereld • Een game wereld bestaat uit: – Informatie – Gedrag • Informatie wordt opgeslagen in het geheugen • Hiervoor gebruiken we variabelen Variabelen • Variabele: geheugenplaats met een naam • Declaratie: aangifte van het type van de variabele int x, y; • Toekenningsopdracht: variabele krijgt waarde x = 20; x y 20 Toekenningsopdrachten int x, y; x = 20 ; • Expressie aan de rechterkant mag andere variabelen gebruiken y=x+5; • Vorige waarde gaat verloren x=y*2; y=y+1; x 20 50 y 25 26 Syntax van opdracht (toekenning) Syntax van opdracht Declaratie en toekenningen • Eén keer declarareren int xx;= 100; Declaratie en eerste toekenning • Mogelijk meerdere toekenningen x = 100; x = 250; x = x + 1; x = 2 * x; Syntax van declaratie Type van variabelen int x; double d; x d 3 10 3.3333333333 3.141592653 10.0 • int geheel getal • double benadering van reëel getal x = 10 ; d = 3.141592653 ; d = 10 ; x=x/3; d=d/3; Const declaratie const double double pi pi = 3.1415926535897938; Latere toekenningen verboden pi = 4.0; double straal = 2.0; double oppervlakte = pi * straal * straal; Syntax van declaratie Plaats van een declaratie Standaardtypes gehele getallen 1 byte sbyte ± 127 2 bytes short ± 32767 4 bytes int 8 bytes long ± 2 miljard ± 1018 byte ushort uint ulong 0..255 28-1 0..65535 216-1 0..4 miljard 232-1 0..1019 met een decimale punt 4 bytes 8 bytes float 7 cijfers, afgerond, ≤1038 double 15 cijfers, afgerond, ≤10300 16 bytes decimal 28 cijfers, exact, ≤1028 264-1 Constanten • geheel getal (kleinst passende) hexadecimaal 0 137 –25 0x1A • met een decimale punt 0.5 –273.15 6.02E23 602000000000000000000000 26 1E3 1000 0xFF 255 3E–11 0.00000000003 • string (tekst) "Hallo!" "A" "" "een \"citaat\"" "\n" "\\" Typering van operatoren • Beide argumenten geheel resultaatwaarde geheel 2+5 3*4 5/2 • Minstens één floating resultaatwaarde floating 0.5 * 7 10 / 3.0 1.5 * 2.5 • bij + operator ook: Minstens één string resultaatwaarde string “ga” + “me” “€” + bedrag Verschillende typen • int en double zijn voorbeelden van een primitief of built-in type • C# kent ook `complexere’ types – Color – GameTime – GraphicsDevice – …en nog veel meer… Syntax van type Kleuren Color(...) (0,255,0) (255,0,0) (255,255,0) (255,255,255) (0,255,255) (255,0,255) (0,0,255) (0,0,0) Variabelen van het type ‘Color’ Type Variabelenamen Color blueColor, greenColor, redColor, grayColor, whiteColor; blueColor = new Color(0, 0, 255); greenColor = new Color(0, 255, 0); redColor = new Color(255, 0, 0); grayColor = new Color(200, 200, 200); whiteColor = new Color(255, 255, 255); We gebruiken `new’ voor niet-primitieve typen Declaraties Toekenningen Informatie om de kleur te kunnen maken Mengkleuren • • • • • new Color(255, 0, new Color(255, 64, new Color(255, 128, new Color(255, 192, new Color(255, 255, 0) 0) 0) 0) 0) Properties • Variabelen kunnen `eigenschappen’ hebben, ook wel genoemd properties grayColor.R • `R’ is een property van het Color type en geeft de roodwaarde aan – De roodwaarde is zelf weer van het type int – Dus we zouden dit kunnen doen: int roodwaarde; roodwaarde = grayColor.R; Type: int Properties • Ander voorbeeld van een property: gameTime.TotalGameTime • `TotalGameTime’ is een property van het GameTime type en geeft de totaal gepasseerde tijd aan – De gepasseerde tijd heeft ook weer een type: TimeSpan – En dat type heeft een property `Milliseconds’ gameTime.TotalGameTime.Milliseconds Type: int Achtergrondkleur v2 class BasicXNAGame : Game { GraphicsDeviceManager graphics; Color background; Variabele om de kleur in te bewaren static void Main() { BasicXNAGame game = new BasicXNAGame(); game.Run(); } public BasicXNAGame() { graphics = new GraphicsDeviceManager(this); } … Achtergrondkleur v2 Bepaal rood-waarde aan de hand van de tijd … protected override void Update(GameTime gameTime) { int red = gameTime.TotalGameTime.Milliseconds; background = new Color(red, 0, 0); Maak een nieuwe } achtergrondkleur protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(background); } } Verander de achtergrondkleur Meer properties Color.Olive Maar hoe zit het met ‘Color.Olive’ dan? • Sommige properties zijn geen eigenschappen van variabelen, maar van typen. • Het type van `Color.Olive’ is ook weer van het type Color – Property wordt `misbruikt’ voor simpeler notatie voor: new Color(128, 128, 255) Properties • De property `Olive’ hoort bij een type `Color’: Color.Olive • De property `TotalGameTime’ hoort bij een variabele van het type `GameTime’: gameTime.TotalGameTime • De property `R’ hoort ook bij een variabele van het type `Color’ – Dus dit mag niet: Color.R Properties • Als properties niet bij een variabele horen, maar bij een type, noemen we ze static – static properties: Color.Olive, Color.Black – Niet-static properties: background.R, gameTime.TotalGameTime • Methoden kunnen ook static zijn, bijvoorbeeld Main, of niet-static, bijvoorbeeld Update: static void Main() … protected override void Update(GameTime gameTime) Variabelen declareren • In een methode: kan alleen in die methode gebruikt worden • In een klasse: kan in alle methoden van de klasse gebruikt worden – Die variabelen noemen we dan attributen of membervariabelen • De plekken waar een variabele gebruikt kan worden noemen we de scope (bereik) van een variable Syntax van opdracht Expressies • Expressie: stukje programma met een waarde • Gebruik van expressies: – Rechterkant van een toekennings-opdracht x = y+40 ; – Parameter van een methode Console.WriteLine(y + 40); Opbouw van expressies • Constante 5 • Variabele red expressie expressie • … operator … x+y+1 • (…) x - (y + 1) expressie Syntax van expressies Operatoren • • • • • + * / % optellen aftrekken vermenigvuldigen delen rest bij deling 14 / 3 geeft 4 14 % 3 geeft 2 bij deling van int-waarden: cijfers achter de komma worden afgekapt! want 14 is 4*3 + 2 Prioriteit van operatoren • Vermenigvuldigen en delen gaat voor optellen en aftrekken 1 + 2 * 3 geeft 7 • Bij gelijke prioriteit: van links naar rechts 10 - 5 - 2 geeft 3 • Wil je ’t anders: zet haakjes (1+2) * 3 geeft 9 Het type van een expressie • • • • • • • • 98765 "Hallo" 4/3 67890+1 "Hallo " + naam naam.Length "Hallo " + naam.Length Color.White int string int int string int string Color Het type van een expressie • • • • • • • Color.Black Vector2.Zero new Vector2() new Horse() new Size(100.0f, 200.0f) new GraphicsDevice(this) new Color(255, 128, 0) Color Vector2 Vector2 Horse Size GraphicsDevice Color Syntax van expressies (deel 2)