zondag 16 december 2012

Over botsingen en samenvoegingen

Botsingen met botsingen.
Collision detection. Je ontkomt er niet aan, elk spel heeft het. Vorige week was het dan ook voor ons zover, de speler mocht ineens niet meer door muren heen lopen. Ik had de taak van collision detection op me genomen, niet omdat ik het zo leuk vond, maar omdat iemand het moest doen.

Zelfs met XNA's handige functies bleek dit ingewikkelder dan verwacht. De speler bleef vaak vast zitten in hoekjes, muren of soms zelfs in het niets. Het is niet zo zeer het vinden van een botsing wat lastig is, maar het uitvinden aan welke kant van de speler deze plaatsvindt. Vooral in het geval van hoeken is dit erg vervelend. En zelfs als je weet waar de collisie zich bevind is het nog best een karwei om ervoor te zorgen dat de speler niet de muur in kan bewegen, maar wel alle andere kanten op.

Na flink wat uren werk zonder gewenst resultaat dacht Sander dat hij mijn 'shit' wel even kon 'fixen'. Maar aan het eind van de middag was de code alleen maar complexer geworden, terwijl het resultaat hetzelfde was gebleven. Daarna heb ik de strijdbijl weer terug genomen, wat nog best een gedoe was aangezien Sander graag af maakt waar hij aan begint. Dat geldt natuurlijk ook voor mij, en na nog een dagje werk was het dan toch gelukt. Collision detection werkt.

Maar hoe?
We kijken eerst welke objecten zich rond de speler bevinden. Van deze objecten maken we een drie-bij-drie grid van booleans waar de speler het midden is en de waarde true betekend dat er een muur is en false dat er geen muur is. Deze 2D-array geven we aan een functie die de afstand en richting geeft tot de muur waar we mee botsen (dit doen we doormiddel van ray intersection met bounding boxes). Dan wordt de speler over de gegeven richting en afstand verplaatst zodat deze tegen de muur aan komt te staan. Vervolgens wordt ervoor gezorgd dat de speler zich niet verder de muur in kan verplaatsen, maar wel alle andere richtingen op. Dit werkt goed voor collisions met zijkanten van muren, maar in de hoeken gaat het fout. Daarom gebruiken we voor hoeken naast de raycollision ook nog eens de coordinaten en grootte van de boundingbox om te berekenen welke kanten de speler wel en niet op kan bewegen.

Botsingen in 3D.
Gisteren was het eindelijk zover, na vele uren was de 3D engine van Vince af. En het was tijd om alles (de 3D engine, dungeon generation, speler animatie, de game management library en collision) samen te voegen zodat we iets moois hebben om te laten zien woensdag. Dit heeft Vince een hele dag werk gekost aangezien ik in de game management library niet heel veel rekening (lees: geen rekening) had gehouden met de implementatie van 3D.

Maar alles werkt nu, we hebben nu een speler die door een random gegenereerde dungeon heen kan wandelen in 3D. David is momenteel bezig met de AI, dus binnenkort hebben we ook nog eens monsters die door de speler in de pan gehakt kunnen worden.

Het menu met de gegenereerde dungeon in de achtergrond.

Het spel zoals het er nu uit ziet.


Geen opmerkingen:

Een reactie posten