Steh-Pose final: frontal (17) nur am Spawn/vor erster Bewegung, danach seitlich (8) -- Stefans Original-Screenshots
This commit is contained in:
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user