// Copyright 2014 Hajime Hoshi // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package blocks import ( "github.com/hajimehoshi/ebiten" ) var ( transitionFrom *ebiten.Image transitionTo *ebiten.Image ) func init() { transitionFrom, _ = ebiten.NewImage(ScreenWidth, ScreenHeight, ebiten.FilterDefault) transitionTo, _ = ebiten.NewImage(ScreenWidth, ScreenHeight, ebiten.FilterDefault) } type Scene interface { Update(state *GameState) error Draw(screen *ebiten.Image) } const transitionMaxCount = 20 type SceneManager struct { current Scene next Scene transitionCount int } type GameState struct { SceneManager *SceneManager Input *Input } func (s *SceneManager) Update(input *Input) error { if s.transitionCount == 0 { return s.current.Update(&GameState{ SceneManager: s, Input: input, }) } s.transitionCount-- if s.transitionCount > 0 { return nil } s.current = s.next s.next = nil return nil } func (s *SceneManager) Draw(r *ebiten.Image) { if s.transitionCount == 0 { s.current.Draw(r) return } transitionFrom.Clear() s.current.Draw(transitionFrom) transitionTo.Clear() s.next.Draw(transitionTo) r.DrawImage(transitionFrom, nil) alpha := 1 - float64(s.transitionCount)/float64(transitionMaxCount) op := &ebiten.DrawImageOptions{} op.ColorM.Scale(1, 1, 1, alpha) r.DrawImage(transitionTo, op) } func (s *SceneManager) GoTo(scene Scene) { if s.current == nil { s.current = scene } else { s.next = scene s.transitionCount = transitionMaxCount } }