Maus-Events II (mit GGMouseTouchListener)


Im Unterschied zum Callback mouseEvent() des GGMouseListeners, der die Pixelkoordinaten des Mausklicks erhält, besitzt die Methode mouseTouched() des GGMouseTouchListeners mehrere Parameter:
actor: den Actor auf den man klickt
mouse: ein Objekt von GGMouse
spot: einen Punkt mit den relativen Koordinaten des Mausklicks in Bezug auf das Spritebild

Der GGMouseTouchListener wird mit addMouseTouchListener() registriert. Dabei werden die Events angegeben, an denen man interessiert ist. In unseren Beispielen lPress und lRelease.

Beispiel 1: Mit Mausklick können die Zündhölzer entfernt werden, wobei der Klick an einer beliebigen Stelle des Zündholzes erfolgen kann. Nicht die Gitterzellen, sondern die Sprite-Bilder legen das für den Mausklick aktive Gebiet fest.

 

# Gg8d.py

from gamegrid import *
from java.awt import Point

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()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

match.addMouseTouchListener(MyMouseTouchListener(), GGMouse.lPress): Der TouchListener wird bei jedem Zündholz registriert
mouseTouched(): Callbackmethode des GGMouseTouchlisteners
actor.removeSelf(): Der geklickte Actor wird entfernt

 

 

Beispiel 2: Manchmal ist es nötig, die Objekte kontinuierlich zu bewegen und schlussendlich in den Gitterzellen exakt zu positionieren. In Beispiel 2 können die zu Beginn zufällig verteilten Kugeln mit der Maus verschoben und exakt in einer Reihe angeordnet werden.

Beim Ziehen mit gedrückter Maustaste wird mit setPixelLocation(mousePos) der Ball pixelweise mit dem Mauszeiger verschoben, unabhängig von Zellen.

Beim Loslassen der Maustaste wird der Ball wieder in die Gitterstruktur eingebunden, und zwar in der Mitte der Zelle, in der er sich gerade befindet.

 

 

 



# Gg8e.py

from gamegrid import *

class MyMouseTouchListener(GGMouseTouchListener):
    
    def mouseTouched(self, actor, mouse, spot):
        event = mouse.getEvent()
        if event == GGMouse.lPress:
            self.draggedBall = actor
        elif event == GGMouse.lRelease:
            if self.draggedBall != None:
                self.draggedBall.setLocationOffset(Point(0, 0))
        elif event == GGMouse.lDrag:
            if self.draggedBall != None:
                mousePos = Point(mouse.getX(), mouse.getY())
                self.draggedBall.setPixelLocation(mousePos)
        refresh()


makeGameGrid(8, 5, 80, Color.blue, False)
setTitle("Sort Balls")
for i in range(8):
    ball = Actor("sprites/token_1.png")
    addActor(ball, getRandomEmptyLocation())
    ball.addMouseTouchListener(MyMouseTouchListener(),  GGMouse.lPress | 
                                        GGMouse.lRelease | GGMouse.lDrag, True)
show()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

ball.addMouseTouchListener(): Der GGMouseTouchListener wird bei jedem Ball registriert. Dabei werden die Events lPress, lRelease und lDrag aktiviert. Der letzte Parameter True legt fest, ob nur der oberste Actor zu einem Touchevent führt, wenn mehrere Actors aufeinander liegen
self. draggedBall = actor: Beim lPress-Event wird der geklickte Actor in der Instanzvariablen draggedBall gespeichert, damit er beim Drag- und Release-Event verwendet werden kann
draggedBall.setPixelLocation(mousePos): setzt den Actor an die Mausposition unabhängig vom Gitter
draggedBall.setLocationOffset(Point(0, 0)): Beim Loslassen der Maustaste wird der Ball in der Mitte der Zelle positioniert
refresh(): da der Simulationszyklus nicht mit doRun in Gang gesetzt wird, muss das Fenster manuell gerendert werden