HomeTurtlegrafikGPanelRobotikGameGrid WebTigerPython
 Python - Online
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 = toLocation(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: Objekte kontinuierlich bewegen
m Beispiel 2 bewegt sich die Spielfigur beim Ziehen mit gedrückter Maustaste sprungartig von Zelle zur Zelle. Manchmal ist es eleganter, die Objekte kontinuierlich zu ziehen und beim Loslassen der Maustaste exakt in einer Gitterzelle zu positionieren. 7 Kugeln werden zu Beginn zufällig im Spielfenster verteilt. Mit der Maus sollen sie in die 7 Felder, die in der Diagonale liegen, verschoben werden.

Du verwendest drei Callbacks pressCallback() , dragCallback() und releaseCallback(). Im presCallback() wird die Position des Mausklicks und die Kugel, die sich auf dieser Position befindet, erfasst. Die Methode setLocationOffset() im dragCallback() bewirkt die kontinuierliche Bewegung während des Ziehens mit gedrückter Maustaste. Im releaseCallback() wird die Kugel beim Loslassen der Maustaste in der Mitte der Zelle positioniert.
Damit die Variablen actor und startLoc in mehreren Callbacks verwendbar sind, musst du sie als global deklarieren
 

Programm:

#Gg8b.py
from gamegrid import *

def pressCallback(e):
    global actor, startLoc
    startLoc = toLocationInGrid(e.getX(), e.getY())
    actor = getOneActorAt(startLoc)
 
def dragCallback(e):
    if actor == None:
        return
    startPoint = toPoint(startLoc)
    actor.setLocationOffset(e.getX() - startPoint.x, e.getY() - startPoint.y) 

def releaseCallback(e):
    if actor == None:
        return
    destLoc = toLocationInGrid(e.getX(), e.getY())
    actor.setLocationOffset(0, 0)
    actor.setLocation(destLoc)    

makeGameGrid(7, 7, 70, Color.red, False,  mousePressed = pressCallback, 
             mouseDragged = dragCallback, mouseReleased = releaseCallback)
setTitle("Sort Balls")
for i in range(7):
    ball = Actor("sprites/marble.png")
    addActor(ball, getRandomEmptyLocation())
actor = None
startLoc = None    
show()
doRun()
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

In den Callback-Funktionen definierst du, was geschehen soll, wenn der Benutzer die Maustaste drückt, die Maus mit der gedrückten Maustaste verschiebt oder die Maustaste loslässt. 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.