Gå til innhold

Holde styr på kuler i 2D-spill


Anbefalte innlegg

Heisann.

 

Jeg holder på med å programmere en simpel 2D-shooter ved hjelp av d3d, kulene avfyres kun i y-retning, x-posisjon er bestemt av avfyringsposisjonen til spilleren. Uansett, min klassestruktur er som følger;

 

classdesignpongha6.th.jpg

 

Syklusen er; GameLoop -> GameInput -> GameLogic -> GameRender -> Window::MessageQ() -> GameLoop

 

GameInput inneholder en struct som setter game-events til true eller false, f.eks. ved DIK_LEFT så er moveLeft true. Det samme gjør jeg for utskytning av kuler.

 

GameLogic skal i hovedsak holde orden på hvilke posisjoner de forskjellige objektene i spillet har (motstander, spiller, kuler osv.)

 

GameRender rendrer spriteobjektene på de nye posisjonene spesifisert i GameLogic.

 

///////////////////////////////////////////////////////////////////////////////////////

 

Mitt problem er som følger.

Jeg prøver finne en grei måte å holde styr på avfyrte kuler, kollisjon og out-of-bounds sjekking. Jeg tenkte at jeg eventuelt kunne lage en ny struct med x-pos,y-pos og en Alive boolean variabel. Alive er true når kulen er avfyrt, og false når den er out-of-bounds eller har kræsjet med et objekt.

På denne måten tenker jeg at jeg kan opprette nye kuler, samt holde styr på alle som skal renderes (en enkel for-loop for å se om alive == true).

 

Dette virker dog som en teit løsning, og jeg er sikker på at det er noen kloke hoder her som har andre forslag.

 

All hjelp og kommentarer taes i mot med stor takk.

Endret av jabberjab
Lenke til kommentar
Videoannonse
Annonse

Tja, en struct som holder informasjonen (strengt tatt bare posisjonen) og så holder du styr på dem i en array/liste, er ganske standard for partikkelsystemer (som dette jo i en viss forstand er)...

 

Det er en veldig grei løsning siden du bare rendrer hele listen hver gang, og når du oppdaterer posisjonen fjerner de som ikke lenger er aktive.

 

For mer info om partikkelsystemer vil jeg anbefale deg å starte med artikkelen "The Ocean Spray in Your Face" av Jeff Lander som ble publisert i Game Developer Mag 07/98. (Ja den er gammel, men den en er fortsatt veldig viktig)

Lenke til kommentar
  • 2 uker senere...

spillobjekter skal vel (de aller fleste hvert fall) kollisjonssjekkes på.

 

for eks. skip vs alle kuler.

 

Det kan lønne seg med en oppdeling av rommet i flere soner, slik at skipet kun sjekker kulene

som er i samme sone.

 

vanlige sone inndelinger er grid (lettest) og quadtree (litt mer komplisert).

Grid går ut på at du deler skjermen inn i et grid, og kun sjekker det griddet det ene kollisjonsobjektet er i (for eks. skip vs kule, så sjekker du kun i skipet sitt grid).

 

quadtree går ut på at hm. nei, orker ikke forklare, men

http://en.wikipedia.org/wiki/Quadtree

 

Jeg vil anbefale å gå for grid-løsning.

Lenke til kommentar

Et tips for alive boolean variabelen din kan være å bruke enum/int i stedet for å lagre for eksempel tilstanden til kula. Da kan den for eksempel være OUT_OF_BOUNDS, HIT_OBJECT etc. Det gjør det enklere for deg å endre/utvide hvis du vil gjøre endringer senere.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...