Vi er nesten ferdige med denne serien om objektorientert programmering, og i denne artikkelen diskuterer vi OOP-prinsippet om abstraksjon - det vil si generalisering av et objekt - og dets bruk i spillutvikling.
Merk: Selv om denne opplæringen er skrevet ved hjelp av Java, bør du kunne bruke de samme teknikkene og konseptene i nesten hvilket som helst spillutviklingsmiljø.
Abstraksjon er prinsippet om generalisering. Dette krever at vi beveger oss fra en bestemt forekomst til et mer generalisert konsept ved å tenke på den mest grunnleggende informasjonen og funksjonen til et objekt.
Dette kan høres litt rart ut, men vi er allerede kjent med begrepet abstraksjon. For eksempel, hvis jeg sier ordet "bil", hva synes du om? Odds er at vi ikke tenkte på den samme bilen. Jeg tenkte på en svart Mustang Boss 302, som er et bestemt eksempel på en bil. Ingen av oss hadde galt fordi ordet bil er et veldig generelt konsept av et kjøretøy som vi bruker til transport (eller rekreasjon i mitt tilfelle).
Det samme gjelder for videospill. Videospill er kategorisert i grupper som RTS, RPG, Racing, etc ... Disse gruppene er alle generaliserte konsepter som beskriver spillets spill. StarCraft II, eldre Scrolls V: Skyrim, og Need for Speed er alle konkrete forekomster av disse generaliserte konseptene.
Således tar abstraksjon mange konkrete forekomster av objekter og trekker ut sin vanlige informasjon og funksjoner for å skape et enkelt generalisert konsept som kan brukes til å beskrive alle konkrete tilfeller som en.
Abstraksjon er nyttig fordi det striper alt ned til de mest grunnleggende prinsippene. Dette kan bidra til å inkapslere funksjonaliteten til et objekt fordi det kan bidra til å identifisere viktig informasjon som skal gjøres synlig og den uvesentlige informasjonen som kan skjules.
Abstraksjon hjelper også med Do not Repeat Yourself-prinsippet. Ved å ta hva en gruppe objekter har til felles og abstrahere den, kan vi bidra til å forhindre overflødig kode i hvert objekt som igjen skaper mer vedlikeholdsbar kode.
Som før, la oss bruke våre tre spill for å se noen konkrete eksempler på dette prinsippet i aksjon.
For å begynne å bruke abstraksjon til Asteroider, tenk på dens objekter. Husk at gjenstandene for asteroider var et skip, en asteroide, en flygende tallerken og en kule. Nå tenk på hva hver av disse objektene har til felles. Deler de noen stater, atferd eller funksjonalitet? Ved å ta disse felleselementene som alle objektene deler, kan vi trekke disse elementene inn i en mer generalisert klasse.
For eksempel vil et skip, en asteroide, en flygende tallerken og en kule alle dele samme oppførsel for å bevege seg over skjermen. Du kan abstrahere denne oppførelsen til en abstrakt klasse som har de vanlige egenskapene som trengs for å flytte et objekt. Disse egenskapene vil være stater som stilling og hastighet, og oppførselen til flytting.
Den abstraherte klassen i Java kan se ut som følgende:
/ ** * Abstrakt klasse for å flytte * / abstrakt klasse Bevegelig offentlig float velocityX; offentlig flytehastighet; offentlig flyteposisjonX; offentlig flyteposisjon; / ** * Funksjon - utfører oppførselen (oppgave) for å flytte skipet * / offentlig tomromflytting () posisjonX + = hastighetX; posisjonY + = hastighetY;
Det er andre vanlige stater, atferd og funksjonalitet som alle objektene deler. Kan du tenke på dem? Disse kan alle legges til i en abstrakt klasse.
En ting du vil passe på er å skape en blob-klasse. En klasseklasse er en klasse som prøver å håndtere alt fra en gruppe objekter, selv når hvert objekt ikke deler de samme tilstandene, atferdene og funksjonaliteten. Bare fordi et skip og en flygende tallerken kan skyte, betyr ikke at du bør sette den oppførelsen i samme abstrakte klasse som brukes til å beskrive alle fire gjenstandene.
Ta en titt på Iain Lobbs opplæring om enhetssammensetning for å se hvordan han unngår denne situasjonen.
Som sagt mange ganger før, har Tetris bare ett objekt, en Tetrimino. Dette hindrer imidlertid ikke Tetris fra å trekke ut noen av funksjonaliteten. En Tetrimino er tegnet på nesten samme måte som lekeplassen og de andre spillbildene. Dette betyr at du kan abstrahere denne tegningsadferd i en enkelt klasse som alle ting som er trukket på skjermen, tilhører.
(Personlig liker jeg å ringe en slik klasse teikne
, men Sprite
er også et vanlig navn.)
Pac-Man er litt mer interessant når det gjelder abstraksjon. Pac-Man, et spøkelse og en pac-punkt deler egentlig ikke noen vanlige stater, oppførsel eller funksjonalitet. De kan tegnes på skjermen på samme måte, så en abstrakt klasse for håndteringstegning kan opprettes, men ikke mye mer enn det. Så hva gjør du? I dette tilfellet er det helt fint å lage flere abstrakte klasser for å organisere koden.
Start med klassen for å håndtere tegning for alle tre objektene. Deretter tar du tak i pac-punktet fra gruppen, siden det er objektet som egentlig ikke hører til de andre. Det etterlater Pac-Man og et spøkelse. Nå tenk på hva disse to objektene har til felles, og opprett en annen abstrakt klasse for disse objektene. Denne klassen kan inneholde stater som retning og hastighet, og oppførselen til flytting.
Med to abstrakte klasser reduserer du den overflødige koden som ville ha vært nødvendig for å lage de tre objektene, og flytte den til et sted som lett kan endres og endres.
Prinsippet om abstraksjon bidrar til å redusere overflødig kode og opprette mer vedlikeholdsbar kode. Imidlertid gjør abstraksjon i seg selv ingenting hvis vi ikke faktisk gjør noe med de abstraherte klassene. For dette må vi lære om arv som vil bli diskutert i neste og siste artikkel i denne serien.
Følg oss på Twitter, Facebook eller Google+ for å holde deg oppdatert med de siste innleggene.