Steh-Pose final: frontal (17) nur am Spawn/vor erster Bewegung, danach seitlich (8) -- Stefans Original-Screenshots

This commit is contained in:
2026-07-26 11:12:10 +02:00
parent bcd29cbc61
commit 98dbc3e69f
2 changed files with 27 additions and 10 deletions
+14 -10
View File
@@ -86,12 +86,12 @@ SLOPE_CT = 16
# Charakter hat, ergibt sich daraus, WELCHE Slots sein BOB enthaelt
# (nur Tony hat 13-16 = rennen, nur Smacks/Toucan 25-28 = schwimmen,
# nur Toucan 29-31 als Richtungs-Paare = fliegen, nur Coco 35-44 = hangeln).
# Slot 17 = FRONTALE Steh-Pose (DOSBox-Abgleich stand_timeline.png: das
# Original steht mit Bauch zur Kamera -- BOB 34 bei Tony). Slot 8 (BOB 16)
# ist nur eine Seiten-/Uebergangspose und sah beim Stehen falsch aus
# (Stefans Feedback "Stand-Animation passt nicht").
SLOT_IDLE = 17
SLOT_IDLE_LANDING = 8 # kurze Pose direkt nach der Landung (Tabelle [4][8,8,8])
# Steh-Posen (Stefans Screenshots + DOSBox-Serien, 26.07.2026):
# - Am SPAWN (noch nie bewegt) steht das Original FRONTAL: Slot 17.
# - Nach Bewegung steht es SEITLICH in Blickrichtung: Slot 8 (BOB 16).
SLOT_STAND_FRONT = 17
SLOT_STAND_SIDE = 8
SLOT_IDLE = SLOT_STAND_SIDE # Fallback-Slot (existiert bei allen Chars)
SLOT_JUMP = 9 # Springen/Fallen
SLOT_SQUAT = 10 # Absprung-Hocke
SLOT_ARMUP = 11 # Arm hoch / Daumen hoch (Spawn-Pose, Tabelle [70][10,11,10])
@@ -291,6 +291,8 @@ class Player:
self.jump_lock = False # Sprung gesperrt, bis Taste losgelassen
# (Leertaste aus dem Tuer-Menue "leckte"
# sonst als Sofortsprung ins Level)
self.moved = False # schon bewegt seit Spawn/Charakterwechsel?
# (frontale vs. seitliche Steh-Pose)
self._grounded_before = False
self.set_character(char, pos)
@@ -313,6 +315,7 @@ class Player:
# Start-Sprite-Sequenz beim Levelstart/Charakterwechsel (Stefans
# Beobachtung: Tony streckt die Hand nach oben, Smacks Daumen hoch)
self.spawn_t = SPAWN_ANIM_SECONDS
self.moved = False
def sprite(self, slot):
'''(Surface, ax, ay) fuer einen Slot; Blickrichtung links = +50
@@ -363,6 +366,7 @@ class Player:
self.vx = move * speed
if move:
self.facing = move
self.moved = True
self.anim_t += dt * (RUN_ANIM_FPS / WALK_ANIM_FPS if self.running else 1.0)
self.idle_t = 0.0
else:
@@ -581,10 +585,9 @@ class Player:
if self.idle_t >= IDLE_ANIM_AFTER:
i = int((self.idle_t - IDLE_ANIM_AFTER) * IDLE_WAIT_FPS) % len(ANIM_IDLE_WAIT)
return ANIM_IDLE_WAIT[i]
if self.idle_t < 0.17:
# kurze Uebergangspose beim Anhalten/Landen (Original [4][8,8,8])
return SLOT_IDLE_LANDING
return SLOT_IDLE
# Original-Verhalten (Stefans Screenshots): frontal nur solange die
# Figur sich seit Spawn/Tuer noch nie bewegt hat, danach seitlich
return SLOT_STAND_SIDE if self.moved else SLOT_STAND_FRONT
def draw(self, screen, cam_x, cam_y):
# Schadens-Blinken: nach Herzverlust flackert die Figur kurz
@@ -818,6 +821,7 @@ def run_level(clock, assets, audio_paths, map_name='W1L1'):
player.x, player.y = spawn_px
player.vy = 0.0
player.spawn_t = SPAWN_ANIM_SECONDS
player.moved = False
start = time.monotonic() # neuer Versuch = frische Levelzeit
# Tuer-Sequenz: offen zeigen (Figur schaut rein), nach 1s die Aktion