Ga naar hoofdinhoud

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!

info

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 controller
  • 0 — 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/rechts
  • 1 = boven/beneden

De value die je terugkrijgt:

  • 1 = rechts of beneden
  • -1 = links of boven
  • 0 = 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