Download - Introductie GameEngine. Inhoud De Game Package Speelveld aanmaken GameObjecten met plaatjes neerzetten De Game-loop Besturing door de speler.

Transcript
Page 1: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Introductie GameEngine

Page 2: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

InhoudDe Game PackageSpeelveld aanmakenGameObjecten met plaatjes neerzettenDe Game-loopBesturing door de spelerEen timer gebruikenEvents in het spel, waaronder collisions

Page 3: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Structuur van een spel

Een spel bestaat in het algemeen uit een aantal 'onderdelen':

Een 'wereld' (rooms, levels) met achtergrond waarin het spel zich afspeelt.

GameObject dat door de speler bestuurd wordt.Andere GameObjecten die met elkaar

interacteren.Geluid, Menu, Formulier, Scorebord...Spel 'loopt'.....!

Page 4: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

De Game Package

De game-package bevat allerlei zaken, die je helpen een spel te bouwen: 'Tile environment', wereldgrenzen, image...GameObject: statisch object in het spel.MovableGameObject: bewegend object in het spel

(de gameplayer is ook van dit type)Timer, Geluid, Formulier, Dashboard...Besturing (Touch screen, Motion Sensor..)GameEngine: laat het spel lopen, beheert lijst van

GameObjects, MovableGameObjects, achtergrond, etc.

Page 5: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

De Game Loop (eerste keer) De GameEngine start het spel en komt dan in een loop:

maak speelveld met achtergrondplaats initiële GameItems en GamePlayerInitialiseer variabelen (punten, etc)

while ( gameRunning ){

doe spelacties......

teken spel opnieuw}

Page 6: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Het speelveld (1)

Het speelveld kan zo groot zijn als je scherm en stil staan (bijv pacman).

Het speelveld kan ook groter dan je scherm zijn. Er is dan een viewport, een venster waardoor je een deel van het speelveld ziet.

speelveld viewport

speler

Page 7: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Het speelveld (2)

In platform games en shooters zorgt de game-package ervoor dat viewport met de speler mee beweegt. Je kunt dan de positie van de speler in de viewport instellen. In dit voorbeeld:horizontaal: midden.verticaal: beneden

speelveld viewport

speler

Page 8: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Het speelveld (3)

Achtergrond kan leeg zijn, maar je kunt deze ook vullen met plaatjes: tiles

int[][] map = {

{ -1, -1, 0, 2, -1, -1, -1, -1, -1, -1, -1, -1 },

{ -1, 0, 3, 3, 2, -1, -1, -1, -1, 0, 1, 1 },

{ 0, 3, 3, 3, 3, 2, -1, -1, 0, 3, 3, 3 },

{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }

};

0

1

2

3

4

Page 9: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Game Objects (1) GameObjecten kunnen statisch of bewegend zijn.Voor beide bevat de game-package standaardklassen, die je uitbreidt met je eigen functionaliteit.

