diff --git a/main.go b/main.go index 79d7796..51178e2 100644 --- a/main.go +++ b/main.go @@ -73,12 +73,14 @@ type emitter struct { particleAmount int } - var city *scene func update_emitters() { - for _, e := range city.emitters { - e.update() + for i, e := range city.emitters { + if remainingParticles := e.update(); remainingParticles == 0 { + city.emitters[i] = city.emitters[len(city.emitters)-1] + city.emitters = city.emitters[:len(city.emitters)-1] + } } } @@ -97,7 +99,7 @@ func newEmitter(pos rl.Vector3, particleAmount int) *emitter { direction = rl.Vector3Normalize(direction) direction = rl.Vector3Scale(direction, 0.3 + rand.Float32()/3) particle := particle{ - lifetime: rl.GetTime() + 1, + lifetime: rl.GetTime() + 2, speed: direction, pos: pos, } @@ -107,20 +109,34 @@ func newEmitter(pos rl.Vector3, particleAmount int) *emitter { return &emitter } -func (e *emitter) update() { +func (e *emitter) update() int { gravity := rl.NewVector3(0, -0.02, 0) - for _, particle := range e.particles { - if rl.GetTime() > particle.lifetime { - continue + + remainingParticles := 0 + + rl.BeginBlendMode(rl.BlendAdditive) + { + for _, particle := range e.particles { + if rl.GetTime() > particle.lifetime { + continue + } + + particle.speed = rl.Vector3Add(particle.speed, gravity) + newPos := rl.Vector3Add(particle.pos, particle.speed) + if newPos.Y <= 0 { + particle.pos.Y = 0 + } else { + particle.pos = newPos + } + + rl.DrawCubeV(particle.pos, rl.NewVector3(.1, .1, .1), rl.Yellow) + + remainingParticles += 1 } - particle.pos = rl.Vector3Add(particle.pos, particle.speed) - particle.speed = rl.Vector3Add(particle.speed, gravity) - rl.BeginBlendMode(rl.BlendAdditive) - { - rl.DrawSphere(particle.pos, 0.2, rl.Red) - } - rl.EndBlendMode() } + rl.EndBlendMode() + + return remainingParticles } // retona true caso projétil precise ser destruido @@ -130,12 +146,11 @@ func (p *projectile) isHit() bool { p.pos = rl.Vector3Add(p.pos, p.speed) if p.pos.Y < 0 { - city.emitters = append(city.emitters, newEmitter(p.pos, 100)) + city.emitters = append(city.emitters, newEmitter(p.pos, 500)) for _, building := range city.buildings { if dist := rl.Vector3Distance(p.pos, building.pos); dist < 10 { building.causeDamage(3) } - } return true } @@ -256,7 +271,7 @@ func (hb *healthBar) update() { func newHealthBar(buildings []*building) *healthBar { return &healthBar{ - life: 3 * len(buildings), + life: buildingsHealth * len(buildings), } } @@ -266,7 +281,7 @@ func (b *building) causeDamage(damage int) { } b.animate = shakeBuilding(b) b.life -= damage - fmt.Println("damage:", damage, "life:", b.life) + // fmt.Println("damage:", damage, "life:", b.life) } func newBuilding(x, z float32) *building {