-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanimation.go
89 lines (75 loc) · 2.33 KB
/
animation.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
package main
import (
"github.com/hajimehoshi/ebiten"
)
var (
idAnimation = 0
)
// AnimationState is a type for the current state of an animation
type AnimationState int
const (
// AnimationPlayingForwards ... ANIMATIONSTATE ENUM [1]
AnimationPlayingForwards AnimationState = iota + 1
// AnimationStopped ... ANIMATIONSTATE ENUM [2]
AnimationStopped
// AnimationPlayingBackwards ... ANIMATIONSTATE ENUM [3]
AnimationPlayingBackwards
)
func (a AnimationState) String() string {
return [...]string{"Unknown", "AnimationPlayingForwards", "AnimationStopped", "AnimationPlayingBackwards"}[a]
}
// ^ MOVEMENT ENUM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Animation a system for animating an image using Ebiten subsets
type Animation struct {
spritesheet Spritesheet
currentFrame int
timer float64
maxTimer float64
id int // For checking if an animation equals another
state AnimationState // If the animation is currently playing
finishedFirstPlay bool // Whether or not the animation played one time at least
}
func createAnimation(spritesheet Spritesheet, image *ebiten.Image) Animation {
idAnimation++
return Animation{
spritesheet: spritesheet,
currentFrame: 0, // currentFrame
timer: 0, // timer
maxTimer: 10, // maxTimer
id: idAnimation, // Animation ID
state: AnimationPlayingForwards,
finishedFirstPlay: false,
}
}
func (a *Animation) startForwards() {
a.state = AnimationPlayingForwards
}
func (a *Animation) startBackwards() {
a.state = AnimationPlayingBackwards
a.currentFrame = a.spritesheet.numberOfSprites - 1 // Set to end!
}
func (a *Animation) update(speed float64) {
if a.timer >= a.maxTimer {
a.timer = 0
switch a.state {
case AnimationPlayingForwards: // Forwards
a.currentFrame++
if a.currentFrame == a.spritesheet.numberOfSprites {
// Reached the end!
a.finishedFirstPlay = true
a.currentFrame = 0
}
case AnimationPlayingBackwards: // Backwards
a.currentFrame--
if a.currentFrame == -1 {
a.finishedFirstPlay = true
a.currentFrame = a.spritesheet.numberOfSprites - 1 // Set to end again!
}
}
} else {
a.timer += 1 * speed
}
}
func (a *Animation) pause() {
a.state = AnimationStopped
}