Aller au contenu principal

Session 87 — Phase 1.D : Collision bullets vs murs + impacts

Objectif

Les bullets traversaient les murs jusqu’ici (phase 1.C). Implementation de :
Raycast contre la geometrie du niveau via Bullet Physics (Minie)
Collision bullets simples vs murs : Plasma/Rocket/Lazer/Blaster meurent
au contact d’un mur
Tracer hitscan qui s’arrete sur le mur (plus de tracer qui traverse)
Flash d’impact visible au point de collision

Pas encore de collision avec les ennemis (pas d’ennemis spawnes actuellement).
Phase 1.E quand on spawnera les premiers aliens.

Nouveaux composants

WorldRaycaster : service de raycast contre la geometrie du niveau.
Utilise PhysicsSpace.rayTest() (Minie) qui est deja en place pour les
collisions du joueur.

  • castRay(from, direction, maxDistance) -> RayHit { hit, impactPoint, normal, distance }
  • Recule automatiquement le point d’impact de IMPACT_BACKOFF = 0.02 vers
    l’origine pour eviter le z-fighting des effets visuels avec la surface.
  • Helpers RayHit.isFloor() / isCeiling() / isWall() pour classifier la
    surface touchee via sa normale.

ImpactEffectSystem (AppState) : spawn un flash d’impact (sphere qui
grossit et s’attenue) au point de collision.
– Duree 0.15s, rayon 0.05 -> 0.25 pendant la vie
– Couleur selon le bullet type (plasma bleu, rocket orange, etc.)
– BlendMode Additive pour effet lumineux
– Placeholder : en phase ulterieure on utilisera les vrais sprites
BulT_PopData_vb depuis includes/explosion.dat
et includes/splutch.dat

Modifications

HitscanTracerSystem :
spawnTracer() retourne maintenant le Vector3f impactPoint (utile pour
spawner le flash d’impact au bon endroit)
– Si un WorldRaycaster est installe via setRaycaster(), le traceur s’arrete
au premier mur touche (plus court, plus realiste)
– Sans raycaster : traceur de 50 unites (fallback comme avant)

BulletUpdateSystem :
– Avant de mettre a jour la position, sauvegarde oldX/Y/Z
– Si raycaster installe : castRay(oldPos, dir, stepDistance) pour voir si
la bullet traverse un mur entre deux frames
– Si hit : positionne la bullet au point d’impact, spawn un flash via
ImpactEffectSystem et tue la bullet
– Les bullets simples (Plasma/Rocket/Lazer/Blaster) meurent maintenant en
touchant les murs au lieu de continuer indefiniment

PlayerShootSystem :
– Nouveau champ optionnel impactSystem via setImpactSystem()
– Dans fireHitscan() : recupere le impactPoint retourne par
tracerSystem.spawnTracer() et spawn un flash d’impact a cet endroit

GameAppState :
– Instancie ImpactEffectSystem, l’attache, le passe a shoot et bulletUpdate
– Dans setupPhysics() (apres que le PhysicsSpace existe) : cree un
WorldRaycaster(physicsSpace) et le distribue a bulletUpdateSystem et
tracerSystem
– Cleanup ajoute pour le nouveau impactSystem

Fichiers crees/modifies

  • src/main/java/com/ab3d2/combat/WorldRaycaster.java (NEW)
  • src/main/java/com/ab3d2/combat/ImpactEffectSystem.java (NEW)
  • src/main/java/com/ab3d2/combat/HitscanTracerSystem.java (raycaster + retour impact)
  • src/main/java/com/ab3d2/combat/BulletUpdateSystem.java (raycaster + kill on wall)
  • src/main/java/com/ab3d2/combat/PlayerShootSystem.java (impactSystem + flash hitscan)
  • src/main/java/com/ab3d2/app/GameAppState.java (integration)

Test attendu

./gradlew run
  1. Touche 2 (Plasma Gun) + tir contre un mur : la bullet bleue s’arrete
    sur le mur
    avec un petit flash bleu clair (auparavant : elle traversait)
  2. Touche 4 (Assault Rifle) + clic : rafale, chaque tir laisse un flash
    jaune sur le mur, le traceur s’arrete a l’impact
  3. Touche 1 (Shotgun) + clic : 2 flashs dores apparaissent sur le mur,
    les 2 traceurs s’arretent au mur (spread visible)
  4. Touche 6 (Rocket Launcher) + tir : boule orange qui s’arrete au mur
    avec un flash orange (plus tard : vraie explosion avec AoE)
  5. Touche 3 (Grenade Launcher) : la grenade est geree par Bullet Physics
    donc elle rebondit deja correctement sans avoir besoin du raycaster

Prochaine etape

  • Phase 1.E : Spawn d’ennemis + collision bullets vs ennemis + degats
    (le premier alien du niveau, touchable par le joueur, prend des degats)
  • Phase 1.F : Explosions AoE pour Rocket/Grenade/Mine (rayon + damage
    falloff, killzone sur les ennemis environnants)

Laisser un commentaire

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