Spill er per definisjon interaktive. Gosu gjør dette samspillet enkelt med et enkelt grensesnitt for å oppdage og reagere på trykk og museknapp.
Det er to primære måter å håndtere input i programmet ditt. Den første er en begivenhetsorientert tilnærming. Når du trykker på knapper, mottar programmene dine en hendelse, og du kan reagere deretter. Det andre er å sjekke om det trykkes på en bestemt knapp på tidspunktet for en oppdatering. Begge teknikkene er perfekt gyldige, bruk den som passer deg best.
Bak kulissene er knapper representert med heltall. Disse heltallskodene er plattformavhengige og burde sannsynligvis ikke finne veien til spillkoden din. For å abstrahere dette bort gir Gosu en rekke konstanter å bruke.
For hver tastaturtast er det en Gosu:: Kb * konstant. For de fleste av nøklene blir navnene på disse konstantene lett gjettet. For eksempel er piltastene Gosu:: KbLeft, Gosu:: KbRight, Gosu:: KbUp og Gosu:: KbDown. For en fullstendig liste, se dokumentasjon for Gosu-modulen.
Inngangshendelser blir levert til
Gosu:: Vindu forekomst. I hovedsløyfen, før Oppdater blir kalt, vil Gosu levere hendelser for alle knapper som enten er blitt trykket eller utgitt. Det gjør dette ved å ringe til knapp ned og knepp opp metoder, passerer IDen til tasten eller knappen som er trykket.I knapp ned og knepp opp metoder, finner du ofte a sak uttalelse. Dette, foruten å være veldig funksjon, gir en veldig elegant og uttrykksfull måte å bestemme hva du skal gjøre avhengig av hvilken knapp som ble trykket på eller gitt ut. Følgende er et kort eksempel på hva a knapp ned metoden kan se ut. Den skal plasseres i din Gosu:: Vindu underklasse, og lukker vinduet (avslutter programmet) når flukt tasten trykkes.
Lett, ikke sant? La oss utvide dette. Her er en Spiller klasse. Den kan bevege seg venstre og høyre hvis du trykker på venstre og høyre tast. Merk at denne klassen også har knapp ned og knepp opp metoder. De fungerer akkurat som metodene fra a Gosu:: Vindu underklasse. Gosu vet ikke noe om Spiller men vi ringer til Spillermetoder manuelt fra Gosu:: Vindumetoder. Et fullstendig, kjørbart eksempel kan bli funnet her.
Hvis hendelsesbasert input ikke er din stil, kan du spørre om hvilket som helst Gosu:: Vindu for å se om det trykkes på noen knapp eller tast når som helst. Du kan ignorere knapp ned og knepp opp tilbakeringinger helt.
For å spørre Gosu:: Vindu for å se om det trykkes på en tast, ring til knapp ned? metoden med IDen til knappen du vil sjekke. Ikke glem spørsmålstegnet i denne samtalen! Hvis du ringer button_down (Gosu:: KbLeft), Du vil bli rapportering et knappetrykk til Gosu:: Vindu underklasse. Selv om du ikke har definert noen tilbakeringingsmetoder, er foreldreklassen, Gosu:: Vindu vil. Det vil ikke være noen feil, det fungerer bare ikke som du forventer. Bare glem ikke det spørsmålstegnet!
Her er Spiller klasse skrevet om å bruke knapp ned? i stedet for hendelser. Et fullstendig, kjørbart eksempel er tilgjengelig her. Denne gangen blir det kontrollert innspill i begynnelsen av Oppdater metode. Du vil også legge merke til at dette eksemplet er kortere, men etter min mening mindre elegant.
Museknappene håndteres på samme måte som tastatur og gamepad-knapper. Du kan begge spørre dem med knapp ned? og arrangementer med knapp ned og knepp opp. Imidlertid kan musebevegelse bare spørres, det er ingen hendelser for musebevegelse. Gosu:: Vindu's mouse_x og mouse_y metoder gir X- og Y-koordinatene til musepekeren.
Merk at X- og Y-koordinatene er i forhold til spillvinduet. Så hvis musen for eksempel er i øverste venstre hjørne, vil den være i nærheten av koordinaten (0,0). Hvis musepekeren er det utenfor av spillvinduet helt, vil det fortsatt rapportere hvor pekeren er i forhold til vinduet. Så begge deler mouse_x og mouse_y kan være mindre enn null og mer enn bredden eller høyden på vinduet.
Følgende program viser en ny sprite uansett hvor du klikker på musen. Legg merke til at den bruker både hendelsesdrevet inngang (for klikkene) og spørringsdrevet inngang (for å få museposisjonen). En fullstendig, kjørbar fil er tilgjengelig her.