◉ VR-kurser
▶ Spela webbversionen

14. Vapen, skott och träffkontroll

Målet

Förstå hur ett skott går från spelarens knapp till skada på ett monster, och varför en vägg måste testas före monstret. Läs makePistol(), fire() och damageMonster() i main.js.

Bygg pistolen av enkla former

Pistolen består av små BoxGeometry-delar i en THREE.Group. Ett osynligt Object3D markerar mynningen. Samma konstruktion används på desktop och VR, men grupperna har olika föräldrar: kameran respektive höger kontroll. Det gör att du kan fokusera på skjutlogiken utan att först lära dig importera ett detaljerat vapen.

Ammunition är spelstatus

RULES.magazineSize är 8. state.ammo är återstående skott i det insatta magasinet, state.hasMagazine talar om ifall ett sitter i och state.magazines räknar reservmagasin. fire() stoppar skott när rundan inte pågår, vapnet är tomt eller senaste skottet kom för nyss. Vid ett giltigt skott minskar ammunitionen med ett och HUD uppdateras.

På desktop kastar G ut magasinet och R laddar från reserverna. I VR trycks höger spak ned för utkastning; ett reservmagasin hämtas vid vänster höft med grip och förs till pistolgreppet. Detta är spelinteraktion, inte en fullständig fysisk vapensimulering.

Siktlinje och skydd

Spelet använder en Raycaster från mynningen i skjutriktningen. Närmaste träff mot en vägg eller stängd dörr sätter längsta tillåtna avstånd. Sedan jämförs levande monsters centrum med denna sträcka. Om monstret ligger bakom väggen ska det inte ta skada. Träffområdet är en förenklad radie kring kroppen, inte en detaljrik hitbox för varje kroppsdel.

raycaster.set(shotOrigin, shotDirection);
raycaster.far = 30;
const wallDistance = raycaster.intersectObjects(walls, false)[0]?.distance ?? 30;

?. betyder att koden klarar att inget objekt träffas. ?? 30 använder 30 meter som reserv. Den korta synliga strålen är en träffeffekt; den bestämmer inte skadan.

Testa och ändra

  1. Skjut åtta gånger. Försök skjuta en nionde gång och kontrollera att ammunitionen inte blir negativ.
  2. Skjut på ett monster genom en vägg och sedan utan vägg. Bara det fria skottet ska skada.
  3. Testa G följt av R med och utan reservmagasin.
  4. Ändra i din kopia träffradien för spindeln något och se hur lätt den är att träffa. Återställ efter testet.

Klart när: du kan följa kedjan knapp → ammo → siktlinje → träff → monsterhälsa och peka ut var en vägg avbryter skottet.