Gameprogrammeren

advertisement
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)
Download