/
movies.go
98 lines (87 loc) · 2.2 KB
/
movies.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package movies
import (
"encoding/json"
"fmt"
"github.com/hajimehoshi/ebiten/v2"
"github.com/mevdschee/minesweeper.go/clips"
"github.com/mevdschee/minesweeper.go/scenes"
"github.com/mevdschee/minesweeper.go/sprites"
)
// Movie is a set of scenes
type Movie struct {
currentScene *scenes.Scene
scenes map[string]*scenes.Scene
}
// New creates a new movie
func New() *Movie {
return &Movie{
currentScene: nil,
scenes: map[string]*scenes.Scene{},
}
}
// FromJSON creates a new movie from JSON
func FromJSON(spriteMap sprites.SpriteMap, data string, parameters map[string]interface{}) (*Movie, error) {
sceneJSONs := []scenes.SceneJSON{}
err := json.Unmarshal([]byte(data), &sceneJSONs)
if err != nil {
return nil, err
}
movie := Movie{
currentScene: &scenes.Scene{},
scenes: map[string]*scenes.Scene{},
}
for _, sceneJSON := range sceneJSONs {
scene, err := scenes.FromJSON(spriteMap, sceneJSON, parameters)
if err != nil {
return nil, err
}
movie.Add(scene)
}
return &movie, nil
}
// Add adds a scene to the movie
func (m *Movie) Add(scene *scenes.Scene) {
m.scenes[scene.GetName()] = scene
if len(m.scenes) == 1 {
m.currentScene = scene
}
}
// Draw draws the movie
func (m *Movie) Draw(screen *ebiten.Image) {
if m.currentScene != nil {
m.currentScene.Draw(screen)
}
}
// Update updates the movie
func (m *Movie) Update() (err error) {
if m.currentScene != nil {
err = m.currentScene.Update()
}
return err
}
// GetClip gets a clip from the movie
func (m *Movie) GetClip(scene, layer, clip string) (*clips.Clip, error) {
return m.getClip(scene, layer, clip, 0)
}
// GetClip gets a clip from the movie
func (m *Movie) getClip(scene, layer, clip string, i int) (*clips.Clip, error) {
if s, ok := m.scenes[scene]; ok {
return s.GetClip(layer, clip, i)
}
return nil, fmt.Errorf("GetClip: scene '%s' not found", scene)
}
// GetClips gets a series of clips from the movie
func (m *Movie) GetClips(scene, layer, clip string) ([]*clips.Clip, error) {
clips := []*clips.Clip{}
for i := 0; true; i++ {
c, err := m.getClip(scene, layer, clip, i)
if err != nil {
if i == 0 {
return clips, err
}
break
}
clips = append(clips, c)
}
return clips, nil
}