Introductie GameEngine. Inhoud De Game Package Speelveld aanmaken GameObjecten met plaatjes...

Post on 12-May-2015

215 views 0 download

Transcript of Introductie GameEngine. Inhoud De Game Package Speelveld aanmaken GameObjecten met plaatjes...

Introductie GameEngine

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

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'.....!

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.

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}

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

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

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

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}

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!

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.

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

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!

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.

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

}

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)

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)!

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

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)

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

}

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.

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)

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

}

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}

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.

Samenstelling groepjeSamenstelling groepje

• Naar eigen inzicht duo’s kiezen, maar…

• Docent kan veto uitspreken

• Samenstelling uiterlijk maandag om 10.00 uur doorgeven per mail: ralphniels+oopd@gmail.com.