mausevents

8. MAUSEVENTS

 

 

DU LERNST HIER...

 

wie du mit Maus-Events mausgesteuerte Aktionen auslösen kannst. Diese sind in interaktiven Spielen von grosser Bedeutung. In sogenannten Callbackfunktionen (oder kurz Callbacks) definierst du, was geschehen soll, wenn eine Maustaste gedrückt, losgelassen oder die Maus verschoben wird. Die Callbacks werden nicht durch das eigene Programm aufgerufen, sondern automatisch vom System, wenn die Maustaste betätigt wird.

 

 

MUSTERBEISPIELE

 

 

Beispiel 1: Beim Drücken der Maustaste wird ein neuer Fisch erzeugt
 

Die Callbackfunktion pressCallback() wird als globale Funktion definiert. Beim Drücken der Maustaste werden mit e.getX() und e.getY() die Koordinaten des Mausklicks erfasst und an dieser Position ein Objekt der Klasse Fish erzeugt.

Die Registrierung des Callbacks erfolgt als Parameter bei der Erzeugung des Spielfensters.

Dies ist ein schönes Beispiel für die objektorientierte Programmierung, denn jeder neue Fisch ist eine Instanz der Klasse Fish und "weiss", wie er sich bewegen soll.

 

Programm:

# Gg8.py
from gamegrid import *

# ---------------- class Fish ----------------
class Fish(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/nemo.gif");
     
    def act(self):
        self.move()
        if not self.isMoveValid():
            self.turn(180)
            self.setHorzMirror(not self.isHorzMirror())
            
# ---------------- main ----------------------
def pressCallback(e):
    location = toLocationInGrid(e.getX(), e.getY())
    addActor(Fish(), location)

makeGameGrid(10, 10, 60, Color.red, "sprites/reef.gif", False, 
     mousePressed = pressCallback)
show()
doRun()
► In Zwischenablage kopieren

Beispiel 2: Kugeln mit gedrückten Maustaste verschieben

Ordne die Kugeln in eine Reihe. Beim Ziehen mit gedrückter Maustaste bewegen sich die Spielfiguren sprunghaft von Zelle zu Zelle. Du verwendest zwei Callbacks pressCallback() und dragCallback().
Mit der Funktion pressCallback() wird die Position des Mausklicks erfasst und der Actor, der sich in dieser Zelle befindet, in der Variablen actor gespeichert.
Mit dragCallback() wird der Actor bei gedrückter Maustaste bewegt.

 

Da die Variable actor in beiden Funktionen verwendet wird, muss sie als global deklariert werden. Die beiden Callback-Funktionen werden beim Erzeugen des Spielfensters registriert.

Programm:

# Gg8a.py
from gamegrid import *

def pressCallback(e):
    global actor 
    location = toLocationInGrid(e.getX(), e.getY())    
    actor = getOneActorAt(location)
 
def dragCallback(e):
    if actor == None:
        return
    location = toLocationInGrid(e.getX(), e.getY())
    actor.setLocation(location) 


makeGameGrid(8, 5, 80, Color.blue, False,  mousePressed = pressCallback, 
             mouseDragged = dragCallback)
setTitle("Sort Balls")
for i in range(8):
    ball = Actor("sprites/token_1.png")
    addActor(ball, getRandomEmptyLocation())
show()
doRun()
► In Zwischenablage kopieren

Beispiel 3: Zündhölzer mit Mausklick wegnehmen
15 Zündhölzer sind im Gitter angeordnet. Mit Mausklick kannst du einzelne Zündhölzer wegnehmen. Um die hohen Zündhölzersprites im quadratischen Gitter zu positionieren, verwendest du jeweils eine horizontale und 7 vertikalen Zellen und berechnest ihre Position. In der Callbackfunktion pressCallback() lässt du den Actor, der sich in der Zelle des Mausklicks befindet, mit actor.removeSelf() verschwinden.

Da sich jetzt das Bild match.gif über 7 vertikalen Zellen erstreckt, musst du bei jedem Mausklick alle 7 Zellen überprüfen.
 

Programm:

#Gg8b.py
from gamegrid import *

class Match(Actor):
    def __init__(self):
        Actor.__init__(self, "sprites/match.gif");

def pressCallback(e):
    loc = toLocationInGrid(e.getX(), e.getY())
    for y in range(2, 8): 
        actor = getOneActorAt(Location(loc.x, y))
        if actor != None:
            actor.removeSelf()
            
makeGameGrid(48,9,12,False,mousePressed = pressCallback)
nbMatches = 15
for i in range(nbMatches):    
    addActor(Match(), Location (2 + 3*i, 4))
show()
doRun()
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

In den Callback-Funktionen definierst du, was geschehen soll, wenn der Benutzer die Maustaste drückt, bzw. die Maus mit der gedrückten Maustaste verschiebt. Diese Funktionen werden beim Erzeugen des Spielfensters registriert und nicht vom Programm, sondern direkt vom System aufgerufen.

 

 

ZUM SELBST LÖSEN

 

1.

Im Spielfenster mit einem blauen Hintergrund werden 20 Ballons an zufällig gewählten Positionen erzeugt (balloon.gif). Mit einem Mausklick können sie vernichtet werden.  
 

2.
Wie in der ersten Aufgabe werden 20 Ballons an zufällig gewählten Positionen erzeugt. Definiere eine Callbackfunktion pressCallback(e), mit der du einen Ballon mit der Maus wählen kannst und eine Callbackfunktion dragCallback(e), mit der du den gewählten Ballon verschieben kannst. Verschiebe dann alle Ballons so, dass sie in den obersten zwei Zeilen angeordnet sind.  
 

 

3.

Erzeuge ein Spielfenster mit 20 horizontalen und 20 vertikalen Zelle der Grösse 30, mit dem Hintergrundbild "sprites/town.jpg". Per Mausklick werden an der Mausposition Ballons erzeugt. Diese sollen sich nach unten bewegen.

(Du definierst in der Klasse Balloon eine Funktion act(self), in der die Bewegungsrichtung mit self.setDirection(90) festgelegt wird.