👾 Sprites & SpriteLists
Was ist ein Sprite?
Ein Sprite ist ein 2D-Bildobjekt mit Position, Größe, Rotation und weiteren Eigenschaften. In Arcade erbt der arcade.Sprite von arcade.BasicSprite und bietet viele nützliche Attribute.
▶ SPRITE ANATOMIE – Live Demo
Gelber Pfeil = velocity-Vektor. Rosa Box = hit_box. Blau = Sprite-Textur.
| Attribut | Typ | Beschreibung |
|---|---|---|
| center_x / center_y | float | Position des Mittelpunkts |
| change_x / change_y | float | Geschwindigkeit (Pixel/Update) |
| angle | float | Rotation in Grad |
| scale | float | Skalierungsfaktor |
| alpha | int (0-255) | Transparenz |
| texture | Texture | Aktuelle Textur |
| visible | bool | Sichtbarkeit |
| hit_box | HitBox | Kollisions-Bereich |
Sprite Property Editor – Ändere Eigenschaften live
Sprites erstellen
PYTHON
# Sprite aus Bilddatei laden
player = arcade.Sprite(
filename=":resources:images/animated_characters/female_person/femalePerson_idle.png",
scale=0.5
)
# Position setzen
player.center_x = 400
player.center_y = 300
# Geschwindigkeit setzen
player.change_x = 3 # 3 Pixel pro Frame nach rechts
player.change_y = 0
# In on_update: Sprite-Position aktualisieren
player.update()
PYTHON
# Sprite mit Vollfarbe (kein Bild nötig)
player = arcade.SpriteSolidColor(
width=50,
height=50,
color=arcade.color.BLUE
)
player.center_x = 400
player.center_y = 300
# Kreis-Sprite
coin = arcade.SpriteCircle(
radius=20,
color=arcade.color.YELLOW
)
coin.center_x = 200
coin.center_y = 200
PYTHON
class Player(arcade.Sprite):
"""Eigene Spieler-Sprite-Klasse."""
def __init__(self):
super().__init__(
":resources:images/animated_characters/female_person/femalePerson_idle.png",
scale=0.5
)
self.health = 100
self.speed = 5
self.score = 0
def update(self):
# Bewegung
self.center_x += self.change_x
self.center_y += self.change_y
# Bildschirmgrenzen
if self.left < 0:
self.left = 0
if self.right > 800:
self.right = 800
PYTHON – Built-in Assets
# Arcade hat viele eingebaute Assets!
# Prefix :resources: für eingebaute Assets
# Charaktere
":resources:images/animated_characters/female_person/femalePerson_idle.png"
":resources:images/animated_characters/male_person/malePerson_idle.png"
":resources:images/animated_characters/robot/robot_idle.png"
# Items & Tiles
":resources:images/items/coinGold.png"
":resources:images/tiles/grassMid.png"
":resources:images/tiles/boxCrate.png"
# Space Shooter
":resources:images/space_shooter/playerShip1_blue.png"
":resources:images/space_shooter/meteorGrey_big1.png"
SpriteLists
Eine SpriteList ist eine GPU-optimierte Liste für Sprites. Sie ermöglicht Batch-Drawing – alle Sprites in einem einzigen GPU-Aufruf.
PYTHON – SpriteList
def setup(self):
# SpriteLists erstellen
self.player_list = arcade.SpriteList()
self.coin_list = arcade.SpriteList()
self.wall_list = arcade.SpriteList(use_spatial_hash=True)
# Spieler hinzufügen
self.player = Player()
self.player_list.append(self.player)
# 10 Münzen zufällig platzieren
for _ in range(10):
coin = arcade.Sprite(":resources:images/items/coinGold.png", scale=0.5)
coin.center_x = random.randrange(100, 700)
coin.center_y = random.randrange(50, 550)
self.coin_list.append(coin)
def on_draw(self):
self.clear()
self.wall_list.draw() # Alle Wände in 1 Draw Call
self.coin_list.draw() # Alle Münzen in 1 Draw Call
self.player_list.draw() # Spieler zeichnen
def on_update(self, delta_time):
self.player_list.update() # Alle Sprites updaten
use_spatial_hash=True: Aktiviert räumliches Hashing für statische Sprites (Wände, Plattformen). Macht Kollisionsabfragen deutlich schneller. Nur bei sich nicht bewegenden Sprites verwenden!
Kollisionserkennung
▶ KOLLISION LIVE VIZ
PYTHON – Kollision
def on_update(self, delta_time):
self.player_list.update()
# Kollision: Spieler vs. Münzen
coins_hit = arcade.check_for_collision_with_list(
self.player_sprite,
self.coin_list
)
for coin in coins_hit:
coin.remove_from_sprite_lists() # Münze entfernen
self.score += 1
# Kollision: Zwei Sprites
hit = arcade.check_for_collision(sprite_a, sprite_b)
if hit:
print("Kollision!")
# Kollision mit mehreren Listen
all_hits = arcade.check_for_collision_with_lists(
self.player,
[self.enemy_list, self.obstacle_list]
)
# Sprites an einem Punkt
sprites_here = arcade.get_sprites_at_point(
point=(mouse_x, mouse_y),
sprite_list=self.all_sprites
)
Sprite-Animation
PYTHON – Textur-Animation
class AnimatedPlayer(arcade.Sprite):
def __init__(self):
super().__init__()
# Texturen für Walk-Animation laden
self.walk_right_textures = []
for i in range(8):
tex = arcade.load_texture(
f":resources:images/animated_characters/female_person/femalePerson_walk{i}.png"
)
self.walk_right_textures.append(tex)
self.cur_texture = 0
self.update_interval = 0.1 # Sekunden pro Frame
self.time_counter = 0
def update_animation(self, delta_time):
self.time_counter += delta_time
if self.time_counter > self.update_interval:
self.time_counter = 0
self.cur_texture += 1
if self.cur_texture >= len(self.walk_right_textures):
self.cur_texture = 0
self.texture = self.walk_right_textures[self.cur_texture]
# In on_update() aufrufen:
self.player.update_animation(delta_time)
Hit Boxes
Hit Boxes definieren den Kollisionsbereich eines Sprites. Arcade bietet drei Algorithmen:
BoundingHitBox
Einfaches Rechteck. Schnellste Option. Ideal für einfache Spiele oder rechteckige Objekte.
SimpleHitBox
Verfolgt die Kontur des Sprites (Standard). Gutes Verhältnis Genauigkeit/Performance.
PymunkHitBox
Sehr genaue Kontur für Pymunk-Physik. Langsamer, aber präzise für komplexe Formen.
PYTHON – Hit Box
# Hit Box Algorithmus beim Laden wählen
sprite = arcade.Sprite(
"player.png",
hit_box_algorithm=arcade.hitbox.SimpleHitBoxAlgorithm()
)
# Oder manuell setzen
sprite = arcade.Sprite("player.png")
sprite.hit_box = sprite.texture.create_hit_box_points_simple()
# Debug: Hit Box zeichnen
self.player_list.draw_hit_boxes(
color=arcade.color.RED,
line_thickness=2
)