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.02vers
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
- 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) - Touche 4 (Assault Rifle) + clic : rafale, chaque tir laisse un flash
jaune sur le mur, le traceur s’arrete a l’impact - Touche 1 (Shotgun) + clic : 2 flashs dores apparaissent sur le mur,
les 2 traceurs s’arretent au mur (spread visible) - Touche 6 (Rocket Launcher) + tir : boule orange qui s’arrete au mur
avec un flash orange (plus tard : vraie explosion avec AoE) - 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)