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
127
128
129
130
131
132
133
|
CrystalPlayer = Fill:extend{
fill = {255,0,0},
height = 32,
width = 32,
onStartFrame = function(self)
if the.mouse:pressed() then
print('hi')
end
local dx = love.mouse.getX() - the.app.width / 2
local dy = love.mouse.getY() - the.app.height / 2
self.acceleration.x = dx * 10
self.acceleration.y = dy * 10
--print(dx, dy)
love.mouse.setPosition(the.app.width /2, the.app.height/2)
end
}
local velLimit = 400
--local velLimit = 50
SpacePlayer = Tile:extend{
image = 'data/ship.png',
maxVelocity = {x=velLimit,y=velLimit},
minVelocity = {x=-velLimit, y=-velLimit},
lastFired = 0,
money = 2000, -- what to use for money symbol? ✪ or ☥ or Ⓐ?
goods = {},
onNew = function(self)
self.thrust = Tile:new{image = 'data/thrust.png'}
self.shield = Shield:new{ship = self}
end,
onStartFrame = function(self)
--- TAKE 2
local mouseVec = vector.new(
love.mouse.getX() - the.app.width / 2,
love.mouse.getY() - the.app.height / 2
)
self.rotation = math.atan2(mouseVec.y, mouseVec.x)
if mouseVec:len2() > 64^2 then
self.acceleration = vector.new(300, 0)
self.acceleration:rotate_inplace(self.rotation)
self.thrust.visible = true
else
self.acceleration = {x=0, y=0}
self.thrust.visible = false
if DEBUG and the.console.visible then
self.velocity = {x=0, y=0}
end
end
if the.mouse:pressed() and -- assumes left button
love.timer.getTime() - self.lastFired > 0.25 and
the.cursor:inTargetArea() then
--print('pew')
b = Bullet:new{
x = self.x + self.width / 2,
y = self.y + self.height / 2,
rotation = self.rotation
}
self.lastFired = love.timer.getTime()
end
end,
onUpdate = function(self)
self.thrust.x = self.x - self.width
self.thrust.y = self.y
self.thrust.rotation = self.rotation
end,
onEndFrame = function(self)
self:collide(the.rockColliders)
end,
onCollide = function(self, other)
if other:instanceOf(Bullet) then
if self.shield.strength == 0 then
-- die
the.app.view:add( Boom:new {
x = self.x,
y = self.y,
velocity = { rotation = 5 }
})
self:die()
self.thrust:die()
else
self.shield:onHit()
other:die()
the.bullets:remove(other)
end
end
if other:instanceOf(RockCollider) then
the.app.view:add( Boom:new {
x = self.x,
y = self.y,
velocity = { rotation = 5 }
})
self:die()
self.thrust:die()
the.over.visible = true
the.instructions.visible = true
the.app.view:updateScore()
local score = love.timer.getTime() - the.app.view.gameStart
if score > the.storage.data.highScore then
the.storage.data.highScore = score
the.storage:save()
the.highScore.text = string.format(
'High Score: %d:%02d', score / 60, score % 60
)
end
end
end,
buy = function(self, good, price)
if self.money >= price then
self.goods[good] = (self.goods[good] or 0) + 1
self.money = self.money - price
end
end,
sell = function(self, good, price)
if self.goods[good] and self.goods[good] > 0 then
self.goods[good] = self.goods[good] - 1
self.money = self.money + price
end
end
}
|