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:
You can track objects “actively”.
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 Sensorself.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 MethodeNone
zurück.The statement
if actor
is a shorthand forif 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.