Sensoren#

Actors verfügen über Sensoren, mit denen sie ihre Umwelt abtasten können und z.B. andere Actors an ihrer Position aufspüren können.

There are two ways to use sensors:

  1. You can track objects “actively”.

  2. You can register events triggered by sensors.

Objekte aufspüren#

You can track objects by directly using an actor’s sensors. Here’s an example of how it works:

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 erkennt Objekte an der aktuellen Position
    if actor:
        self.color = (255, 0, 0)  # Ändert die Farbe, wenn ein Objekt erkannt wird

world.run()

Ausgabe#

Erklärung#

  • In der act()-Methode des Rechtecks wird der Sensor self.detect() verwendet, um zu prüfen, ob sich an der aktuellen Position ein anderer Akteur befindet. Wenn das Rechteck ein Objekt erkennt, ändert es seine Farbe. Die Variable actor enthält den gefundenen Actor. Wenn kein Akteur gefunden wird, gibt die Methode None zurück.

  • The statement if actor is a shorthand for if actor != None. This way, you can check if a variable contains a value.

Events registrieren#

In dem obigen Beispiel wurde aktiv nach Akteuren gesucht. Alternativ kannst du ein Ereignis registrieren, das automatisch aufgerufen wird, wenn der Sensor etwas entdeckt:

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)  # Ändert die Farbe, wenn ein Objekt erkannt wird

world.run()

Erklärung:#

  • The registered method on_detecting(self, other) is called as soon as the actor detects another object at its position.

  • The parameter other represents the found object, allowing you to determine which actor was discovered.

Recognize different objects#

With sensors and if-else branches, you can determine which specific object was found:

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)  # Rotes Rechteck bei Erkennung von c1
    elif other == c2:
        self.color = (0, 255, 0)  # Grünes Rechteck bei Erkennung von c2

world.run()

Ausgabe#

Erklärung#

In der Methode on_detecting wird überprüft, ob das erkannte Objekt c1 oder c2 ist, und die Farbe des Rechtecks wird entsprechend angepasst.

Bemerkung

Note: Global Variables: Normally, variables are only known within a method. Accessing global variables, as in this example, is simple but can cause unwanted side effects. In the tutorial classes_first, you will learn how to avoid such accesses.

Example: Prevent collision with walls#

With sensors, you can also prevent objects from moving through walls. Here is an example:

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()  # Der Akteur bewegt sich zurück, wenn er eine Wand erkennt

world.run()

FAQ#

Meine Kollisionen werden nicht erkannt, was kann ich tun?

Testen Sie zuerst, ob die Methode überhaupt aufgerufen wird. Fügen Sie dazu eine print-Anweisung ein:

@player.register
def on_detecting(self, actor):
    print(actor)

Wenn die print-Anweisung nicht aufgerufen wird, funktioniert der Sensor nicht.