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:

  1. Du kannst aktiv andere Objekte erkennen.

  2. 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 Sensor self.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 oder None, wenn nichts gefunden wurde.

  • Die Zeile if actor ist eine Kurzform für if 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.