From d8c0f489aa3df0cade543dcc7492dcfee78452af Mon Sep 17 00:00:00 2001 From: Sander Schobers Date: Sun, 29 Dec 2019 17:25:41 +0100 Subject: [PATCH] Added particles on splash. --- cmd/krampus19/animations.go | 76 ++++++++++++++++++++++++ cmd/krampus19/game.go | 5 +- cmd/krampus19/playlevel.go | 16 +++++ cmd/krampus19/playlevelstate.go | 22 +++++++ cmd/krampus19/res/particles.png | Bin 0 -> 9033 bytes cmd/krampus19/res/sprites/particles.txt | 11 ++++ 6 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 cmd/krampus19/res/particles.png create mode 100644 cmd/krampus19/res/sprites/particles.txt diff --git a/cmd/krampus19/animations.go b/cmd/krampus19/animations.go index 59a1314..ab1c4f9 100644 --- a/cmd/krampus19/animations.go +++ b/cmd/krampus19/animations.go @@ -1,6 +1,8 @@ package main import ( + "math" + "math/rand" "time" "opslag.de/schobers/geom" @@ -50,3 +52,77 @@ func (a *sinkAnimation) Animate(start, now time.Duration) bool { a.e.scr.z = progress * 80 return true } + +type splashAnimation struct { + particles []splashParticle +} + +func newSplashAnimation(pos geom.Point) *splashAnimation { + pos32 := pos.ToF32() + a := &splashAnimation{} + n := rand.Intn(20) + 4 + for i := 0; i < n; i++ { + angle := rand.Float32() * math.Pi * 2 + a.particles = append(a.particles, splashParticle{ + angle: angle, + origin: pos32.Add2D(.45*geom.Cos32(angle), .45*geom.Sin32(angle)), // [-0.45 .. 0.45] + speed: .5*math.Pi + 2*math.Pi*rand.Float32(), // [0.5*Pi .. 2.5*Pi) + height: .2 + .8*rand.Float32(), // [0.2 .. 1.0) + dist: .5 + .5*rand.Float32(), // [0.5 .. 1.0) + }) + } + return a +} + +func (a *splashAnimation) Animate(start, now time.Duration) bool { + const duration = 1670 * time.Millisecond + + progress := float32((now-start)*1000/duration) * .001 + var opaq float32 = 1 + if progress > .6 { + if progress > 1 { + opaq = 0 + } else { + opaq = 2.5 - 2.5*progress + } + } + for i, p := range a.particles { + progress := geom.Min32(math.Pi, progress*p.speed) / math.Pi + a.particles[i].part = particle{ + opaq: opaq, + pos: p.origin.Add2D(progress*p.dist*geom.Cos32(p.angle), progress*p.dist*geom.Sin32(p.angle)), + z: 20 + p.height*-100*geom.Sin32(progress*math.Pi), + } + } + if progress > 1 { + return false + } + return true +} + +type particle struct { + pos geom.PointF32 + z float32 + opaq float32 +} + +func splitParticles(y float32, particles []particle) (behind []particle, front []particle) { + for _, p := range particles { + if p.pos.Y > y { + front = append(front, p) + } else { + behind = append(behind, p) + } + } + return +} + +type splashParticle struct { + origin geom.PointF32 + angle float32 + speed float32 + height float32 + dist float32 + + part particle +} diff --git a/cmd/krampus19/game.go b/cmd/krampus19/game.go index d734246..3b87eb6 100644 --- a/cmd/krampus19/game.go +++ b/cmd/krampus19/game.go @@ -156,7 +156,8 @@ func (g *game) loadAssets() error { "tile_lava_brick.png": "lava_brick", "tile_magma.png": "magma", - "ui.png": "ui", + "particles.png": "particles", + "ui.png": "ui", }) if err != nil { return err @@ -178,7 +179,7 @@ func (g *game) loadAssets() error { log.Printf("Loaded %d fonts.\n", g.ui.Fonts().Len()) log.Println("Loading sprites") - err = g.loadSprites("brick", "dragon", "lava_brick", "magma", "ui", "villain") + err = g.loadSprites("brick", "dragon", "lava_brick", "magma", "particles", "ui", "villain") if err != nil { return err } diff --git a/cmd/krampus19/playlevel.go b/cmd/krampus19/playlevel.go index 30854f4..c70113a 100644 --- a/cmd/krampus19/playlevel.go +++ b/cmd/krampus19/playlevel.go @@ -178,8 +178,21 @@ func (l *playLevel) drawSprite(name, partName string, pos entityLoc) { l.ctx.SpriteDrawer.Draw(name, partName, l.posToScreenF32(pos.pos, pos.z), DrawSpriteOptions{Scale: l.scale}) } +func (l *playLevel) drawSpriteAlpha(name, partName string, pos entityLoc, alpha float32) { + a := byte(alpha * 255) + c := allg5.NewColorAlpha(a, a, a, a) + l.ctx.SpriteDrawer.Draw(name, partName, l.posToScreenF32(pos.pos, pos.z), DrawSpriteOptions{Scale: l.scale, Tint: &c}) +} + func (l *playLevel) Render(ctx *alui.Context, bounds geom.RectangleF32) { level := l.state.level + + drawParticles := func(particles []particle) { + for _, p := range particles { + l.drawSpriteAlpha("particles", "splash", entityLoc{p.pos, p.z}, p.opaq) + } + } + for i, t := range level.tiles { pos := geom.Pt(i%level.width, i/level.width) scr := entityLoc{pos.ToF32(), 0} @@ -194,8 +207,11 @@ func (l *playLevel) Render(ctx *alui.Context, bounds geom.RectangleF32) { l.drawSprite("magma", "magma", scr) brick := l.state.FindSunkenBrick(pos) if brick != nil { + behind, front := splitParticles(scr.pos.Y, l.state.Particles(pos)) + drawParticles(behind) l.drawSprite("brick", "brick", brick.scr) l.drawSprite("magma", "sunken_overlay", scr) + drawParticles(front) } } } diff --git a/cmd/krampus19/playlevelstate.go b/cmd/krampus19/playlevelstate.go index 37f74c3..f1a5a4a 100644 --- a/cmd/krampus19/playlevelstate.go +++ b/cmd/krampus19/playlevelstate.go @@ -18,6 +18,7 @@ type playLevelState struct { villain *entity bricks entityList sunken entityList + splash map[geom.Point]*splashAnimation steps int complete bool @@ -33,6 +34,20 @@ func (s *playLevelState) Entities() entityList { return entities.Add(s.player).Add(s.villain).AddList(s.bricks) } +func (s *playLevelState) Particles(at geom.Point) []particle { + var particles []particle + for pos, ani := range s.splash { + if pos != at { + continue + } + log.Println("Found particles at", at) + for _, p := range ani.particles { + particles = append(particles, p.part) + } + } + return particles +} + func (s *playLevelState) FindSunkenBrick(pos geom.Point) *entity { return s.sunken.FindEntity(pos) } @@ -50,6 +65,7 @@ func (s *playLevelState) Init(ctx *Context, pack, level string, onComplete func( s.level = s.pack.levels[level] s.bricks = nil s.sunken = nil + s.splash = map[geom.Point]*splashAnimation{} for i, e := range s.level.entities { switch e { case entityTypeBrick: @@ -116,6 +132,12 @@ func (s *playLevelState) TryPlayerMove(dir geom.Point, key allg5.Key) { s.bricks = s.bricks.Remove(brickTo) s.sunken = s.sunken.Add(brick) s.ani.Start(s.ctx.Tick, newSinkAnimation(brick)) + + splash := newSplashAnimation(brickTo) + s.splash[brickTo] = splash + s.ani.StartFn(s.ctx.Tick, splash, func() { + delete(s.splash, brickTo) + }) } }) } diff --git a/cmd/krampus19/res/particles.png b/cmd/krampus19/res/particles.png new file mode 100644 index 0000000000000000000000000000000000000000..61f30e89d059af5f2e322e94bb8ae50d78371343 GIT binary patch literal 9033 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 literal 0 HcmV?d00001 diff --git a/cmd/krampus19/res/sprites/particles.txt b/cmd/krampus19/res/sprites/particles.txt new file mode 100644 index 0000000..b53d306 --- /dev/null +++ b/cmd/krampus19/res/sprites/particles.txt @@ -0,0 +1,11 @@ +sprite: +texture: particles + +part: +name: splash +sub_texture: 0,0,96,96 +anchor: 48,48 +scale: 6 +:part + +:sprite \ No newline at end of file