Home › Kategorie 03

👾 Sprites & SpriteLists

INTERMEDIATE ⏱ ~35 Min

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.

AttributTypBeschreibung
center_x / center_yfloatPosition des Mittelpunkts
change_x / change_yfloatGeschwindigkeit (Pixel/Update)
anglefloatRotation in Grad
scalefloatSkalierungsfaktor
alphaint (0-255)Transparenz
textureTextureAktuelle Textur
visibleboolSichtbarkeit
hit_boxHitBoxKollisions-Bereich
Sprite Property Editor – Ändere Eigenschaften live
X: 340
Y: 110
Winkel: 0°
Scale: 1.0
Alpha: 255
VelX: 0
VelY: 0

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
)