diff --git a/examples/splashmenu/scenes/bsoft.go b/examples/splashmenu/scenes/bsoft.go index b81c80c..c9550cd 100644 --- a/examples/splashmenu/scenes/bsoft.go +++ b/examples/splashmenu/scenes/bsoft.go @@ -21,6 +21,9 @@ const ( maxGlitchOffset = 25 minGlitchInterval = 60 maxGlitchTimeOffset = 15 + //in seconds + fadeTimer = 1.0 + fadeOffset = 2.0 ) var ( @@ -56,6 +59,46 @@ func init() { glitchTimer = 15 } +type Fader struct { + Curtain *ebiten.Image + counter int + timer float32 + offset float32 + alpha float32 + fps float32 +} + +func NewFader(x, y int, t, offset float32) Fader { + f := Fader{ + Curtain: ebiten.NewImage(x, y), + timer: t, + counter: 0, + alpha: 0.0, + fps: 60, + offset: offset, + } + f.Curtain.Fill(color.RGBA{0x00, 0x00, 0x00, 0xFF}) + return f +} +func (f *Fader) Update() { + f.counter++ + + f.alpha = (float32(f.counter) - (f.offset * f.fps)) / (f.timer * f.fps) + if f.alpha < 0 { + f.alpha = 0 + } +} + +func (f *Fader) Draw(img *ebiten.Image) { + op := &ebiten.DrawImageOptions{} + op.ColorScale.Scale(1, 1, 1, f.alpha) + img.DrawImage(f.Curtain, op) +} + +func (f *Fader) IsComplete() bool { + return f.alpha > 1.0 +} + type Bsoft struct { Dimensions groovy.Area events map[groovy.SceneEvent]func() @@ -64,6 +107,7 @@ type Bsoft struct { renderTarget *ebiten.Image mosaicRatio uint countDown uint + curtain Fader } func NewBsoft() Bsoft { @@ -75,9 +119,54 @@ func NewBsoft() Bsoft { } } +func (b *Bsoft) Update() error { + b.increment++ + + var keysPressed []ebiten.Key + keysPressed = inpututil.AppendPressedKeys(keysPressed[:0]) + + for _, k := range keysPressed { + switch k { + case ebiten.KeyUp: + b.mosaicRatio = b.mosaicRatio + 1 + case ebiten.KeyDown: + if b.mosaicRatio > 1 { + b.mosaicRatio = b.mosaicRatio - 1 + } + case ebiten.KeyQ: + if b.events[groovy.COMPLETED] != nil { + b.events[groovy.COMPLETED]() + } + default: + } + + } + + if b.curtain.IsComplete() { + if b.events[groovy.COMPLETED] != nil { + b.events[groovy.COMPLETED]() + } + } + b.curtain.Update() + + return nil +} + func (b *Bsoft) Draw(screen *ebiten.Image) { b.DrawGlitchLogo(screen) b.DrawGlitchLogoText(screen) + b.curtain.Draw(screen) +} + +func (b *Bsoft) SetEventHandler(event groovy.SceneEvent, f func()) { + b.events[event] = f +} + +// sets sene dimensions +func (b *Bsoft) SetDimensions(a groovy.Area) { + b.Dimensions = a + b.renderTarget = ebiten.NewImage(imgDimensions.Width, imgDimensions.Height) + b.curtain = NewFader(a.Width, a.Height, fadeTimer, fadeOffset) } func (b *Bsoft) DrawGlitchLogo(screen *ebiten.Image) { @@ -135,39 +224,3 @@ func getRandomDirection() int { } return 1 } - -func (b *Bsoft) Update() error { - b.increment++ - - var keysPressed []ebiten.Key - keysPressed = inpututil.AppendPressedKeys(keysPressed[:0]) - - for _, k := range keysPressed { - switch k { - case ebiten.KeyUp: - b.mosaicRatio = b.mosaicRatio + 1 - case ebiten.KeyDown: - if b.mosaicRatio > 1 { - b.mosaicRatio = b.mosaicRatio - 1 - } - case ebiten.KeyQ: - if b.events[groovy.COMPLETED] != nil { - b.events[groovy.COMPLETED]() - } - default: - } - - } - - return nil -} - -// sets sene dimensions -func (b *Bsoft) SetDimensions(a groovy.Area) { - b.Dimensions = a - b.renderTarget = ebiten.NewImage(imgDimensions.Width, imgDimensions.Height) -} - -func (b *Bsoft) SetEventHandler(event groovy.SceneEvent, f func()) { - b.events[event] = f -}