Games zijn per definitie interactief. Gosu maakt deze interactie eenvoudig met een eenvoudige interface voor het detecteren en reageren op het indrukken van toetsen en muisknoppen.
Er zijn twee manieren om invoer in uw programma af te handelen. De eerste is een evenementgerichte aanpak. Wanneer knoppen worden ingedrukt, ontvangen uw programma's een gebeurtenis en kunt u daarop reageren. De tweede is om te controleren of er op het moment van een update op een bepaalde knop wordt gedrukt. Beide technieken zijn perfect geldig, gebruik welke het beste bij u past.
Achter de schermen worden knoppen weergegeven door gehele getallen. Deze integercodes zijn platformafhankelijk en zouden waarschijnlijk niet hun weg naar uw spelcode moeten vinden. Om dit weg te abstraheren, biedt Gosu een aantal constanten om te gebruiken.
Voor elke klaviertoets is er een Gosu:: Kb * constante. Voor de meeste sleutels zijn de namen van deze constanten gemakkelijk te raden. De pijltoetsen zijn bijvoorbeeld Gosu:: KbLeft
, Gosu:: KbRight, Gosu:: KbUp en Gosu:: KbDown. Voor een volledige lijst, zie de documentatie voor de Gosu-module.Inputgebeurtenissen worden geleverd aan de Gosu:: Window voorbeeld. In de hoofdlus, daarvoor bijwerken wordt genoemd, levert Gosu events voor alle knoppen die zijn ingedrukt of losgelaten. Het doet dit door de te bellen button_down en dichtknopen methoden, waarbij de id van de ingedrukte toets of toets wordt doorgegeven.
In de button_down en dichtknopen methoden vindt u vaak een geval uitspraak. Dit is, behalve dat het zeer functioneel is, een zeer elegante en expressieve manier om te beslissen wat te doen, afhankelijk van welke knop is ingedrukt of losgelaten. Het volgende is een kort voorbeeld van wat een button_down methode kan er uitzien. Het moet in je worden geplaatst Gosu:: Window subklasse, en zal het venster sluiten (het programma beëindigen) wanneer de ontsnappen toets wordt ingedrukt.
Makkelijk toch? Laten we dit uitbreiden. Hier is een Speler klasse. Het kan naar links en rechts bewegen als de linker- en rechtertoets worden ingedrukt. Merk op dat deze klasse ook heeft button_down en dichtknopen methoden. Ze werken net als de methoden van a Gosu:: Window subklasse. Gosu weet er niets van af Speler hoewel, we bellen de Speler's methoden handmatig uit de Gosu:: Window's methoden. Een volledig, uitvoerbaar voorbeeld is te vinden hier.
Als op gebeurtenissen gebaseerde invoer niet jouw stijl is, kun je elke vraag opvragen Gosu:: Window om te zien of er op enig moment een knop of toets wordt ingedrukt. Je kunt het negeren button_down en dichtknopen callbacks volledig.
Om de Gosu:: Window Om te zien of een toets wordt ingedrukt, bel de button_down? methode met de id van de knop die u wilt controleren. Vergeet het vraagteken in deze oproep niet! Als je belt button_down (Gosu:: KbLeft), Je zal zijn rapportage een knop druk op de Gosu:: Window subklasse. Zelfs als er geen callback-methoden zijn gedefinieerd, is de bovenliggende klasse, Gosu:: Window zullen. Er zal geen fout zijn, het zal gewoon niet werken zoals je verwacht. Vergeet dat vraagteken niet!
Hier is de Speler klasse herschreven om te gebruiken button_down? in plaats van evenementen. Een volledig, uitvoerbaar voorbeeld is beschikbaar hier. Deze keer wordt de invoer gecontroleerd aan het begin van de bijwerken methode. Je zult ook merken dat dit voorbeeld korter is, maar naar mijn mening minder elegant.
De muisknoppen worden op dezelfde manier behandeld als toetsenbord- en gamepad-knoppen. U kunt ze allebei opvragen button_down? en evenementen met button_down en dichtknopen. De muisbeweging mag echter alleen worden opgevraagd, er zijn geen gebeurtenissen voor muisbeweging. Gosu:: Window's mouse_x en mouse_y methoden bieden de X- en Y-coördinaten van de muisaanwijzer.
Merk op dat de X- en Y-coördinaten relatief zijn ten opzichte van het spelvenster. Dus als de muis zich bijvoorbeeld in de linkerbovenhoek bevindt, bevindt deze zich in de buurt van de coördinaat (0,0). Ook als de muisaanwijzer is buiten van het spelvenster volledig, zal het nog steeds rapporteren waar de aanwijzer zich ten opzichte van het venster bevindt. Dus beide mouse_x en mouse_y kan kleiner zijn dan nul en meer dan de breedte of hoogte van het raam.
Het volgende programma geeft een nieuwe sprite weer waar u met de muis klikt. Merk op dat het zowel gebeurtenisgestuurde invoer (voor de klikken) als querygestuurde invoer (om de positie van de muis te krijgen) gebruikt. Er is een volledig, uitvoerbaar bestand beschikbaar hier.