8. Desktopstyrning steg för steg
Målet
Bygga och förstå styrningen på dator innan du försöker felsöka VR. Desktopläget är snabbare att testa och använder samma spelstatus och kollisionskod som Quest-läget. Läs bindInputs(), updateMovement() och movePlayer() i main.js.
Tangenter: nedtryckt eller enstaka tryck
Spelet lägger till tangentens event.code vid keydown och tar bort den vid keyup. keysDown är en Set, alltså en samling utan dubletter. Rörelse kontrolleras varje bildruta med keysDown.has('KeyW') och liknande. En interaktion som E utförs däremot en gång när tangenttrycket kommer.
document.addEventListener('keydown', (event) => keysDown.add(event.code));
document.addEventListener('keyup', (event) => keysDown.delete(event.code));
event.code beskriver den fysiska tangenten, medan event.key beskriver tecknet. Det gör KeyW användbart för rörelse även om användaren har ett annat tangentbordslayout. event.repeat hindrar att vissa engångshändelser upprepas okontrollerat.
Rörelse i spelarens riktning
WASD ger först en vektor i spelarens lokala plan. Den normaliseras när två tangenter hålls nere så att diagonal gång inte blir snabbare. Sedan vrids vektorn med riggens Y-rotation. Slutligen multipliceras den med hastighet och dt, och movePlayer() testar kollisioner.
På desktop sänker C eller Ctrl kameran från ungefär 1,65 till 1,0 meter och minskar hastigheten. Shift använder sprintfarten. Space ger ett kort hopp genom en vertikal hastighet som minskar av gravitation i uppdateringsloopen. Själva riggen står kvar på golvplanet; kamerans höjd visar hoppet.
Mus och pekarlås
När spelet startar begär det pointer lock. Då får musrörelserna sikta utan att pekaren lämnar spelrutan. mousemove ändrar riggens yaw (vänster/höger) och kamerans pitch (upp/ned). Pitch begränsas för att spelaren inte ska kunna vända kameran upp och ned. Tryck Escape för att lämna pekarlåset. Klicka i spelet igen för att återta det.
Gör själv
- Starta spelet på desktop. Testa W, A, S och D var för sig och diagonalt.
- Jämför normal gång, Shift-sprint och C-hukning. Kontrollera att en vägg stoppar alla tre.
- Ändra sprintfarten till ett orimligt högt värde i din kopia och se varför stora steg kan göra enkel kollision mindre pålitlig. Återställ värdet.
- Titta i
bindInputs()och skriv upp vilka kommandon som bara körs vid ett knapptryck:E,R,Goch hopp.
Klart när: du kan förklara varför rörelse hanteras varje bildruta men en magasinutkastning hanteras vid ett enstaka knapptryck.