Problemes signales en testant la Phase 1.C
- 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). - Shotgun et Rifle invisibles : ce sont des bullets
isHitScan=1,
donc pas de projectile physique; juste log, aucun feedback visuel. - Proposition : utiliser Bullet Physics (Minie) pour les grenades et mines
plutot que de recoderMoveObjectASM 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
- Touche 4 (Assault Rifle) + clic : rayons jaune pale qui flashent devant
le joueur (auparavant : rien) - Touche 1 (Shotgun) + clic : 2 rayons jaune dore en eventail 22.5°
(auparavant : rien) - Touche 2 (Plasma Gun) : bullet bleue rapide (~400 JME/s, 50x plus vite
qu’avant) - 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) - Touche 8 (Drop Mine) : mine grise qui tombe au sol et reste la (rebondit
si poussee, gravite faible) - 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)