Vortex
Projecten
© 2002-2003, Joost Ronkes Agerbeek
Je bent kapitein van het sterrenschip de Lone Crusader. Je bent op een saaie routinemissie en leunt verveeld achterover. Op dat moment begint je display te knipperen. Al je instrumenten slaan op hol en je sensors werken niet meer. Plotseling doemt vlak voor je een grote, kleurrijke draaikolk op en voor je het weet word je de vortex binnen gezogen en beland je in een andere dimensie. Je enige hoop is om de vortex in deze dimensie te vinden en er doorheen te vliegen, maar op weg naar huis kom je allerlei gevaren tegen.
Aan jullie de opdracht om het spel Vortex te schrijven. Maak hierbij gebruik van de kennis die je hebt opgedaan tijdens het programmeren van Pengo. Gebruik dezelfde structuur van je programma en neem de code die je voor Pengo hebt geschreven als voorbeeld voor Vortex.
Download het spel Vortex om te zien wat je uiteindelijk in moet leveren en om een idee te krijgen van de regels van het spel.
Startdocument
In het startdocument neem je de volgende zaken op:
- de namen van de leden van de projectgroep
- de samenstelling van de duo-groepen
- een planning van het project
Gebruik het raamwerk van het startdocument als basis.
Planning
Zorg ervoor dat je niet te veel tijd kwijt bent aan het startdocument, anders heb je te weinig tijd om Vortex te programmeren. In ongeveer een uur moet je de projectopdracht kunnen doornemen en een planning kunnen maken.
De stilstaande objecten zijn vrij rechttoe-rechtaan programmeerwerk. De meeste code kun je rechtstreeks uit Pengo halen, alleen zul je in het begin even moet zoeken waar alles staat en dat kost wat tijd. Vergeet niet om tijd in te plannen voor het samenvoegen van de duo-producten. Dat is meer dan alleen maar wat bestanden kopiëren, maar een lesuur moet ruim voldoende zijn.
De bewegende objecten lijken erg veel op de stilstaande objecten, alleen kunnen ze ook bewegen (dûh). Je hoeft nu niet meer te zoeken naar de code waarmee je objecten moet programmeren, dus daarmee win je tijd ten opzichte van de stilstaande objecten. Die tijd heb je nodig om de beweging te programmeren. Al met al zul je ongeveer net zoveel tijd kwijt zijn aan bewegende objecten als aan stilstaande objecten. Het samenvoegen is wel iets ingewikkelder en zal ook wat langer duren.
Het schrijven van de collision detection wordt de moeilijkste taak en neemt misschien wel evenveel tijd in als de stilstaande en bewegende objecten bij elkaar. Het samenvoegen van de duo-producten is daarentegen weer wat makkelijker dan bij de bewegende objecten.
Stilstaande objecten
Een aantal objecten in Vortex staan stil. Deze objecten moet je laden uit het levelbestand, op het level zetten en tekenen.
Om te zorgen dat je meteen aan de slag kunt met het programmeren van het spel, hoef je zelf geen venster te programmeren; die code krijg je van ons. Bovendien hebben we al een begin gemaakt met het laden van het level en het tekenen van het level. Kies uit onderstaand rijtje voor welke IDE je de code wilt downloaden.
Even een opmerking over het bestand Level.dat. Alle objecten zijn opgeslagen in de grid van het level. Bij Pengo stonden de vijanden er nog los onder; dat is nu niet meer het geval. Als je objecten aan het inlezen bent, kun je alle velden die een object bevatten dat jij niet programmeert rustig negeren. Die velden blijven dan leeg. Bijvoorbeeld, jij moet de code schrijven om sterrenvelden in te lezen. Als je dan een zwart gat of een vortex tegenkomt in het levelbestand, dan doe je gewoon alsof het een leeg veld is.
Lever altijd alle bron- en headerbestand gezipt in. (In één zipbestand graag; dus wees geen lolbroek door alle bestanden apart te zippen.) Dat zijn de bestanden met de extensies .cpp en .h. Voeg ook je projectbestanden toe aan het zipbestand. De extensies hiervan verschillen per IDE.
- voor Microsoft Visual Studio: .dsp en .dsw
- voor Borland C++ Builder: .bpr
- voor Bloodshed DevC++: .dev
Voeg bestanden met andere extensies niet toe aan je zipbestand; die nemen alleen maar onnodig ruimte in.
Vortex
De speler wint een level door zijn schip de vortex in te bewegen. Een level heeft precies één vortex; niet meer en niet minder.
Tijdens het programmeren van de vortex moet je voor het volgende zorgen:
- de vortex moet op het level staan
- de vortex moet uit het levelbestand gelezen worden
- de vortex moet getekend worden
Om dit te bereiken neem je de volgende stappen.
- Schrijf een structure met de naam Vortex waarin je de positie van de vortex opslaat. (Vortex.h)
- Breid de structure Level uit, zodat je een vortex op het level kunt zetten. (Level.h)
- Schrijf een functie CreateVortex die de waarden van de vortex initialiseert. (Vortex.cpp)
- Breid de functie LoadLevel uit zodat de vortex uit het levelbestand gelezen kan worden. (Level.cpp)
- Schrijf een functie DrawVortex waarmee je een vortex kunt tekenen. (Graphics.cpp)
- Breid de functie DrawLevel uit, zodat je de vortex op het level naar de backbuffer tekent. (Graphics.cpp)
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Zwart gat
Een zwart gat slokt alles op wat erin terecht komt. De speler mag zijn schip niet een zwart gat insturen, want dan verliest hij. Ook meteorieten en torpedo’s gaan verloren in een zwart gat.
Tijdens het programmeren van de zwarte gaten moet je voor het volgende zorgen:
- de zwarte gaten moeten op het level staan
- de zwarte gaten moeten uit het levelbestand gelezen worden
- de zwarte gaten moeten getekend worden
Om dit te bereiken neem je de volgende stappen.
- Schrijf een structure met de naam BlackHole waarin je de positie van een zwart gat opslaat. (BlackHole.h)
- Breid de structure Level uit, zodat je een reeks van zwarte gaten op het level kunt zetten. (Level.h)
- Schrijf een functie CreateBlackHole die de waarden van een zwart gat initialiseert. (BlackHole.cpp)
- Breid de functie LoadLevel uit zodat zwarte gaten uit het levelbestand gelezen kunnen worden. (Level.cpp)
- Schrijf een functie DrawBlackHole waarmee je een zwart gat kunt tekenen. (Graphics.cpp)
- Breid de functie DrawLevel uit, zodat je alle zwarte gaten op het level naar de backbuffer tekent. (Graphics.cpp)
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Sterrenveld
Een sterrenveld is een cluster met sterren die zo dicht op elkaar staan dat niets of niemand er doorheen kan.
Tijdens het programmeren van de sterrenvelden moet je voor het volgende zorgen:
- de sterrenvelden moeten op het level staan
- de sterrenvelden moeten uit het levelbestand gelezen worden
- de sterrenvelden moeten getekend worden
Om dit te bereiken neem je de volgende stappen.
- Schrijf een structure met de naam Starfield waarin je de positie van een sterrenveld opslaat. (Starfield.h)
- Breid de structure Level uit, zodat je een reeks van sterrenvelden op het level kunt zetten. (Level.h)
- Schrijf een functie CreateStarfield die de waarden van een sterrenveld initialiseert. (Starfield.cpp)
- Breid de functie LoadLevel uit zodat sterrenvelden uit het levelbestand gelezen kunnen worden. (Level.cpp)
- Schrijf een functie DrawStarfield waarmee je een sterrenveld kunt tekenen. (Graphics.cpp)
- Breid de functie DrawLevel uit, zodat je alle sterrenvelden op het level naar de backbuffer tekent. (Graphics.cpp)
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Samenvoegen
Alle duo-producten moeten samengevoegd worden tot één groepsproduct. Sommige bestanden zijn door meerdere duo-groepen bewerkt, dus je kunt niet zomaar alle bestanden in een zipbestand gooien. Volg de volgende stappen om alle code goed samen te voegen.
- Neem het raamwerk voor Vortex als uitgangspunt en controleer of je het zonder problemen kunt compileren.
- Voeg de volgende bestanden toe aan het project: Vortex.h, Vortex.cpp, BlackHole.h, BlackHole.cpp, Starfield.h, Starfield.cpp.
- Voeg de volgende functies toe aan Graphics.cpp: DrawVortex, DrawBlackHole, DrawStarfield.
- Open Graphics.cpp en voer de wijzigingen door die iedere duo-groep heeft gemaakt aan DrawLevel.
- Open Level.h en voeg de uitbreidingen van iedere duo-groep toe aan de structure Level.
- Open Level.cpp en voer de wijzigingen door die iedere duo-groep heeft gedaan aan LoadLevel. (Da’s even lekker knutselen.)
- Zorg ervoor dat het project compileert en start. (Denk aan je #include’s.)
Het voorbeeld laat je zien wat je code moet doen als jullie alles goed gedaan hebben.
Bewegende objecten
Een aantal objecten die in Vortex staan kunnen bewegen. Net als de stilstaande objecten moet je deze objecten op het level zetten en tekenen. Daarnaast moet je een functie schrijven die het object verplaatst.
Gebruik als uitgangspunt het vorige groepsproduct. Op die manier hebben jullie allemaal dezelfde basis. Omdat collision detection tijdens het volgende product komt, kan het zijn dat de bewegende objecten af en toe onverwachte dingen doen. Kijk naar het voorbeeld dat bij elk duo-product staat om te zien of dat zo hoort of dat er ergens een foutje in je code zit.
Lever alle bron- en headerbestanden gezipt in. (In één zipbestand graag; dus wees geen lolbroek door alle bestanden apart te zippen.) Dat zijn de bestanden met de extensies .cpp en .h. Voeg ook je projectbestanden toe aan het zipbestand. De extensies hiervan verschillen per IDE.
- voor Microsoft Visual Studio: .dsp en .dsw
- voor Borland C++ Builder: .bpr
- voor Bloodshed DevC++: .dev
Voeg bestanden met andere extensies niet toe aan je zipbestand; die nemen alleen maar onnodig ruimte in.
Speler
De speler beweegt zijn schip over het level en moet proberen de vortex te bereiken.
Tijdens het programmeren van de speler moet je voor het volgende zorgen:
- de speler moet op het level staan
- de speler moet uit het levelbestand gelezen worden
- de speler moet getekend worden
- de speler moet kunnen bewegen
Om dit te bereiken neem je de volgende stappen.
- Schrijf een enum Directions met de opsomming van de richtingen Up, Down, Left en Right. (Movement.h)
- Schrijf een structure met de naam Player waarin je de positie van de speler en de richting waarin de speler kijkt opslaat en waaraan je een variabele toevoegt die aangeeft of de speler beweegt. (Player.h)
- Breid de structure Level uit, zodat je een speler op het level kunt zetten. (Level.h)
- Schrijf een functie CreatePlayer die de waarden van de speler initialiseert. (Player.cpp)
- Breid de functie LoadLevel uit zodat de speler uit het levelbestand gelezen kan worden. (Level.cpp)
- Schrijf een functie DrawPlayer waarmee je een speler kunt tekenen. (Graphics.cpp)
- Breid de functie DrawLevel uit, zodat je de speler op het level naar de backbuffer tekent. (Graphics.cpp)
- Handel het bericht WM_KEYDOWN af en zorg ervoor dat de speler omhoog, naar beneden, naar links en naar rechts verplaatst kan worden. (Main.cpp)
- Schrijf een functie MovePlayer die de speler één stap verplaatst. (Player.cpp)
- Breid de event loop uit, zodat de speler over het level verplaatst wordt met een vertraging van 150 milliseconden. (Main.cpp)
Als je een unresolved external error krijgt van de linker, voeg dan winmm.lib (voor DevC++ libwinmm.a) toe aan de bestanden die je mee linkt.
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Meteoriet
De meteoriet beweegt in een vaste baan door de ruimte. De speler moet ervoor zorgen dat hij niet tegen de meteoriet aanvliegt, anders wordt zijn sterrenschip vernietigd.
Tijdens het programmeren van de meteoriet moet je voor het volgende zorgen:
- de meteoriet moet op het level staan
- de meteoriet moet uit het levelbestand gelezen worden
- de meteoriet moet getekend worden
- de meteoriet moet kunnen bewegen
Om dit te bereiken neem je de volgende stappen.
- Schrijf een enum Directions met de opsomming van de richtingen Up, Down, Left en Right. (Movement.h)
- Schrijf een structure met de naam Meteorite waarin je de positie van de meteoriet en de richting waarin de meteoriet beweegt opslaat. (Meteorite.h)
- Breid de structure Level uit, zodat je een reeks van meteorieten op het level kunt zetten. (Level.h)
- Schrijf een functie CreateMeteorite die de waarden van een meteoriet initialiseert. (Meteorite.cpp)
- Breid de functie LoadLevel uit zodat de meteorieten uit het levelbestand gelezen kunnen worden. (Level.cpp)
- Schrijf een functie DrawMeteorite waarmee je een meteoriet kunt tekenen. (Graphics.cpp)
- Breid de functie DrawLevel uit, zodat je de meteorieten op het level naar de backbuffer tekent. (Graphics.cpp)
- Schrijf een functie MoveMeteorite die een meteoriet één stap verplaatst – zie de beschrijving hieronder voor meer informatie. (Player.cpp)
- Breid de event loop uit, zodat de meteorieten over het level verplaatst worden met een vertraging van 50 milliseconden. (Main.cpp)
Als je een unresolved external error krijgt van de linker, voeg dan winmm.lib (voor DevC++ libwinmm.a) toe aan de bestanden die je mee linkt.
Over de functie MoveMeteorite: voorlopig hoef je er alleen maar voor te zorgen dat als de Direction van de meteoriet Left is, hij naar links beweegt. Is de Direction Up, dan gaat hij naar boven enzovoort.
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Torpedo
De speler kan torpedo’s afvuren waarmee hij de baan van een meteoriet kan beïnvloeden.
Tijdens het programmeren van de torpedo moet je voor het volgende zorgen:
- de torpedo moet op het level staan
- de torpedo moet getekend worden
- de torpedo moet kunnen bewegen
- er mogen maximaal drie torpedo’s op het level staan
Om dit te bereiken neem je de volgende stappen.
- Schrijf een enum Directions met de opsomming van de richtingen Up, Down, Left en Right. (Movement.h)
- Schrijf een structure met de naam Torpedo waarin je de positie van de torpedo en de richting waarin de torpedo beweegt opslaat. (Torpedo.h)
- Breid de structure Level uit, zodat je een reeks van torpedo’s op het level kunt zetten. (Level.h)
- Schrijf een functie CreateTorpedo die de waarden van een meteoriet initialiseert. (Torpedo.cpp)
- Schrijf een functie DrawTorpedo waarmee je een torpedo kunt tekenen. (Graphics.cpp)
- Breid de functie DrawLevel uit, zodat je de torpedo op het level naar de backbuffer tekent. (Graphics.cpp)
- Handel het bericht WM_KEYDOWN af en zorg ervoor dat er een torpedo op het level verschijnt zodra de speler op de spatie drukt --– zie de beschrijving hieronder voor meer informatie. (Main.cpp)
- Schrijf een functie MoveTorpedo die een torpedo één stap verplaatst – zie de beschrijving hieronder voor meer informatie. (Torpedo.cpp)
- Breid de event loop uit, zodat de torpedo’s over het level verplaatst worden met een vertraging van 10 milliseconden. (Main.cpp)
Als je een unresolved external error krijgt van de linker, voeg dan winmm.lib (voor DevC++ libwinmm.a) toe aan de bestanden die je mee linkt.
Torpedo’s worden afgevuurd door de speler en ze verschijnen op het veld als de speler op de spatie drukt. Alleen op dit moment is er nog geen speler op het level (daar is een andere duo-groep druk mee bezig). Je moet de torpedo dus even op een willekeurige plek op het level laten ontstaan, bijvoorbeeld op de coördinaten 5, 5. Er mogen maximaal drie torpedo’s tegelijk op het level aanwezig zijn. Je moet dus controleren hoeveel torpedo’s er zijn, voordat je een nieuwe aanmaakt.
Een torpedo beweegt altijd in een rechte lijn. In MoveTorpedo moet je dus controleren welke richting de torpedo opgaat en hem die kant op bewegen. Momenteel vliegen torpedo’s het level uit. Daar hoef je je geen zorgen over te maken; dat probleem wordt opgelost als je de collision detection gaat programmeren.
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Samenvoegen
Alle duo-producten moeten samengevoegd worden tot één groepsproduct. Sommige bestanden zijn door meerdere duo-groepen bewerkt, dus je kunt niet zomaar alle bestanden in een zipbestand gooien. Volg de volgende stappen om alle code goed samen te voegen.
- Neem het vorige groepsproduct als uitgangspunt en controleer of je het zonder problemen kunt compileren.
- Voeg de volgende bestanden toe aan het project: Movement.h (maakt niet uit welke, ze zijn als het goed is allemaal hetzelfde), Player.h, Player.cpp, Meteorite.h, Meteorite.cpp, Torpedo.h, Torpedo.cpp.
- Voeg de volgende functies toe aan Graphics.cpp: DrawPlayer, DrawMeteorite, DrawTorpedo.
- Open Graphics.cpp en voer de wijzigingen door die iedere duo-groep heeft gemaakt aan DrawLevel.
- Open Level.h en voeg de uitbreidingen van iedere duo-groep toe aan de structure Level.
- Open Level.cpp en voer de wijzigingen door die iedere duo-groep heeft gedaan aan LoadLevel.
- Open Main.cpp en voer de wijzigingen door die iedere duo-groep heeft gedaan aan de event loop, de window procedure en alles wat daar bijhoort.
- Zorg ervoor dat het project compileert en start. (Denk aan winmm.lib.)
Het voorbeeld laat je zien wat je code moet doen als jullie alles goed gedaan hebben.
Collision detection
Auw! Botsing. Nu alle objecten op het scherm staan, moeten jullie programmeren wat er gebeurt als de objecten met elkaar botsen.
Gebruik als uitgangspunt het vorige groepsproduct. Op die manier hebben jullie allemaal dezelfde basis.
Lever alle bron- en headerbestanden gezipt in. (In één zipbestand graag; dus wees geen lolbroek door alle bestanden apart te zippen.) Dat zijn de bestanden met de extensies .cpp en .h. Voeg ook je projectbestanden toe aan het zipbestand. De extensies hiervan verschillen per IDE.
- voor Microsoft Visual Studio: .dsp en .dsw
- voor Borland C++ Builder: .bpr
- voor Bloodshed DevC++: .dev
Voeg bestanden met andere extensies niet toe aan je zipbestand; die nemen alleen maar onnodig ruimte in.
Speler
Tijdens het programmeren van de collision detection voor de speler moet je voor het volgende zorgen:
- de speler kan niet van het level af bewegen
- de speler kan niet door sterrenvelden heen bewegen
- als de speler tegen een zwart gat of een meteoriet komt, gaat hij dood
- als de speler tegen de vortex komt, heeft hij gewonnen
- als de speler dood is of heeft gewonnen, stopt het spel
Om dit te bereiken neem je de volgende stappen:
- Breid de structure Player uit met een variabele die bijhoudt of de speler dood is en met een variabele die bijhoud of de speler gewonnen heeft. (Player.h)
- Breid de functie CreatePlayer uit, zodat de twee nieuwe variabelen in de structure Player geïnitialiseerd worden. (Player.cpp)
- Pas de functie MovePlayer aan, zodat de speler niet meer van het veld af kan bewegen – zie de beschrijving hieronder voor meer informatie. (Player.cpp)
- Schrijf een functie IsStarfield die controleert of op de opgegeven coördinaten een sterrenveld staat. (Level.cpp)
- Pas de functie MovePlayer aan, zodat de speler niet door een sterrenveld heen kan bewegen – zie de beschrijving hieronder voor meer informatie. (Player.cpp)
- Schrijf een functie IsBlackHole die controleert of op de opgegeven coördinaten een zwart gat staat. (Level.cpp)
- Schrijf een functie IsMeteorite die controleert of op de opgegeven coördinaten een meteoriet staat. (Level.cpp)
- Pas de functie MovePlayer aan, zodat na het verplaatsen van de speler gecontroleerd wordt of de speler tegen een meteoriet of een zwart gat is aangevlogen. Zo ja, dan is de speler dood. Zie de beschrijving hieronder voor meer informatie. (Player.cpp)
- Schrijf een functie IsVortex die controleert of op de opgegeven coördinaten de vortex staat. (Level.cpp)
- Pas de functie MovePlayer aan, zodat na het verplaatsen van de speler wordt gecontroleerd of de speler tegen de vortex is aangevlogen. Zo ja, dan wint de speler het spel. Zie de beschrijving hieronder voor meer informatie. (Player.cpp)
- Pas de event loop aan, zodat het spel stopt als de speler dood is of gewonnen heeft. (Main.cpp)
Het schema hieronder geeft aan wat de code van MovePlayer moet doen.
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Meteoriet
Tijdens het programmeren van de collision detection voor de meteorieten moet je voor het volgende zorgen:
- een meteoriet kan niet van het level af bewegen
- als de meteoriet tegen een sterrenveld, tegen de vortex of tegen een andere meteoriet aankomt, dan vervolgt hij zijn baan in een andere richting
- als de meteoriet tegen een torpedo aankomt, dan verandert zijn richting en wordt de torpedo vernietigd
- als de meteoriet tegen de speler aankomt, verliest de speler het spel
- als de meteoriet tegen een zwart gat aankomt, verdwijnt de meteoriet
Om dit te bereiken neem je de volgende stappen:
- Pas de functie MoveMeteorite aan, zodat een meteoriet niet van het veld af kan bewegen – zie de beschrijving hieronder voor meer informatie. (Meteorite.cpp)
- Schrijf een functie IsStarfield die controleert of op de opgegeven coördinaten een sterrenveld staat. (Level.cpp)
- Schrijf een functie IsVortex die controleert of op de opgegeven coördinaten de vortex staat. (Level.cpp)
- Schrijf een functie IsMeteorite die controleert of op de opgegeven coördinaten een meteoriet staat. (Level.cpp)
- Pas de functie MoveMeteorite aan, zodat een meteoriet van richting veranderd als hij tegen een sterrenveld, de vortex of een andere meteoriet aan komt – zie de beschrijving hieronder voor meer informatie. (Meteorite.cpp)
- Schrijf een functie IsTorpedo die controleert of op de opgegeven coördinaten een torpedo staat. (Level.cpp)
- Schrijf een functie GetTorpedo die de torpedo teruggeeft die op de opgegeven coördinaten staat. (Level.cpp)
- Schrijf een functie EraseTorpedo die de opgegeven torpedo van het level verwijdert. (Level.cpp)
- Pas de functie MoveMeteorite aan, zodat bij een botsing tussen een meteoriet en een torpedo de meteoriet van richting verandert en de torpedo vernietigd wordt – zie de beschrijving hieronder voor meer informatie. (Meteorite.cpp)
- Schrijf een functie IsPlayer die controleert of op de opgegeven coördinaten de speler staat. (Level.cpp)
- Breid de structure Player uit met een variabele die bijhoudt of de speler dood is. (Player.h)
- Breid de functie CreatePlayer uit, zodat de nieuwe variabele in de structure Player geïnitaliseerd worden. (Player.cpp)
- Pas de functie MoveMeteorite aan, zodat de speler dood gaat als een meteoriet de speler raakt – zie de beschrijving hieronder voor meer informatie. (Meteorite.cpp)
- Pas de event loop aan, zodat het spel stopt als de speler dood is. (Main.cpp)
- Schrijf een functie EraseMeteorite die de opgegeven meteoriet van het level verwijdert. (Level.cpp)
- Schrijf een functie IsBlackHole die controleert of op de opgegeven coördinaten een zwart gat staat. (Level.cpp)
- Pas de functie MoveMeteorite aan, zodat een meteoriet verdwijnt zodra hij een zwart gat raakt – zie de beschrijving hieronder voor meer informatie. (Meteorite.cpp)
- Pas de event loop aan, zodat het spel stopt als de speler dood is.
Een meteoriet beweegt in cirkels. Dat wil zeggen, hij beweegt eerst net zo lang naar – laten we zeggen – links, totdat hij een obstakel tegenkomt. Daarna beweegt hij naar beneden, tot hij weer een obstakel tegenkomt. Vervolgens naar rechts, dan naar boven, weer naar links enzovoort. Obstakels zijn: de vortex, sterrenvelden en andere meteorieten.
Zodra de speler een torpedo tegen een meteoriet aanschiet, beweegt de meteoriet verder in de richting van de torpedo. De torpedo wordt vernietigd. Als de speler een meteoriet raakt, verliest hij het spel. Als een meteoriet een zwart gat in vliegt, wordt hij opgeslokt.
Het schema hieronder geeft aan wat de code van MoveMeteorite moet doen.
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Torpedo
Tijdens het programmeren van de collision detection voor de torpedo’s moet je voor het volgende zorgen:
- een torpedo verdwijnt aan de randen van het level
- als een torpedo tegen de vortex, tegen een sterrenveld of tegen een zwart gat aankomt, verdwijnt de torpedo
- als een torpedo tegen een meteoriet aankomt, verandert de richting van de meteoriet en verdwijnt de torpedo
Om dit te bereiken neem je de volgende stappen:
- Pas de window procedure aan, zodat een torpedo ontstaat voor het schip van de speler – zie de beschrijving hieronder voor meer informatie. (Main.cpp)
- Schrijf een functie EraseTorpedo die de opgegeven torpedo van het level verwijdert. (Level.cpp)
- Pas de functie MoveTorpedo aan, zodat de torpedo verdwijnt zodra hij van het level af gaat – zie de beschrijving hieronder voor meer informatie. (Torpedo.cpp)
- Schrijf een functie IsVortex die controleert of op de opgegeven coördinaten de vortex staat. (Level.cpp)
- Schrijf een functie IsStarfield die controleert of op de opgegeven coördinaten een sterrenveld staat. (Level.cpp)
- Schrijf een functie IsBlackHole die controleert of op de opgegeven coördinaten een zwart gat staat. (Level.cpp)
- Pas de functie MoveTorpedo aan, zodat de torpedo verdwijnt zodra hij tegen de vortex, een sterrenveld of een zwart gat aankomt – zie de beschrijving hieronder voor meer informatie. (Torpedo.cpp)
- Schrijf een functie IsMeteorite die controleert of op de opgegeven coördinaten een meteoriet staat. (Level.cpp)
- Schrijf een functie GetTorpedo die de torpedo teruggeeft die op de opgegeven coördinaten staat. (Level.cpp)
- Pas de functie MoveTorpedo aan, zodat bij een botsing tussen de torpedo en een meteoriet de meteoriet de richting van de torpedo overneemt en de torpedo verdwijnt – zie de beschrijving hieronder voor meer informatie.
Tot nu toe heb je de torpedo ergens middenin het level laten ontstaan. Een torpedo wordt geschoten door de speler en moet dus ook ontstaan op de plaats waar de speler staat. Dit doe je op de volgende manier:
- Maak een nieuwe torpedo op de coördinaten van de speler.
- Geef de torpedo dezelfde richting als de speler.
- Voeg de torpedo toe aan het level.
- Zorg ervoor dat in DrawLevel de torpedo wordt getekend voordat de speler wordt getekend.
Een torpedo beweegt in een rechte lijn, net zo lang totdat hij een obstakel tegen komt. Elk obstakel waarmee de torpedo botst, zorgt ervoor dat de torpedo explodeert. Een torpedo is niet sterk genoeg om een meteoriet te vernietigen, maar hij zorgt er wel voor dat de meteoriet zijn richting overneemt.
Het schema hieronder geeft aan wat de code van MoveTorpedo moet doen.
Het voorbeeld laat je zien wat je code moet doen als je alles goed gedaan hebt.
Samenvoegen
Alle duo-producten moeten samengevoegd worden tot één groepsproduct. Sommige bestanden zijn door meerdere duo-groepen bewerkt, dus je kunt niet zomaar alle bestanden in een zipbestand gooien. Volg de volgende stappen om alle code goed samen te voegen.
- Neem het vorige groepsproduct als uitgangspunt en controleer of je het zonder problemen kunt compileren.
- Vervang de volgende bestanden door hun nieuwe versies: Player.h, Player.cpp, Meteorite.cpp, Torpedo.cpp.
- Voeg de functies EraseMeteorite, EraseTorpedo, GetMeteorite, GetTorpedo, IsBlackHole, IsMeteorite, IsPlayer, IsStarfield, IsTorpedo en IsVortex toe aan Level.cpp. Sommige van deze functies heb je dubbel, maar als het goed is zijn ze hetzelfde dus het maakt niet uit welke je kiest.
- Neem de veranderingen over die gemaakt zijn in de window procedure.
- Neem de veranderingen over die gemaakt zijn aan de event loop.
- Zorg ervoor dat het project compileert en start.
Het voorbeeld laat je zien wat je code moet doen als jullie alles goed gedaan hebben.
Laatst bijgewerkt:
dinsdag 15 april 2014