class Flesje extends GameObject{ // eigen plaatje, gedrag...

// bijv: punten als speler het pakt}

class Kogel extends MoveableGameObject{ // eigen plaatje, gedrag...

// bijv: snelheid geven, botsen met vijand}

Page 10: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Game Objects (2) Statische objecten:maak je (constructor) geef je een positielaat je door de GameEngine op het speelveld zettenhebben 1 of meer plaatjes (sprite)kunnen zichtbaar/onzichtbaar zijnhebben een methode update() die elke gameloop

wordt aangeroepen

Plus het gedrag dat je erbij maakt!

Page 11: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Game Objects (3) Plaatjes zijn ingedeeld in frames. Die frames zitten in één image-bestand. Je geeft het aantal frames op, en de game-engine knipt dat plaatje op in frames.Animatie kan, zelf frame kiezen ook.

Page 12: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Game Objects (4) Bewegende objecten:hebben alles wat statische objecten ook hebben, plus:snelheidbotsingenwrijving

Page 13: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Game Objects (5) GameObjecten hebben een methode update() die elke gameloop wordt aangeroepen.

De standaardinvulling van deze methode zorgt voor essentiële basisacties als rendering, verplaatsen van bewegende objecten e.d.Door deze methode te overriden voeg je gedrag toe, bijvoorbeeld het afhandelen van botsingen, verwerken van input.Begin deze override altijd met super.update(), anders gebeuren de basisacties niet meer!

Page 14: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

De speler Er is geen speciaal object voor de speler. Dit is soms een gewoon GameObject, soms geen enkel.Je kunt wel een GameObject in de rol van speler aan de game toevoegen. De viewport volgt dan dit GameObject.

NB. Tetris is een voorbeeld van een spel zonder zichtbare speler.

Page 15: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

De Game Loop (tweede keer) De GameEngine verplaatst de bewegende objecten:

....

while ( gameRunning ){ update() van alle GameObjects

(standaard: sprite-animatie, verplaatsen van Moveables...) (niet-standaard in eigen override van update())

....pas zonodig viewport aan (bij bewegende speler)teken viewport opnieuw

}

Page 16: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Collision (1) De GameEngine kent twee manieren van collision detection:- MoveableGameObjects met andere GameObjects- MoveableGameObjects met tiles

De afhandeling van deze botsingen gaat op zeer verschillende wijze(vanwege de performance van de GameEngine)

Page 17: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Collision (2) In de methode update() van een MoveableGameObject kun je

opvragen met welke andere objecten je gebotst bent. Je krijgt een ArrayList van objecten terug:

ArrayList<GameObject> gebotst = getCollidedObjects();

Je kunt deze lijst nu aflopen en actie ondernemen. Zie bijvoorbeeld de klasse Vis.

NB: Alleen bewegende objecten (onderling + met stilstaande)!

Page 18: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Collision (3) Wanneer je in de achtergrond 'tiles' hebt, detecteert de GameEngine ook botsingen met die tiles. Dit is automatisch voor de MoveableGameObjects die de interface ICollision implementeren. Bij botsingen met tiles wordt dan aangeroepen

collisionOccurred(List<TileCollision> collidedTiles)

In de parameter krijg je een lijst van speciale objecten mee: TileCollision

Page 19: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Collision (4) Een TileCollision is een simpel object met twee variabelen:- De Tile waartegen je botste- een getal (0,1,2,3) dat aangeeft tegen welke kant

je botste.

Deze informatie kun je doorgeven aan methoden die het object laten ‘bouncen’ of stilzetten:- bounce(TileCollision tc)- MoveUpToTileSide(TileCollision tc)

Page 20: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

De Game Loop (derde keer) De GameEngine detecteert botsingen :

....

while ( gameRunning ){ update() van alle GameObjects

(standaard: sprite-animatie, verplaatsen van Moveables, detecteer tile-collisions voor ICollision-objecten...) (niet-standaard in eigen override van update() met: vraag object-collisions op)

....pas zonodig viewport aan (bij bewegende speler)teken viewport opnieuw

}

Page 21: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Aansturing op tijd (1) Soms wil je dingen met een vertraging laten gebeuren. Je kunt

dan bij de GameEngine een wekker (alarm) zetten, met het verzoek om een seintje te krijgen na een bepaalde tijd (een aantal stappen in de game-loop.

Bijv 1: Speler schiet en kan pas opnieuw schieten na verloop van een korte tijd.Bijv 2: Na een tijdje verschijnt er een nieuw hapje of power-up

Objecten die Alarms willen gebruiken, moeten de interface IAlarm gebruiken om wake-upcalls te ontvangen. Alarms kun je hergebruiken door ze te ‘restarten’.Voorbeeld: StrawberryControler.

Page 22: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Timers Werking timer:

new Alarm(tijd, id-nummer, this)startAlarm()

GameEngineGameEngineObject

implementsIAlarm

Object implements

IAlarm

(na <tijd> stappen van de game-loop:)

triggerAlarm(id-nummer)

Page 23: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

De Game Loop (vierde keer) De GameEngine laat alarms afgaan:

....while ( gameRunning ){ update() van alle GameObjects

(standaard: sprite-animatie, verplaatsen van Moveables, detecteer tile-collisions voor ICollision-objecten...) (niet-standaard in eigen override van update() met: vraag object-collisions op)update Alarms en laat ze zonodig aflopen

....pas zonodig viewport aan (bij bewegende speler)teken viewport opnieuw

}

Page 24: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

De Game Loop (vierde keer) De GameEngine detecteert botsingen:

while ( gameRunning ){ verplaats bewegende objecten

detecteer tile-collisions voor ICollision-objectenpas zonodig viewport aan (bij bewegende speler)roep methode update() van GameObjects aan

(in update: vraag object-collisions op)laat Alarms tikken en zonodig aflopen

....

teken viewport opnieuw}

Page 25: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

En nu aan de slag!

• Geen game-idee? Pak je favoriete Nintendo-spelletje, of kijk eens rond naar Flash-spelletjes op internet

• Maandag nog geen idee? Paul komt paar spel-ideeën laten zien.

Page 26: Introductie GameEngine. Inhoud  De Game Package  Speelveld aanmaken  GameObjecten met plaatjes neerzetten  De Game-loop  Besturing door de speler.

Samenstelling groepjeSamenstelling groepje

• Naar eigen inzicht duo’s kiezen, maar…

• Docent kan veto uitspreken

• Samenstelling uiterlijk maandag om 10.00 uur doorgeven per mail: [email protected].