Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdJozef Smits Laatst gewijzigd meer dan 10 jaar geleden
1
Introductie GameEngine
2
Inhoud De Game Package Speelveld aanmaken GameObjecten met plaatjes neerzetten De Game-loop Besturing door de speler Een timer gebruiken Events in het spel, waaronder collisions
3
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'.....!
4
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.
5
De Game Loop (eerste keer) De GameEngine start het spel en komt dan in een loop: maak speelveld met achtergrond plaats initiële GameItems en GamePlayer Initialiseer variabelen (punten, etc) while ( gameRunning ) { doe spelacties...... teken spel opnieuw }
6
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
7
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
8
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 } }; 0123401234
9
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 }
10
Game Objects (2) Statische objecten: maak je (constructor) geef je een positie laat je door de GameEngine op het speelveld zetten hebben 1 of meer plaatjes (sprite) kunnen zichtbaar/onzichtbaar zijn hebben een methode update() die elke gameloop wordt aangeroepen Plus het gedrag dat je erbij maakt!
11
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.
12
Game Objects (4) Bewegende objecten: hebben alles wat statische objecten ook hebben, plus: snelheid botsingen wrijving
13
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!
14
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.
15
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 }
16
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)
17
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 gebotst = getCollidedObjects(); Je kunt deze lijst nu aflopen en actie ondernemen. Zie bijvoorbeeld de klasse Vis. NB: Alleen bewegende objecten (onderling + met stilstaande)!
18
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 collidedTiles) In de parameter krijg je een lijst van speciale objecten mee: TileCollision
19
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)
20
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 }
21
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.
22
Timers Werking timer: new Alarm(tijd, id-nummer, this) startAlarm() GameEngine Object implements IAlarm Object implements IAlarm (na stappen van de game-loop:) triggerAlarm(id-nummer)
23
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 }
24
De Game Loop (vierde keer) De GameEngine detecteert botsingen: while ( gameRunning ) {verplaats bewegende objecten detecteer tile-collisions voor ICollision-objecten pas 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 }
25
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.
26
Samenstelling 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. ralphniels+oopd@gmail.com
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.