We zijn bijna klaar met deze serie over objectgeoriënteerd programmeren en in dit artikel bespreken we het OOP-principe van abstractie - dat is, het generaliseren van een object - en het gebruik ervan in de ontwikkeling van spellen.
Notitie: Hoewel deze tutorial geschreven is met behulp van Java, zou je in bijna elke game-ontwikkelomgeving dezelfde technieken en concepten moeten kunnen gebruiken.
Abstractie is het principe van generalisatie. Dit vereist dat we van een specifiek exemplaar naar een meer algemeen concept gaan door na te denken over de meest elementaire informatie en functie van een object.
Dit klinkt misschien een beetje vreemd, maar we zijn al bekend met het concept van abstractie. Als u bijvoorbeeld het woord 'auto' zegt, waar denkt u dan aan? De kansen zijn dat we niet aan dezelfde auto denken. Ik dacht aan een zwarte Mustang Boss 302, een specifiek exemplaar van een auto. Geen van beiden was fout omdat het woord auto is een heel algemeen concept van een voertuig dat we gebruiken voor transport (of recreatie in mijn geval).
Hetzelfde geldt voor videogames. Videogames zijn onderverdeeld in groepen zoals RTS, RPG, Racing, enz. Deze groepen zijn allemaal gegeneraliseerde concepten die de gameplay van een game beschrijven. StarCraft II, Elder Scrolls V: Skyrim en Need for Speed zijn allemaal specifieke voorbeelden van deze algemene concepten.
Abstractie neemt dus veel specifieke instanties van objecten en extraheert hun algemene informatie en functies om een enkel gegeneraliseerd concept te creëren dat kan worden gebruikt om alle specifieke instanties als één te beschrijven.
Abstractie is nuttig omdat het alles tot zijn meest elementaire principes ontdoet. Dit kan helpen bij het inkapselen van de functionaliteit van een object, omdat het kan helpen bij het identificeren van de belangrijke informatie die zichtbaar moet worden gemaakt en de onbelangrijke informatie die verborgen kan worden gemaakt.
Abstractie helpt ook bij het Do not Repeat Yourself-principe. Door te nemen wat een groep objecten gemeen hebben en het te abstraheren, kunnen we helpen overtollige code in elk object te voorkomen, wat op zijn beurt meer onderhoudbare code creëert.
Laten we zoals eerder onze drie games gebruiken om enkele concrete voorbeelden van dit principe in actie te zien.
Om abstractie op Asteroïden toe te passen, denk na over de objecten ervan. Bedenk dat de objecten voor Asteroïden een schip, een asteroïde, een vliegende schotel en een kogel waren. Bedenk nu wat elk van deze objecten gemeen hebben. Delen ze staten, gedrag of functionaliteit? Door deze gemeenschappelijke elementen te nemen die alle objecten delen, kunnen we die elementen abstraheren naar een meer algemene klasse.
Een schip, een asteroïde, een vliegende schotel en een kogel zouden allemaal hetzelfde gedrag delen om over het scherm te bewegen. Je kunt dit gedrag abstraheren in een abstracte klasse die de gemeenschappelijke kwaliteiten bevat die nodig zijn om een object te verplaatsen. Deze kwaliteiten zouden staten zijn zoals positie en snelheid, en het gedrag van in beweging.
De geabstraheerde klasse in Java kan er als volgt uitzien:
/ ** * Abstracte klasse voor verplaatsen * / abstracte klasse Movable public float velocityX; openbare float snelheidY; openbare zwevende positieX; openbare zweefstandY; / ** * Functie - voert het gedrag (de taak) uit van het verplaatsen van de beweging Ship * / public void () positionX + = velocityX; positionY + = velocityY;
Er zijn andere gemeenschappelijke statussen, gedragingen en functies die alle objecten delen. Kun je aan hen denken? Deze kunnen allemaal worden toegevoegd aan één abstracte klasse.
Een ding waar je op moet letten, is het maken van een klodderklasse. Een blobklasse is elke klasse die alles uit een groep objecten probeert te verwerken, zelfs wanneer elk object niet dezelfde statussen, gedragingen en functionaliteit deelt. Alleen omdat een schip en een vliegende schotel kunnen schieten betekent niet dat je dat gedrag in dezelfde abstracte klasse moet plaatsen die wordt gebruikt om alle vier de objecten te beschrijven.
Bekijk de tutorial van Iain Lobb over de samenstelling van een lichaam om te zien hoe hij deze situatie vermijdt.
Zoals al vele malen eerder vermeld, heeft Tetris slechts één object, een Tetrimino. Dit belet echter niet dat Tetris een deel van zijn functionaliteit abstraheert. Een Tetrimino wordt bijna op dezelfde manier getekend als het speelveld en de andere game-beelden. Dit betekent dat je dit tekengedrag kunt abstraheren in een enkele klasse waartoe alle dingen behoren die op het scherm zijn getekend.
(Persoonlijk vind ik het leuk om zo'n klas te noemen Tekenbaar
, maar sprite
is ook een veelgebruikte naam.)
Pac-Man is een beetje interessanter in termen van abstractie. Pac-Man, een geest en een pac-dot delen niet echt alle gemeenschappelijke toestanden, gedragingen of functionaliteit. Ze kunnen op dezelfde manier naar het scherm worden getrokken, zodat een abstracte klasse voor het verwerken van tekeningen kan worden gemaakt, maar niet veel meer dan dat. Dus wat doe je? In dit geval is het prima om meerdere abstracte klassen te maken om de code te ordenen.
Begin met de klas om de tekening voor alle drie objecten af te handelen. Verwijder vervolgens de pac-stip uit de groep, want het is het object dat echt niet bij de anderen hoort. Dat laat Pac-Man en een geest achter. Bedenk nu wat deze twee objecten gemeen hebben en creëer een andere abstracte klasse voor deze objecten. Deze klasse kan staten bevatten zoals richting en snelheid, en het gedrag van in beweging.
Met twee abstracte klassen vermindert u de overtollige code die nodig was om de drie objecten te maken en verplaatst u deze naar één locatie die eenvoudig kan worden gewijzigd en gewijzigd.
Het principe van abstractie helpt redundante code te verminderen en meer onderhoudbare code te maken. Abstractie alleen doet echter niets als we niets doen met de geabstraheerde klassen. Hierover moeten we leren erfenis wat zal worden besproken in het volgende en laatste artikel van deze serie.
Volg ons op Twitter, Facebook of Google+ om op de hoogte te blijven van de laatste berichten.