Aller au contenu principal

Session 132duodecimus (suite 10) — Fix hauteur des aliens / objets dans le niveau

Demande user

« Ce sont les objects dans les niveaux, que ce soit monstres, items, clés,
interrupteurs…, il ne sont pas souvent à la bonnes hauteurs »

Diagnostic

Dans LevelSceneBuilder.addItems(), la taille visuelle du sprite (et donc
sa position Y centree) etait calculee comme colHeight / Y_SCALE (= /32).
Avec les valeurs JSON :

Alien height /32 (Y_SCALE) /64 (XZ_SCALE)
Red Alien 128 4 m ❌ 2 m ✓
Guard 160 5 m ❌ 2.5 m ✓
Mantis Boss 800 25 m ❌ 12.5 m ✓
Triclaw 45 1.4 m 0.7 m ✓
Droid 40 1.25 m 0.6 m ✓
Wasp Boss 200 6.25 m ❌ 3.1 m ✓
AlienPriest 256 8 m ❌ 4 m ✓

Aliens 2x trop grands -> centre du sprite trop haut -> aliens « flottent ».

Cause racine

L’ASM stocke AlienT_Height_w et ODefT_CollideHeight_w en Y editor units
(32 units/m), mais ces valeurs servent UNIQUEMENT pour la collision
verticale, PAS pour la taille visuelle. Reference
newaliencontrol.s::ItsAnAlien :

move.w  AlienT_Height_w(a1),d0
ext.l   d0
asl.l   #7,d0          ; * 128
move.l  d0,thingheight ; -> Plr1_CheckObjectCollide / pass-through tests

La vraie taille visuelle ASM vient de la frame data
(GLFT_AlienAnims_l[idx][option][frame].scale, byte 2-3 de chaque frame).

Fix

Dans LevelSceneBuilder.addItems() :

// AVANT
float spriteH = (colHeight > 0) ? colHeight / Y_SCALE : DEFAULT_SPRITE_H;

// APRES
float spriteH = (colHeight > 0) ? colHeight / XZ_SCALE : DEFAULT_SPRITE_H;

Fix pragmatique : XZ_SCALE = 64 au lieu de Y_SCALE = 32. Donne empiriquement
des proportions plausibles pour tous les aliens (cf. tableau ci-dessus). Ce
fix s’applique a la fois aux sprites bitmap et aux modeles vectobj (qui
utilisent spriteH comme targetH dans tryLoadVectObj).

La formule de position Y jy = -y / Y_SCALE + spriteH * 0.5f reste
inchangee pour la partie floor (y = zone.floorH est bien en Y units), mais
l’offset spriteH * 0.5f est maintenant 2x plus petit -> sprite mieux pose
sur le sol.

A faire pour valider

  1. ./gradlew buildScenes pour regenerer les .j3o de tous les niveaux
  2. Tester en jeu Level A (et autres) : Red Alien doit faire ~2m, Guard
    ~2.5m, Mantis Boss ~12m -> proportions humanoides correctes
  3. Calibrer si besoin (autres facteurs possibles : /48, /50, /56)

Limitations connues

  • Le port complet du frame scaling ASM (lecture du byte 2-3 de chaque frame
    de AlienAnims_l pour la taille visuelle reelle) est ulterieur. La
    division par XZ_SCALE est une approximation.
  • Les aliens « qui volent » (Wasp Boss, etc.) flottent toujours au sol et pas
    en l’air : le worldY n’est pas encore pris en compte dans le runtime
    (AlienControlSystem fige Y au spawn). Voir TODO 2.F dans le code.
  • Le bug « pas la bonne couleur » et « il leur manque des elements » (rapporte
    en meme temps par user) n’est pas adresse dans cette suite, sera traite
    dans une session ulterieure.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *