mausevents2

9. MAUSEVENTS II

 

 

DU LERNST HIER...

 

wie du mit der Maus Die Actors nicht nur sprunghaft von Zelle zur Zelle, sondern kontinuierlich bewegen kannst. Im Unterschied zum pressCallback() im vorhergehenden Kapitel, der die Zelle des Mausklickst erfasst, erhältst du mit den Methoden des GGMouseListeners die Pixelkoordinaten des Mausklicks.

Die Methode mouseTouched() des GGMouseTouchListeners enthält mehrere Parameter:
actor: den Actor auf den du klickst
mouse: ein Objekt von GGMouse
spot: einen Punkt mit den relativen Koordinaten des Mausklicks in Bezug auf das Spritebild

Der GGMouseTouchListener wird mit addMouseTouchListener() beim Actor registriert.

 

 

MUSTERBEISPIELE

 

 

Beispiel 1: Zündhölzer wegnehmen
 

Die Zündhölzer sind nicht im Gitter angeordnet, sondern beliebig nah aneinander. Nicht die Gitterzellen, sondern die Sprite-Bilder legen das für den Mausklick aktive Gebiet fest. mit match.addMouseTouchListener(MouseTouched, GGMouse.lPress) wird der TouchListener wird bei jedem Zündholz registriert und reagiert auf das Drücken der linken Maustaste. In der Funktion mouseTouched() gibst du an, was beim Mausklick auf den Actor geschehen soll.

Programm:

# Gg9.py
from gamegrid import *

def mouseTouched(actor, mouse, spot):
    actor.removeSelf()
            
makeGameGrid(600, 120, 1, False)
nbMatches = 20
for i in range(nbMatches):
    match = Actor("sprites/match.gif")
    addActor(match, Location (12 + 30 * i, 60))
    match.addMouseTouchListener(mouseTouched, GGMouse.lPress)
show()
doRun()
► In Zwischenablage kopieren

Beispiel 2: Ein Auto mit der gedrückten Maustaste bewegen.

Das Auto wird mit der Maus bewegt. Dabei dreht sich sein Bild immer in die Bewegungsrichtung.

Du verwendest den MouseListener aus der Klasse GGMouseListener. Da Python mehrfache Vererbung erlaubt, kann Car von der Klasse Actor und auch von der Klasse GGMouseListener abgeleitet werden. Die Callbackmethode mouseEvent() wird in der Klasse Car definiert.

 

Damit sich das Auto immer in die Bewegungsrichtung dreht, wird laufend die Bewegungsrichtung aus der Differenz der alten und neuen Koordinaten berechnet. Dabei wartet man immer, bis der Abstand zwischen dem alten und neuen Punkt grösser als 5 Pixel ist.

Programm:

# Gg9a.py
from gamegrid import *
import math

# --------------------- class car --------------------------
class Car(Actor, GGMouseListener):
    def __init__(self):
        Actor.__init__(self, True, "sprites/redcar.gif") 
        self.oldLocation = Location()
    
    def mouseEvent(self, e):
        location = toLocationInGrid(e.getX(), e.getY())
        self.setLocation(location)
        dx = location.x - self.oldLocation.x;
        dy = location.y - self.oldLocation.y;
        if dx * dx + dy * dy < 25:
            return True
        phi = math.atan2(dy, dx)
        self.setDirection(math.degrees(phi))
        self.oldLocation = location
 
# --------------------- main ---------------------------------
makeGameGrid(600, 600, 1, False)
setTitle("Move car using mouse drag")
setSimulationPeriod(50)
setBgColor(Color.gray)
car = Car()
addActor(car, Location(50, 50))
addMouseListener(car, GGMouse.lDrag)
show()
doRun()
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Mit Hilfe vom GGMouseTouchListener erhältst du die Pixelkoordinaten des Mausklicks und kannst die Actors exakt mit Klick auf das Spritebild erfassen. Die Verschiebung der Actors mit der gedrückten Maustaste erfolgt kontinuierlich.

 

 

ZUM SELBST LÖSEN

 

1.

Die roten Kugeln sollen mit Mausklick entfernt werden.

Löse die Aufgabe mit pressCallback() wie im Beispiel 3 im vorhergehenden Kapitel.

 
 

2.
Auch diese 10 Aliens sollen per Mausklick beseitigt werden.  
Löse die Aufgabe mit Pixelkoordinaten mit Hilfe von GGMouseTouchListener.
Du verwendest dabei die Aliens:
       alien = Actor("sprites/alien.png")

und positionierst die Actors mit einer for-Schleife
for i in range(10):    
    addActor(alien, Location (30 + 60 * i, 60))
 

 



.