-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmystery.go
79 lines (66 loc) · 1.49 KB
/
mystery.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
package main
import (
"math/rand"
"time"
"github.com/Bredgren/geo"
"github.com/hajimehoshi/ebiten"
)
const (
MysterySpeed = 50
MysteryY = 40
)
var (
mystery Mystery
MysteryPoints = [...]int{50, 100, 150, 300}
)
type Mystery struct {
Rect geo.Rect
Img *ebiten.Image
Opts *ebiten.DrawImageOptions
nextGoTime time.Duration
getNextTime geo.NumGen
}
func (m *Mystery) init() {
m.Img = openImg("img/mystery.png")
m.Opts = &ebiten.DrawImageOptions{}
m.Opts.ColorM.Scale(1.0, 0.0, 0.0, 1.0)
size := geo.VecXYi(m.Img.Size())
m.Rect = geo.RectWH(size.XY())
m.getNextTime = geo.RandNum(20, 60)
}
func (m *Mystery) resetLevel(level int) {
m.hide()
m.nextGoTime = 5 * time.Second
}
func (m *Mystery) update(dt time.Duration) {
m.nextGoTime -= dt
if !m.isGoing() && m.nextGoTime < 0 {
m.Rect.X = Width + 50
m.nextGoTime = time.Duration(int(m.getNextTime())) * time.Second
}
if !m.isGoing() {
return
}
newX := m.Rect.Left() - MysterySpeed*dt.Seconds()
m.Rect.SetLeft(newX)
}
func (m *Mystery) draw(dst *ebiten.Image) {
m.Opts.GeoM.Reset()
m.Opts.GeoM.Translate(m.Rect.TopLeft())
dst.DrawImage(m.Img, m.Opts)
}
func (m *Mystery) collidePlayerBullet(b *PlayerBullet) {
if !m.Rect.CollideRect(b.Rect) {
return
}
m.hide()
b.hitSomething()
m.nextGoTime = 5 * time.Second
score += MysteryPoints[rand.Intn(len(MysteryPoints))]
}
func (m *Mystery) isGoing() bool {
return m.Rect.X > -50
}
func (m *Mystery) hide() {
m.Rect.SetTopLeft(-100, MysteryY)
}