-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinvader.go
126 lines (108 loc) · 2.72 KB
/
invader.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
125
126
package main
import (
"github.com/faiface/pixel"
"github.com/faiface/pixel/pixelgl"
)
/*
Invader represents a single alien invader
*/
type Invader struct {
assetManager *AssetManager
window *pixelgl.Window
sprite *pixel.Sprite
color int
pos pixel.Vec
width float64
height float64
leftEdge float64
rightEdge float64
dead bool
}
/*
NewInvader makes a new invader struct. It is initialized with one of
three colors: blue(1), green(2), or red(3).
*/
func NewInvader(window *pixelgl.Window, color int, assetManager *AssetManager) (*Invader, error) {
var sprite *pixel.Sprite
switch color {
case 1:
sprite = assetManager.GetBlueInvaderSprite()
case 2:
sprite = assetManager.GetGreenInvaderSprite()
default:
sprite = assetManager.GetRedInvaderSprite()
}
result := &Invader{
assetManager: assetManager,
window: window,
sprite: sprite,
color: color,
pos: pixel.V(0, 0),
width: sprite.Frame().W(),
height: sprite.Frame().H(),
dead: false,
leftEdge: sprite.Frame().W() / 2,
rightEdge: window.Bounds().W() - (sprite.Frame().W() / 2),
}
return result, nil
}
/*
Draw renders this invader onto the window
*/
func (invader *Invader) Draw() {
if !invader.dead {
invader.sprite.Draw(invader.assetManager.Batch, pixel.IM.Moved(invader.pos))
// invader.sprite.Draw(invader.window, pixel.IM.Moved(invader.pos))
}
}
/*
GetRect returns a bounding rectangle for this invader
*/
func (invader *Invader) GetRect() pixel.Rect {
return pixel.R(invader.pos.X, invader.pos.Y, invader.pos.X+invader.width, invader.pos.Y+invader.height)
}
/*
IsAlive returns true if the invader isn't dead
*/
func (invader *Invader) IsAlive() bool {
return !invader.dead
}
/*
IsLeftEdge returns true if the invader is on the left edge of the window
*/
func (invader *Invader) IsLeftEdge() bool {
return invader.pos.X <= invader.leftEdge
}
/*
IsRightEdge returns true if the invader is on the right edge of the window
*/
func (invader *Invader) IsRightEdge() bool {
return invader.pos.X >= invader.rightEdge
}
/*
Move advances the invader to the left or right. Direction
is either 1 for right, or -1 for left.
*/
func (invader *Invader) Move(direction float64, dt float64) {
move := 140.0 * direction
x := invader.pos.X + (move * dt)
invader.pos.X = pixel.Clamp(x, invader.leftEdge, invader.rightEdge)
}
/*
PushDown moves the invader down a row
*/
func (invader *Invader) PushDown() {
invader.pos.Y -= invader.height
}
/*
Resurrect brings this invader back to life
*/
func (invader *Invader) Resurrect() {
invader.dead = false
}
/*
SetPosition sets the invader's vector
*/
func (invader *Invader) SetPosition(pos pixel.Vec) {
invader.pos = pos
}