Research and Development 1/^Archief/2009-2010/07/Fase 2/Presentatie
Inhoud
Presentatiedoel
Dat het publiek ziet hoe ons product werkt aangaande klassen, gamemechanics en gameplay.
Inhoud
- <- Dit zijn sheetsuggesties
- Inleiding + Terminologie, Wat is een RTS? <br\> - Hoe werken de klassen met elkaar samen? (technisch) <br\> - Hoe werken de gamemechanics? (minder technisch) <br\> - Hoe werkt het spel voor de speler? (gebruiksaanwijzing/gameplay) <br\>
Inleiding (S)
- Coole titelpagina voor het keuvelen voor de presentatie
- Inhoudpagina
In deze presentatie gaan we het hebben over hoe ons spel werkt. We zullen het hebben over de klassen die we in java gemaakt hebben, de gamemechanics en hoe het spel zelf gespeeld wordt. Maar eerst komt er een stuk over wat een Strategy game nou eigenlijk is, en een korte recap.
Wat is een TBS? (S)
- Turnbased games pagina, met wat korte regeltjes/steekwoorden
Turn-Based Strategy games, of Strategy games in het algemeen, worden meestal gespeeld met 2 of meer groepen die elkaar proberen uit te schakelen. Een groep kan alles van 1 tot een groot aantal spelers bevatten. Het hoofddoel is dus de vijand uitschakelen, en de manier waarop dit gebeurt is vaak anders per spel. In veel Strategy-games worden basissen gebruikt. Dit zijn groepen gebouwen die gebruikt worden om eenheden te produceren om de vijand aan te vallen, maar ook zitten er vaak dingen zoals power plants tussen om stroom te genereren, en andere dingen. Vaak heeft elke speler 1 hoofdgebouw, dat ook vaak nodig is om andere gebouwen te kunnen bouwen. Er zijn ook zogenaamde turrets, dit zijn gebouwen met een of ander wapen zodat ze zichzelf kunnen verdedigen. Het bouwen van zogenaamde "forward bases" is ook belangrijk. Dit zijn basissen, met of zonder hoofdgebouw, die dichter bij het gevechtsfront of de vijand gelegen zijn, voor snellere responsietijd als er iets moet worden aangevallen. Een speler bestuurt zijn eigen eenheden over het speelveld, en confronteerd hiermee de vijand. Gevechten worden meestal bepaald door wie er de meeste eenheden heeft, wie er het beste de eenheden van de tegenstander tegenwerkt, etc. Strategische plaatsing is ook vaak belangrijk, aangezien alle eenheden een verschillend bereik hebben van waar ze naar kunnen vuren.
Turn-Based Strategy games zijn wat verschillend. In plaats van Real-time, zoals "normale" Strategy games, krijgt elke speler een beurt om dingen in te doen. Tijdens deze beurt kan de vijand dus niets doen. De speler heeft vaak een bepaald aantal punten, waarmee hij dan dingen kan doen. Vaak heeft elke eenheid afzonderlijk een aantal punten, zodat elke eenheid in een beurt een klein stuk bewogen kan worden, vijanden kan aanvallen enzovoort. Hoe een spel werkt wordt vaak aangeduid met de term Gamemechanics.
Recap (S)
- Klein recappaginaatje met spelertypes
Een korte recap over de eerste presentatie.
De combat in het spel is gebaseerd op legers. Een leger is gewoon een groepje eenheden die tegelijk bestuurd worden. Het spel heeft 2 teams. Elk team bestaat uit een aanvaller, een verdediger, en een manager. De aanvaller valt de vijand aan, en kan legers stationeren op plekken op de kaart. De verdediger plaatst legers in gebouwen om ze te verdedigen, en bouwt turrets. De manager beheert de grondstoffen en stroomtoevoer van een team. Dit vereist dus goed teamwork.
Klassen (P)
- Sheet met plaatje onderaan dit segment
Met behulp van dit plaatje willen we jullie een globaal idee geven van hoe wij het spel hebben ingedeeld in klassen, die met elkaar samenwerken, opdat het spel als geheel werkt.
Game: In het centrum van het plaatje zie je dan Game staan. Dit is eigenlijk de moederklasse die het gehele spel representeert. Het is het model van het spel. Deze klasse instantiatieert alles, zorgt ervoor dat het spel goed verloopt en opgestart en beeindigd wordt. Alle klassen die direct verbonden zijn met Game worden bijgehouden om alles goed te kunnen regelen. Om een spel te kunnen spelen heb je natuurlijk ook een Team met spelers nodig:
Team: Team is de klasse die een Team dat meespeelt in het spel representeert. Team houdt 3 spelers en wat teamstats bij zoals natuurlijk De teamnaam, kleur, de hoeveelheid stroom en een aantal GameObjecten onder dit team. Een team heeft 3 Players:
Player: Player is de klasse die een speler representeert. Player wordt bijgehouden door Team en kan veranderen door Game. Een player weet natuurlijk of hij een aanvaller, verdediger of manager is. Game wacht telkens totdat Speler een commando heeft ingevoerd. Hiervoor gebruikt Game TextIO:
TextIO: TextIO bevat methoden om tekstuitvoer weer te geven en om commando's aan de gebruiker te vragen. Game gebruikt deze. We hebben deze methoden bewust apartgezet, zodat we en in en uitvoer makkelijk in deze klasse kunnen veranderen, zonder het overal in andere klassen aan te passen.
CommandInterpreter: CommandInterpreter leest alle bekende commandos uit een file en stopt ze in een lijst van Commandos. Daarna kan er een string aan doorgegeven worden met een functie, waarna deze geinterpreteerd wordt door het op te zoeken en alle parameters in te lezen en op te slaan. Op basis van een aantal functies in CommandInterpreter kan bepaald worden of een commando goed is ingevuld en daarmee kan Game bijvoorbeeld de spelstatus aanpassen of dingen veranderen in de map:
MapReader: MapReader wordt aangeroepen door Map om een mapbestand in te lezen en vervolgens alle strings door te sturen naar de Map zodat deze zich kan genereren.
Map: Map gebruikt een MapReader om een bepaald mapfile in te lezen en maakt dan het terrein aan. Map wordt alleen gebruikt om een tekening weer te geven (via Canvas) en om het terrein bij te houden; andere zaken houdt Game bij.
Canvas: Canvas behoudt een Map en wordt geinstantieerd door Game. Na elk commando dat door de speler is ingevoerd, wordt zijn update-functie aangeroepen om de veranderingen in de Map te tekenen. Deze klasse bepaalt hoe alles op het scherm getekend wordt. En dus ook hoe de gameobjecten in de map getekend worden:
GameObject (Interface): GameObject is een interface voor GameObjecten die op de map kunnen voorkomen, zoals Buildings, Armies en Lege objecten. Wordt gebruikt voor methoden die elk object op de map zowieso moet hebben, zoals functies om het soort Object te bepalen en bijvoorbeeld de positie op de map. Ook is dit handig als we nieuwe Objecten willen maken.
ObjectManager: Objectmanager is een klasse speciaal voor het inlezen en gebruiken van data over de verschillende Units en Buildings. Alle stats van de GameObjects worden namelijk bijgehouden in bestanden. Met de ObjectManager die ook wordt bijgehouden door Game, kan makkelijk een kopie van een Unit of Building worden geleverd zodat je deze makkelijk kunt instantieren.
Gamemechanics (P)
- Sheet met steekwoorden "Combat", "Bouwen", "Stroom" lijkt me wel toepasselijk
In het spel moeten ook allerlei berekeningen worden uitgevoerd met betrekking tot stats van GameObjecten en bijvoorbeeld puntenverdelingen. Ik zal een paar voorbeelden geven van hoe wij deze Gamemechanics hebben aangepakt bij Combat, Bouwen en Stroomvoorraad.
Hoe werkt het Combat-model? Als een leger een vijandig leger tegenkomt gaan ze vechten. We hebben een methode die twee legers neemt, en dan berekent wie er hoeveel schade aan de vijand doet. Deze schade wordt berekent aan de hand van een paar stats van de eenheden van een leger. Er wordt dus een verdeling gemaakt van de kracht van beide legers, en aan de hand hiervan wordt de schade per leger berekend. Deze schade wordt dan toegepast op de sterkste eenheid van het andere leger. Dit gaat door en door, totdat een van de twee legers dood is. Dan heeft de ander dus gewonnen. Legers vechten dus met elkaar in 1 beurt tot de dood erop volgt.
Over het bouwen. Elke actie kost punten, zo kost ook een gebouw bouwen natuurlijk een aantal punten. Je hebt bij elke beurt een vast aantal punten beschikbaar, maar daarmee moet je wel elk gebouw kunnen bouwen in een enkele beurt. Het aantal punten dat een gebouw kost is direct afhankelijk van de resource-kosten van het resource-duurste gebouw. Dus nemen we het resource-duurste gebouw en bepalen dat dat 100% van je te besteden punten kost. De puntenkosten van de overige gebouwen worden dan bepaald door per gebouw de resource-kosten te delen door het duurste gebouw en dat vervolgens te vermenigvuldigen met het aantal te besteden punten.
PuntenKosten gebouw = (resource-kosten niet-duurtste gebouw / resource -kosten duurste gebouw) * aantal punten
Over de stroomtoevoer. Veel gebouwen hebben stroom nodig om te kunnen functioneren. We hebben stroom een teamgebaseerde waarde gemaakt, omdat we niet willen dat elke speler krachtcentrales moet bouwen om zijn gebouwen draaiend te houden. We hebben stroom gemaakt op een manier vergelijkbaar met grondstoffen, dit betekent dat een gebouw plaatsen dat stroom verbruikt ervoor zorgt dat die hoeveelheid stroom wordt afgetrokken van de teamvoorraad. Als een krachtcentrale wordt gebouwd wordt de hoeveelheid stroom die deze produceert juist opgeteld bij de stroomvoorraad. Dit is een makkelijke manier om de stroomvoorraad aan te passen en nu kunnen we ook kijken of een team genoeg stroom heeft door te kijken of de stroomvoorraad groter of gelijk aan nul is.
Gameplay (S)
Zoals jullie vorige keer al hadden gezien gaat de user input voornamelijk via commandos. We hebben een aantal commandos, en die hebben we hier op een lijstje gezet.
- Sheet met lijstje commandos
Commands: Het commands-commando geeft gewoon een lijst weer van alle mogelijke commandos om in te voeren. Handig voor nieuwe spelers.
Help: Help is ook handig voor nieuwe spelers. Het geeft de helptekst die bij een gegeven commando hoort weer, waar dus staat wat het doet en hoe je het moet gebruiken.
List: List is een erg belangrijk commando. Het geeft een lijst weer, met een paar parameters. Het spel maakt gebruik van laatst opgeroepte lijsten om andere commandos te interpreteren. Je kan lijsten oproepen van jou, je team, de vijand of het spel zelf, en dan lijsten van eenheden, gebouwen en legers. Een erg belangrijk commando dus.
Info: Info geeft de informatie van iets aan. Dit kan informatie van een gebouw, eenheid of leger zijn. Deze informatie bevat de stats, in het geval van legers en gebouwen de inhoud, eventuele eenheden die een gebouw kan produceren en hoeveel gezondheid een eenheid nog heeft.
Status: Status geeft de huidige status van jou als speler weer. Dingen zoals je overgebleven punten, je grondstoffenaantal, enzovoort.
Pass: Pass beeindigt je beurt. De volgende speler is meteen aan de beurt.
Team: Team geeft de informatie van je team weer, dus alle spelers en wat stats.
Pay: Pay zorgt ervoor dat je een hoeveelheid grondstoffen aan een andere speler kan geven, als hij dat nodig heeft.
Build: Het Build commando wordt gebruikt om gebouwen te bouwen. Het kost een aantal beurtpunten, afhankelijk van de kosten van een gebouw. We hebben het zo gedaan dat het duurste gebouw een hele beurt kost om te bouwen, en dat andere gebouwen hier een percentage van nemen.
Repair: Het Repair-commando repareert een gebouw. Dit kost een aantal grondstoffen, maar niet zoveel als een nieuw gebouw zou kosten. Het kost ook een aantal punten.
Destroy: Destroy vernietigd een gebouw, en geeft je sommige grondstoffen terug die gebruikt waren in de bouw.
Army: Het Army-commando is ook erg belangrijk. Het maakt een nieuw leeg leger aan bij het hoofdgebouw van jouw team, waar je dan eenheden naartoe kunt trainen om de vijand aan te vallen of jezelf te verdedigen.
Train: Met het Train-commando train je een aantal eenheden naar een leger. Dit is dus ook erg belangrijk, want zonder dit commando zijn je legers waardeloos. Dit commando kost ook een hoeveelheid punten.
Disband: Disband verwijdert een leger. Valt te vergelijken met Destroy, alleen kan je je units niet terug-trainen dus krijg je hier ook geen grondstoffen voor terug.
Move: Het Move-commando is zeer belangrijk. Het wordt gebruikt om legers over de map te verschuiven. De Verdediger van een team gebruikt het om legers van het ene gebouw naar het andere te bewegen, terwijl de Aanvaller van een team het gebruikt om legers naar plekken op de kaart te sturen en daar eventueel dingen aan te vallen. We hebben geen apart attack-commando, omdat we ervoor hebben gezorgd dat als een leger toevallig een vijandig leger tegenkomt, ze automatisch moeten vechten.
Met al deze commandos wordt dus het spel gespeeld. Dit was handig om te implementeren, omdat we alleen voor elk commando een methode hoefden te maken, die dan alles zelf regelde. Alles in het spel gebeurt via deze commandos, dus hoeven er geen real-time zaken te worden berekend.
- Coole outro-sheet
Dit was de presentatie. Vragen?