fix(vfx): remove ball contact sparks

This commit is contained in:
Josh Creek
2026-08-08 08:47:48 +01:00
parent e0a1cbaf6d
commit 0223b55de8
2 changed files with 1 additions and 45 deletions
-44
View File
@@ -119,7 +119,6 @@ const THRUST_THRESHOLD = 1.0 # percent
var _engine_cores: Array[MeshInstance3D] = []
var _engine_flames: Array[MeshInstance3D] = []
var _engine_lights: Array[OmniLight3D] = []
var _impact_sparks: GPUParticles3D
func _ready():
@@ -264,17 +263,6 @@ func _build_movement_vfx() -> void:
add_child(light)
_engine_lights.append(light)
_impact_sparks = _make_particles(
"ImpactSparks", Color(1.0, 0.72, 0.22, 1.0), Vector2(0.09, 0.3),
28, 0.32, Vector3.UP, 180.0, 5.0, 12.0
)
_impact_sparks.one_shot = true
_impact_sparks.explosiveness = 1.0
_impact_sparks.local_coords = false
_impact_sparks.emitting = false
add_child(_impact_sparks)
func _vfx_material(color: Color, energy: float) -> StandardMaterial3D:
var mat := StandardMaterial3D.new()
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
@@ -287,34 +275,6 @@ func _vfx_material(color: Color, energy: float) -> StandardMaterial3D:
return mat
func _make_particles(
particle_name: String, color: Color, size: Vector2, amount: int,
lifetime: float, direction: Vector3, spread: float,
velocity_min: float, velocity_max: float
) -> GPUParticles3D:
var quad := QuadMesh.new()
quad.size = size
quad.material = _vfx_material(color, 2.2)
var process := ParticleProcessMaterial.new()
process.direction = direction
process.spread = spread
process.initial_velocity_min = velocity_min
process.initial_velocity_max = velocity_max
process.gravity = Vector3.ZERO
process.scale_min = 0.35
process.scale_max = 1.0
var particles := GPUParticles3D.new()
particles.name = particle_name
particles.amount = amount
particles.lifetime = lifetime
particles.local_coords = true
particles.process_material = process
particles.draw_pass_1 = quad
particles.visibility_aabb = AABB(Vector3(-3, -3, -1), Vector3(6, 6, 12))
particles.emitting = false
return particles
func _update_movement_vfx() -> void:
if _engine_flames.is_empty():
return
@@ -354,10 +314,6 @@ func _on_body_entered(body: Node) -> void:
var relative_speed := (linear_velocity - (body as Ball).linear_velocity).length()
var intensity := clampf(inverse_lerp(3.0, 24.0, relative_speed), 0.12, 1.0)
var contact_pos := (global_position + (body as Ball).global_position) * 0.5
if _impact_sparks:
_impact_sparks.position = to_local(contact_pos)
_impact_sparks.amount_ratio = lerpf(0.25, 1.0, intensity)
_impact_sparks.restart()
ball_contact.emit(intensity, contact_pos)
+1 -1
View File
@@ -16,7 +16,7 @@ The largest gap between this and a AAA-feeling product is presentation, not code
- [ ] **Audio — there is none.** Zero sound files, zero `AudioStreamPlayer` nodes, no bus layout. Needs: engine hum pitched to throttle, turbo whoosh, ball impacts scaled by collision impulse, wall scrapes, goal explosion, crowd bed, UI clicks, countdown beeps, music. Can be driven off `Ship`'s existing telemetry signals.
- [x] SSAO/SSIL in the arena Environments — cheapest single perceived-quality win available; grounds the ships against the deck and gives the fillets and goal recesses real depth.
- [x] VFX on anything that moves: throttle-reactive engine cores and simple rear flames, a speed-scaled ball trail, contact sparks and team-tinted goal bursts.
- [x] VFX on anything that moves: throttle-reactive engine cores and simple rear flames, a speed-scaled ball trail and team-tinted goal bursts.
- [x] Impact feedback — intensity-scaled screen shake, unscaled hit-stop, HUD flash and controller rumble on ball contact.
- [x] Camera feel in `ship_camera.gd` — speed-based FOV widening, turbo kick-back and decaying impact shake.
- [x] Goal celebration sequence: goal burst, team-tinted flash/title card, dedicated camera cut and slow-motion beat after authoritative score registration and before reset/kickoff.