Sensoren#
Actors verfügen über Sensoren, mit denen sie ihre Umgebung scannen können – zum Beispiel um andere Actors an ihrer Position zu erkennen.
Es gibt zwei Möglichkeiten, Sensoren zu verwenden:
Du kannst aktiv andere Objekte erkennen.
Du kannst Events registrieren, die durch Sensorerkennung ausgelöst werden.
Aktives Erkennen von Objekten#
Du kannst Objekte aktiv erkennen, indem du direkt die Sensoren eines Actors nutzt. Hier ist ein Beispiel, wie das funktioniert:
import miniworlds
world = miniworlds.World(200, 100)
r = miniworlds.Rectangle((10, 10), 50, 100)
c = miniworlds.Circle((200, 50), 20)
@c.register
def act(self):
self.move_left()
@r.register
def act(self):
actor = self.detect() # Sensor detects objects at current position
if actor:
self.color = (255, 0, 0) # Change color if an object is detected
world.run()
Ausgabe#
Erklärung#
In der
act()
-Methode des Rechtecks prüft der Sensorself.detect()
, ob sich ein anderer Actor an derselben Position befindet.Wenn ein anderer Actor erkannt wird, ändert das Rechteck seine Farbe.
Die Variable
actor
enthält das erkannte Objekt oderNone
, wenn nichts gefunden wurde.Die Zeile
if actor
ist eine Kurzform fürif actor != None
.
Erkennungs-Events registrieren#
Im obigen Beispiel prüfen Actors aktiv auf Kollisionen. Alternativ kannst du eine Methode registrieren, die automatisch ausgelöst wird, wenn ein Sensor etwas erkennt:
from miniworlds import World, Rectangle, Circle
world = World(200, 100)
r = Rectangle((10, 10), 50, 100)
c = Circle((200, 50), 20)
@c.register
def act(self):
self.move_left()
@r.register
def on_detecting(self, other):
self.color = (255, 0, 0) # Change color when another object is detected
world.run()
Erklärung:#
Die Methode
on_detecting(self, other)
wird automatisch aufgerufen, wenn ein Objekt erkannt wird.Der Parameter
other
bezieht sich auf das erkannte Objekt, sodass du herausfinden kannst, was erkannt wurde.
Bestimmte Objekte erkennen#
Mit Sensoren und if-else-Abfragen kannst du unterscheiden, welches Objekt erkannt wurde:
import miniworlds
world = miniworlds.World(200, 100)
r = miniworlds.Rectangle((10, 10), 50, 100)
c1 = miniworlds.Circle((200, 50), 20)
c2 = miniworlds.Circle((120, 50), 20)
@c1.register
def act(self):
self.move_left()
@c2.register
def act(self):
self.move_left()
@r.register
def on_detecting(self, other):
if other == c1:
self.color = (255, 0, 0) # Turn red when detecting c1
elif other == c2:
self.color = (0, 255, 0) # Turn green when detecting c2
world.run()
Ausgabe#
Erklärung#
In der Methode on_detecting
prüft der Actor, ob er c1
oder c2
erkannt hat und ändert entsprechend seine Farbe.
Bemerkung
Hinweis: Globale Variablen — Normalerweise sind Variablen nur innerhalb einer Methode verfügbar. Der Zugriff auf globale Variablen (wie in diesem Beispiel) ist zwar einfach, kann aber unerwünschte Nebeneffekte verursachen. Wie du das vermeidest, lernst du im Tutorial classes_first.
Beispiel: Actors das Durchqueren von Wänden verhindern#
Sensoren können auch genutzt werden, um zu verhindern, dass Actors durch Wände gehen. Hier ist ein Beispiel:
import miniworlds
world = miniworlds.TiledWorld()
world.columns = 8
world.rows = 2
world.speed = 30
player = miniworlds.Actor()
player.add_costume("images/player_1.png")
wall = miniworlds.Actor((4, 0))
wall.add_costume("images/wall.png")
@player.register
def act(self):
if player.position != (0, 4):
player.direction = "right"
player.move()
@player.register
def on_detecting(self, other):
if other == wall:
self.move_back() # Move back when wall is detected
world.run()
FAQ#
Meine Kollisionserkennung funktioniert nicht — was kann ich tun?
Teste zuerst, ob deine Methode überhaupt aufgerufen wird. Füge dazu eine print
-Anweisung wie diese ein:
@player.register
def on_detecting(self, actor):
print(actor)
Wenn nichts ausgegeben wird, funktioniert der Sensor nicht wie erwartet.