Aller au contenu principal

Session 86 — Corrections vitesse + hitscan visibles + physique grenades

Problemes signales en testant la Phase 1.C

  1. Bullets trop lentes : joueur court plus vite que les projectiles (6.25 JME/s
    pour Plasma speed=5 alors que le joueur va a 8 JME/s).
  2. Shotgun et Rifle invisibles : ce sont des bullets isHitScan=1,
    donc pas de projectile physique; juste log, aucun feedback visuel.
  3. Proposition : utiliser Bullet Physics (Minie) pour les grenades et mines
    plutot que de recoder MoveObject ASM a la main.

Fix #1 : Vitesse des bullets (facteur ~64x)

L’ASM stocke les velocites en fixed-point 16.16. J’avais oublie le facteur
d’echelle du sinus (max = 32768) et le shift du fixed-point (65536). Nouvelle
formule :

float speedJme = (1 << bullet.speed()) * SIN_MAX * TICKS_PER_SECOND / FIXED_POINT_SCALE;
//              = (2^speed) * 32768 * 25 / 65536
//              = (2^speed) * 12.5

Resultats :
– speed=4 (Blaster) -> 200 JME/sec
– speed=5 (Plasma, Grenade) -> 400 JME/sec
– speed=6 (Rocket, Lazer) -> 800 JME/sec

Fix #2 : Vitesse du joueur

MOVE_SPEED 8 -> 20 JME/sec (rapprochant du rythme Amiga ~2500 Amiga/sec).

Fix #3 : HitscanTracerSystem (NEW)

Nouveau systeme pour afficher un rayon visible quand on tire avec une arme
hitscan. Cylindre fin entre muzzle et muzzle+direction*50 qui fade out en 0.08s
en additif.

Couleurs :
– Shotgun Round : jaune dore
– Machine Gun Bullet : jaune pale
– MindZap : violet

Integre dans PlayerShootSystem.fireHitscan() : le spread angulaire est applique
pareil que les projectiles (shotgun 2 bullets = 2 tracers).

Fix #4 : PhysicsBulletSystem (NEW) – Physique Bullet pour grenade/mine/splutch

Approche hybride :
Bullets rapides lineaires (Plasma, Rocket, Lazer, Blaster, Assault Lazer,
MegaPlasma) -> reste geres par BulletUpdateSystem custom (mouvement simple)
Bullets avec gravite ou rebond (Grenade, Mine, Splutch1) -> geres par
le nouveau PhysicsBulletSystem via Bullet Physics (Minie).

Le choix est fait automatiquement via PhysicsBulletSystem.shouldUsePhysics(def)
qui teste si la bullet def a gravity, bounceHoriz ou bounceVert non-zero.

PhysicsBulletSystem :
– Utilise BulletAppState.getPhysicsSpace() (deja present pour le joueur)
– Cree un RigidBodyControl par bullet avec :
SphereCollisionShape(BULLET_RADIUS=0.08)
mass=0.1, restitution=0.6 (rebond moyen), friction=0.3
setGravity(0, -def.gravity() * 0.3, 0) specifique par bullet
setLinearVelocity(velX, velY, velZ) = velocite initiale calculee par
PlayerShootSystem
– Les rebonds sur murs/sol sont gere automatiquement par Bullet
– Le lifetime reste gere cote Java (pas Bullet)

Routage dans PlayerShootSystem.fireProjectile()

Apres l’allocation du slot + initialisation des champs :

if (physicsSystem != null && PhysicsBulletSystem.shouldUsePhysics(bullet)) {
    shot.handler = PlayerShot.HANDLER_PHYSICS;
    physicsSystem.spawnPhysicsBullet(shot);
} else {
    shot.handler = PlayerShot.HANDLER_SIMPLE;
    // Geometry sera creee par BulletUpdateSystem au premier update
}

BulletUpdateSystem skip les bullets avec handler != HANDLER_SIMPLE pour
eviter le double-update.

Nouveau champ handler sur PlayerShot

public int handler = HANDLER_SIMPLE;
public static final int HANDLER_SIMPLE  = 0;  // BulletUpdateSystem
public static final int HANDLER_PHYSICS = 1;  // PhysicsBulletSystem

Reset dans release() avec les autres champs.

Fichiers crees/modifies

  • src/main/java/com/ab3d2/combat/HitscanTracerSystem.java (NEW)
  • src/main/java/com/ab3d2/combat/PhysicsBulletSystem.java (NEW)
  • src/main/java/com/ab3d2/combat/PlayerShot.java (ajout handler)
  • src/main/java/com/ab3d2/combat/PlayerShootSystem.java (fix vitesse + fireHitscan + routing physics)
  • src/main/java/com/ab3d2/combat/BulletUpdateSystem.java (skip HANDLER_PHYSICS)
  • src/main/java/com/ab3d2/app/GameAppState.java (MOVE_SPEED 8 -> 20, attach des 2 nouveaux systemes)

Test attendu

./gradlew run
  1. Touche 4 (Assault Rifle) + clic : rayons jaune pale qui flashent devant
    le joueur (auparavant : rien)
  2. Touche 1 (Shotgun) + clic : 2 rayons jaune dore en eventail 22.5°
    (auparavant : rien)
  3. Touche 2 (Plasma Gun) : bullet bleue rapide (~400 JME/s, 50x plus vite
    qu’avant)
  4. Touche 3 (Grenade Launcher) : bullet verte qui rebondit sur le sol
    et les murs grace a Bullet Physics (auparavant : tombait tout droit et
    traversait tout)
  5. Touche 8 (Drop Mine) : mine grise qui tombe au sol et reste la (rebondit
    si poussee, gravite faible)
  6. Mouvement joueur : plus rapide qu’avant (20 unites/sec au lieu de 8)

Prochaine etape (Phase 1.D)

  • Raycast reel pour les hitscans (collision avec murs = tracer plus court)
  • Collision bullets simples vs murs (pour tuer Plasma/Rocket/Lazer)
  • Collision bullets vs ennemis (dommages)

Laisser un commentaire

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