-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
124 lines (101 loc) · 2.89 KB
/
main.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"log"
"math/rand/v2"
"github.com/greenthepear/egriden"
"github.com/hajimehoshi/ebiten/v2"
)
type Game struct {
egriden.EgridenAssets
}
var gopherPack egriden.SpritePack
func init() {
seq, err := egriden.CreateImageSequenceFromFolder("gopher", "./Graphics/Gopher")
if err != nil {
log.Fatal(seq)
}
gopherPack = egriden.NewSpritePackWithSequence(seq)
}
func (g *Game) Draw(screen *ebiten.Image) {
g.DrawAllGridLayers(screen)
g.DrawAllFreeLayers(screen)
}
func (g *Game) Update() error {
g.RunUpdateScripts()
return nil
}
const scrWidth = 30
const scrHeight = 30
func (g *Game) Layout(_, _ int) (int, int) {
return scrWidth, scrHeight
}
type BouncyGopher struct {
egriden.BaseGobject
goingUp bool
}
func NewBouncyGopher() egriden.Gobject {
o := &BouncyGopher{
BaseGobject: egriden.NewBaseGobject("mr bounce", gopherPack),
goingUp: true,
}
//To be able to access BouncyGopher's fields we use the original
//pointer `o` instead of `self`. We can do this since this function
//returns the Gobject in its entirety, with a unique pointer being
//created at the top. If you're using NewBaseGobject with .Build(),
//use the `self` parameter instead.
o.OnUpdateFunc = func(self egriden.Gobject, l egriden.Layer) {
x, y := o.XY()
if y < 0 || y >= scrHeight-8 {
o.NextFrame()
o.goingUp = !o.goingUp
}
if o.goingUp {
y--
} else {
y++
}
l.(*egriden.FreeLayer).MoveGobjectTo(o, x, y)
}
return o
}
func main() {
g := &Game{}
g.InitEgridenAssets()
gopherGridL := g.CreateGridLayerOnTop(
"gopher grid", 10, 3, 3, egriden.Dense, 0, 0)
shakyGopher := egriden.NewBaseGobject("mr shake", gopherPack)
shakyGopher.OnDrawFunc =
func(self egriden.Gobject, i *ebiten.Image, l egriden.Layer) {
self.SetDrawOffsets(float64(rand.IntN(2)-2), 0)
self.DrawSprite(i, l)
}
spinnyGopher := egriden.NewBaseGobject("mr spin", gopherPack)
spinnyGopher.OnDrawFunc =
func(self egriden.Gobject, i *ebiten.Image, l egriden.Layer) {
//Centered rotation
s := self.Sprite().Bounds().Size()
self.SpritePack().
DrawOptions.GeoM.
Translate(-float64(s.X)/2, -float64(s.Y)/2)
self.SpritePack().
DrawOptions.GeoM.Rotate(0.05)
self.SpritePack().
DrawOptions.GeoM.
Translate(float64(s.X)/2, float64(s.Y)/2)
self.DrawSprite(i, l)
}
gopherGridL.AddGobject(shakyGopher.Build(), 0, 0)
gopherGridL.AddGobject(spinnyGopher.Build(), 0, 1)
gopherGridL.AddGobject(shakyGopher.Build(), 2, 0)
gopherGridL.AddGobject(spinnyGopher.Build(), 1, 0)
gopherGridL.AddGobject(shakyGopher.Build(), 0, 2)
gopherGridL.AddGobject(spinnyGopher.Build(), 1, 2)
gopherGridL.AddGobject(shakyGopher.Build(), 2, 2)
gopherGridL.AddGobject(spinnyGopher.Build(), 2, 1)
bouncyL := g.CreateFreeLayerOnTop("bouncy layer", 0, 0)
bouncyL.AddGobject(NewBouncyGopher(), 10, 12)
ebiten.SetWindowSize(600, 600)
if err := ebiten.RunGame(g); err != nil {
log.Fatal(err)
}
}