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
+13
View File
@@ -1986,3 +1986,16 @@ Slot 8 laeuft 0.17s beim Anhalten, Idle-Warteanimation (Schachtel) jetzt
nach 4s (Timeline: ~4s). Slot 18 = zweite Frontal-Pose (Variante), noch nach 4s (Timeline: ~4s). Slot 18 = zweite Frontal-Pose (Variante), noch
ungenutzt. Damit ist auch klar: Slot-17-Frames sind KEINE Schadensposen. ungenutzt. Damit ist auch klar: Slot-17-Frames sind KEINE Schadensposen.
Alle 4 Charaktere haben Slot 17 (Coco sogar als Richtungs-Paar). Alle 4 Charaktere haben Slot 17 (Coco sogar als Richtungs-Paar).
## 26.07.2026 (27) -- Steh-Pose, die Zweite: frontal NUR am Spawn
Stefans Screenshots (unsere frontale Pose vs. Original seitlich):
Eintrag (26) war ueberkorrigiert. Original-Verhalten:
- Spawn/Charakterwechsel, noch nie bewegt -> FRONTAL (Slot 17)
(deshalb zeigten die sess_level-Frames vom Levelstart frontal)
- nach der ersten Bewegung -> SEITLICH in Blickrichtung (Slot 8)
Umgesetzt ueber player.moved-Flag (Reset bei set_character/Respawn).
Wichtig fuers Protokoll: die DOSBox-"Checks" liefen gegen GESPEICHERTE
Frameserien aus frueheren Capture-Sessions (Scratchpad), nicht live --
und die zeigten nur den Spawn-Fall. Idle-Warteanimation (Schachtel nach
4s) unveraendert.
+14 -10
View File
@@ -86,12 +86,12 @@ SLOPE_CT = 16
# Charakter hat, ergibt sich daraus, WELCHE Slots sein BOB enthaelt # Charakter hat, ergibt sich daraus, WELCHE Slots sein BOB enthaelt
# (nur Tony hat 13-16 = rennen, nur Smacks/Toucan 25-28 = schwimmen, # (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). # nur Toucan 29-31 als Richtungs-Paare = fliegen, nur Coco 35-44 = hangeln).
# Slot 17 = FRONTALE Steh-Pose (DOSBox-Abgleich stand_timeline.png: das # Steh-Posen (Stefans Screenshots + DOSBox-Serien, 26.07.2026):
# Original steht mit Bauch zur Kamera -- BOB 34 bei Tony). Slot 8 (BOB 16) # - Am SPAWN (noch nie bewegt) steht das Original FRONTAL: Slot 17.
# ist nur eine Seiten-/Uebergangspose und sah beim Stehen falsch aus # - Nach Bewegung steht es SEITLICH in Blickrichtung: Slot 8 (BOB 16).
# (Stefans Feedback "Stand-Animation passt nicht"). SLOT_STAND_FRONT = 17
SLOT_IDLE = 17 SLOT_STAND_SIDE = 8
SLOT_IDLE_LANDING = 8 # kurze Pose direkt nach der Landung (Tabelle [4][8,8,8]) SLOT_IDLE = SLOT_STAND_SIDE # Fallback-Slot (existiert bei allen Chars)
SLOT_JUMP = 9 # Springen/Fallen SLOT_JUMP = 9 # Springen/Fallen
SLOT_SQUAT = 10 # Absprung-Hocke SLOT_SQUAT = 10 # Absprung-Hocke
SLOT_ARMUP = 11 # Arm hoch / Daumen hoch (Spawn-Pose, Tabelle [70][10,11,10]) 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 self.jump_lock = False # Sprung gesperrt, bis Taste losgelassen
# (Leertaste aus dem Tuer-Menue "leckte" # (Leertaste aus dem Tuer-Menue "leckte"
# sonst als Sofortsprung ins Level) # sonst als Sofortsprung ins Level)
self.moved = False # schon bewegt seit Spawn/Charakterwechsel?
# (frontale vs. seitliche Steh-Pose)
self._grounded_before = False self._grounded_before = False
self.set_character(char, pos) self.set_character(char, pos)
@@ -313,6 +315,7 @@ class Player:
# Start-Sprite-Sequenz beim Levelstart/Charakterwechsel (Stefans # Start-Sprite-Sequenz beim Levelstart/Charakterwechsel (Stefans
# Beobachtung: Tony streckt die Hand nach oben, Smacks Daumen hoch) # Beobachtung: Tony streckt die Hand nach oben, Smacks Daumen hoch)
self.spawn_t = SPAWN_ANIM_SECONDS self.spawn_t = SPAWN_ANIM_SECONDS
self.moved = False
def sprite(self, slot): def sprite(self, slot):
'''(Surface, ax, ay) fuer einen Slot; Blickrichtung links = +50 '''(Surface, ax, ay) fuer einen Slot; Blickrichtung links = +50
@@ -363,6 +366,7 @@ class Player:
self.vx = move * speed self.vx = move * speed
if move: if move:
self.facing = move self.facing = move
self.moved = True
self.anim_t += dt * (RUN_ANIM_FPS / WALK_ANIM_FPS if self.running else 1.0) self.anim_t += dt * (RUN_ANIM_FPS / WALK_ANIM_FPS if self.running else 1.0)
self.idle_t = 0.0 self.idle_t = 0.0
else: else:
@@ -581,10 +585,9 @@ class Player:
if self.idle_t >= IDLE_ANIM_AFTER: if self.idle_t >= IDLE_ANIM_AFTER:
i = int((self.idle_t - IDLE_ANIM_AFTER) * IDLE_WAIT_FPS) % len(ANIM_IDLE_WAIT) i = int((self.idle_t - IDLE_ANIM_AFTER) * IDLE_WAIT_FPS) % len(ANIM_IDLE_WAIT)
return ANIM_IDLE_WAIT[i] return ANIM_IDLE_WAIT[i]
if self.idle_t < 0.17: # Original-Verhalten (Stefans Screenshots): frontal nur solange die
# kurze Uebergangspose beim Anhalten/Landen (Original [4][8,8,8]) # Figur sich seit Spawn/Tuer noch nie bewegt hat, danach seitlich
return SLOT_IDLE_LANDING return SLOT_STAND_SIDE if self.moved else SLOT_STAND_FRONT
return SLOT_IDLE
def draw(self, screen, cam_x, cam_y): def draw(self, screen, cam_x, cam_y):
# Schadens-Blinken: nach Herzverlust flackert die Figur kurz # 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.x, player.y = spawn_px
player.vy = 0.0 player.vy = 0.0
player.spawn_t = SPAWN_ANIM_SECONDS player.spawn_t = SPAWN_ANIM_SECONDS
player.moved = False
start = time.monotonic() # neuer Versuch = frische Levelzeit start = time.monotonic() # neuer Versuch = frische Levelzeit
# Tuer-Sequenz: offen zeigen (Figur schaut rein), nach 1s die Aktion # Tuer-Sequenz: offen zeigen (Figur schaut rein), nach 1s die Aktion