4.4 Een SNES-controller gebruiken
Naast het toetsenbord en de muis kun je ook een SNES-controller gebruiken om je spel te besturen. Dit maakt je spel extra leuk om te spelen!
Hiervoor heb je een SNES-controller nodig die via USB op je computer is aangesloten. Deze zijn online te koop voor een paar euro. Kijk ook in de Cheatsheet voor een snel overzicht van alle controller-gebeurtenissen.
Checken of je controller werkt
Sluit je controller aan en voer dit uit:
import play
for controller in play.controllers.get_all_controllers():
print(controller.get_instance_id(), controller.get_name())
In je console zie je voor elke verbonden controller een nummer en een naam, bijvoorbeeld:
0 usb gamepad
De 0 is de index van je controller. Dit nummer heb je nodig bij de gebeurtenissen hieronder.
Er gaat iets mis?
Zie je niets in de console? Dan herkent je computer de controller niet. Probeer:
- De USB-kabel los te trekken en opnieuw aan te sluiten
- Een andere USB-poort te gebruiken
Reageren op een knop
Met @play.controllers.when_button_pressed reageer je op het indrukken van een knop:
import play
tekst = play.new_text(words="Druk op een knop!", font_size=40)
@play.controllers.when_button_pressed(0, 0)
def knop_ingedrukt():
tekst.words = "Knop 0 ingedrukt!"
De twee getallen zijn:
0— de index van de controller0— het nummer van de knop
Maar welk nummer hoort bij welke knop? Dat kun je uitvinden!
Knoppen ontdekken
Met @play.controllers.when_any_button_pressed kun je ontdekken welk nummer bij welke knop hoort:
import play
tekst = play.new_text(words="Druk op een knop", font_size=40)
@play.controllers.when_any_button_pressed(0)
def een_knop_ingedrukt(button):
tekst.words = "Knop: " + str(button)
Druk op verschillende knoppen en kijk welk nummer er verschijnt!
Zolang een knop ingedrukt is
Met @play.controllers.when_button_pressed vuurt de functie maar één keer bij het indrukken. Maar soms wil je dat iets continu gebeurt zolang je een knop inhoudt. Hiervoor gebruik je @play.controllers.while_button_pressed:
import play
cirkel = play.new_circle(color='blue', radius=20)
@play.controllers.while_button_pressed(0, 0)
def knop_ingehouden(button):
cirkel.x = cirkel.x + 3
Het verschil? Met when_button_pressed gebeurt de actie één keer. Met while_button_pressed gebeurt de actie elk frame zolang je de knop inhoudt.
Er is ook @play.controllers.while_any_button_pressed om te reageren op een willekeurige knop:
import play
tekst = play.new_text(words="Houd een knop ingedrukt")
@play.controllers.while_any_button_pressed(0)
def knop_ingehouden(button):
tekst.words = f"Knop {button} wordt ingehouden!"
Pijltjes gebruiken
De pijltjes op de controller werken anders dan knoppen. Hiervoor gebruik je when_axis_moved:
import play
tekst = play.new_text(words="Gebruik de pijltjes", font_size=40)
@play.controllers.when_axis_moved(0, 0)
def links_rechts(axis, value):
if value == 1:
tekst.words = "rechts"
if value == -1:
tekst.words = "links"
@play.controllers.when_axis_moved(0, 1)
def boven_beneden(axis, value):
if value == 1:
tekst.words = "beneden"
if value == -1:
tekst.words = "boven"
De richting (het tweede getal) bepaalt welke as je uitleest:
0= links/rechts1= boven/beneden
De value die je terugkrijgt:
1= rechts of beneden-1= links of boven0= losgelaten
Opdracht 4.4.a: Controller-besturing
Maak een programma waarbij je een cirkel kunt besturen met de pijltjes van je SNES-controller.
Klik hier voor een tip!
Gebruik when_axis_moved om de x en y van de cirkel aan te passen.
Klik hier voor de oplossing!
import play
cirkel = play.new_circle(color='blue', radius=20)
@play.controllers.when_axis_moved(0, 0)
def links_rechts(axis, value):
cirkel.x = cirkel.x + value * 20
@play.controllers.when_axis_moved(0, 1)
def boven_beneden(axis, value):
cirkel.y = cirkel.y - value * 20