An update of the little game I put together for Zoyt’s competition. Now with scoring, new system designs, minor tweaks, and even more obnoxious sounds.
Only I want to do a comment It is on something that already and I dress in several code: where you put: bestscore = readlocaldata (“high”) if bestscore == nil then bestscore = 0 end meiby to be simply: bestscore = readlocaldata(“high”,0)
Ship = class()
function Ship:init(r, d)
self.radius = r
self.deg = d
self.planet = 0
self.landed = false
self.x = 0
self.y = 0
self.dd = 100 / r * -1
self.fire = false
self.exploded = false
self.exptimer = 1
self.fuel = 1000
end
function Ship:land(p)
self.radius = p.radius + p.size / 2
self.deg = p.deg + 2
self.landed = true
end
function Ship:draw()
local r, tx, ty, i
-- the further from the center, the slower it goes
self.deg = self.deg + self.dd
if self.deg > 360 then
self.deg = self.deg - 360
end
r = math.rad(self.deg)
tx = (self.radius * scale) * math.cos(r) + WIDTH / 2
ty = (self.radius * scale) * math.sin(r) + HEIGHT / 2
self.x = tx
self.y = ty
stroke(235, 235, 234, 255)
pushMatrix()
translate(self.x, self.y)
rotate(self.deg - 90)
if not self.exploded then
line(0, 0, 5, 15)
line(5, 15, 10, 0)
line(10, 0, 0, 0)
if self.fire then
sound(SOUND_SHOOT, 29097)
stroke(223, 148, 161, 255)
line(2, 0, 5, -5)
line(8, 0, 5, -5)
line(5, 0, 5, -11)
self.radius = self.radius + 1
self.dd = 100 / self.radius * -1
self.landed = false
else
if self.landed == false then
self.radius = self.radius - 100 / self.radius
if self.radius < 0 then
self.radius = 0
end
self.dd = 100 / self.radius * -1
end
end
else
if self.exptimer < 100 then
self.exptimer = self.exptimer + 1
line(self.exptimer, 0, self.exptimer, 0)
line(0, self.exptimer, 0, self.exptimer)
line(-self.exptimer, -self.exptimer,
self.exptimer, self.exptimer)
line(-self.exptimer, self.exptimer,
self.exptimer, -self.exptimer)
end
end
popMatrix()
pushMatrix()
translate(WIDTH - 50, 0)
local y
y = (HEIGHT - 100) / 1000
stroke(0, 216, 255, 255)
if self.fuel < 200 then
stroke(255, 26, 0, 255)
end
strokeWidth(2)
line(20, 50, 20, 50 + y * self.fuel)
fontSize(14)
fill(0, 250, 255, 255)
text("Fuel", 20, 40)
popMatrix()
end
Orbiter = class()
function Orbiter:init(r, d, s)
-- set initial location
self.radius = r
self.deg = d
self.size = s
self.x = 0
self.y = 0
self.dd = 100 / r * -1
self.clr = color(255, 255, 255, 255)
self.tagged = false
self.scale = 1
end
function Orbiter:draw()
local r, x, y
noFill()
stroke(self.clr)
strokeWidth(2)
-- the further from the center, the slower it goes
self.deg = self.deg + self.dd
if self.deg > 360 then
self.deg = self.deg - 360
end
r = math.rad(self.deg)
self.x = (self.radius * scale) * math.cos(r) + WIDTH / 2
self.y = (self.radius * scale) * math.sin(r) + HEIGHT / 2
pushMatrix()
translate(self.x, self.y)
rotate(self.deg - 90)
ellipse(0, 0, self.size)
x = self.size / 2
if self.tagged then
line(-x, 0, x, 0)
line(0, -x, 0, x)
end
popMatrix()
end
function Orbiter:land(x, y)
if math.abs(self.x - x) < self.size / 2 + 10 and
math.abs(self.y - y) < self.size / 2 + 10 then
return true
else
return false
end
end
I created a blank file and named it Misc just because I needed to pull out this one function to make the Main file fit into a single comment. You can put this function into a file, or toss it back in main following setup.
function newSystem()
local i
fadetimer = 255
if system == 1 then
planets = {}
rocks = {}
planets[1] = Orbiter(75, 0, 20)
planets[1].clr = color(222, 222, 222, 255)
planets[2] = Orbiter(150, 0, 30)
planets[2].clr = color(231, 230, 84, 255)
planets[3] = Orbiter(220, 0, 30)
planets[3].clr = color(134, 196, 224, 255)
for i = 1, 36 do
rocks[i] = Orbiter(320, i * 10, 6)
rocks[i].clr = color(255, 0, 14, 255)
rocks[i].tagged = true
end
ship = Ship(planets[1].radius, 0)
ship.fuel = 600
elseif system == 2 then
planets = {}
rocks = {}
planets[1] = Orbiter(80, 0, 22)
planets[1].clr = color(166, 255, 0, 255)
planets[2] = Orbiter(150, 0, 35)
planets[2].clr = color(0, 237, 255, 255)
planets[3] = Orbiter(322, 0, 40)
planets[3].clr = color(255, 0, 222, 255)
for i = 1, 36 do
rocks[i] = Orbiter(200 + i * 10, i * 10, 6)
rocks[i].clr = color(255, 0, 14, 255)
rocks[i].tagged = true
end
ship = Ship(planets[2].radius, 0)
ship.fuel = 500
elseif system == 3 then
planets = {}
rocks = {}
planets[1] = Orbiter(80, 0, 22)
planets[1].clr = color(255, 0, 75, 255)
planets[2] = Orbiter(80, 90, 22)
planets[2].clr = color(0, 237, 255, 255)
planets[3] = Orbiter(80, 180, 22)
planets[3].clr = color(255, 0, 222, 255)
planets[4] = Orbiter(80, 270, 22)
planets[4].clr = color(103, 133, 29, 255)
for i = 1, 12 do
rocks[i] = Orbiter(150, i * 30, 6)
rocks[i].clr = color(255, 0, 14, 255)
rocks[i].tagged = true
end
planets[5] = Orbiter(220, 0, 44)
planets[5].clr = color(103, 133, 29, 255)
for i = 1, 12 do
rocks[i + 12] = Orbiter(300, i * 30, 6)
rocks[i + 12].clr = color(255, 0, 14, 255)
rocks[i + 12].tagged = true
end
planets[6] = Orbiter(350, 0, 36)
planets[6].clr = color(206, 0, 255, 255)
ship = Ship(planets[1].radius, 0)
ship.fuel = 800
elseif system == 4 then
planets = {}
rocks = {}
planets[1] = Orbiter(100, 0, 22)
planets[1].clr = color(227, 229, 223, 255)
planets[2] = Orbiter(150, 0, 35)
planets[2].clr = color(0, 237, 255, 255)
planets[3] = Orbiter(290, 0, 20)
planets[3].clr = color(255, 0, 222, 255)
planets[4] = Orbiter(340, 0, 20)
planets[4].clr = color(0, 255, 2, 255)
for i = 1, 36 do
rocks[i] = Orbiter(200 + math.random(50), i * 10, 6)
rocks[i].clr = color(255, 0, 14, 255)
rocks[i].tagged = true
end
ship = Ship(planets[4].radius, 0)
ship.fuel = 400
elseif system == 5 then
planets = {}
rocks = {}
planets[1] = Orbiter(35, 0, 15)
planets[1].clr = color(224, 226, 221, 255)
planets[2] = Orbiter(75, 0, 25)
planets[2].clr = color(180, 225, 90, 255)
planets[3] = Orbiter(125, 0, 25)
planets[3].clr = color(0, 236, 255, 255)
planets[4] = Orbiter(200, 0, 20)
planets[4].clr = color(255, 145, 0, 255)
for i = 1, 36 do
rocks[i] = Orbiter(260 + math.random(35), i * 10, 6)
rocks[i].clr = color(255, 0, 14, 255)
rocks[i].tagged = true
end
planets[5] = Orbiter(340, 0, 50)
planets[5].clr = color(176, 0, 255, 255)
ship = Ship(planets[4].radius, 0)
ship.fuel = 600
else
-- random system
numplanets = math.random(5) + 1
planets = {}
for i = 1, numplanets do
planets[i] = Orbiter(i * 75, math.random(360),
math.random(25) + 10)
planets[i].clr = color(155 + math.random(100),
155 + math.random(100), 155 + math.random(100), 255)
end
rocks = {}
--ring 1
numrocks = math.random(30) + 1
for i = 1, numrocks do
rocks[i] = Orbiter( 190 + math.random(30),
math.random(360), 6)
rocks[i].clr = color(255, 0, 14, 255)
rocks[i].tagged = true
end
ship = Ship(planets[numplanets].radius,
planets[numplanets].deg)
ship.fuel = 600
end
end
And here’s Main.
-- Orb-Bits
-- =======================
-- Version 1.1
-- Mark Sumner
-- =======================
function setup()
displayMode(FULLSCREEN)
x = 100
y = 100
system = 1
scale = 1
deg = 270
ship = Ship(111,111)
score = 0
newSystem()
soundtimer = 0
fadetimer = 255
gameon = true
bestscore = readLocalData("high")
if bestscore == nil then bestscore = 0 end
end
function draw()
local i
background(0, 0, 0)
noSmooth()
stroke(246, 255, 0, 255)
pushMatrix()
translate(WIDTH/2, HEIGHT/2)
i = math.random(10) + 15
line(-i, 0, i, 0)
line(0, -i, 0, i)
line(-i, -i, i, i)
line(-i, i, i, -i)
popMatrix()
font("Copperplate-Bold")
fontSize(48)
if fadetimer > 0 then
fill(179, 160, 160, fadetimer)
text("System "..system, WIDTH / 2, HEIGHT / 2+50)
end
fill(116, 206, 226, 255)
fontSize(24)
text(score, 100, HEIGHT-24)
text(bestscore, WIDTH - 100, HEIGHT-24)
alltagged = true
for i, p in ipairs(planets) do
p:draw()
if ship.fire == false and p:land(ship.x, ship.y) then
if not p.tagged then
score = score + system * 100
sound(SOUND_HIT, 19317)
end
ship:land(p)
p.tagged = true
if ElapsedTime > soundtimer + 1 then
sound(SOUND_BLIT, p.radius)
soundtimer = ElapsedTime
end
end
if not p.tagged then
alltagged = false
end
end
for i, r in ipairs(rocks) do
r:draw()
if r:land(ship.x, ship.y) and not ship.exploded then
sound(SOUND_EXPLODE, 27961)
ship.exploded = true
ship.exptimer = 1
end
end
if CurrentTouch.state == BEGAN or CurrentTouch.state == MOVING then
if gameon then
if not ship.exploded then
if ship.fuel > 0 then
ship.fire = true
ship.fuel = ship.fuel - 1
end
end
else
if score > bestscore then
saveLocalData("high", score)
bestscore = score
end
gameon = true
ship = Ship(1000,1)
scale = 1
system = 1
score = 0
newSystem()
end
else
ship.fire = false
end
ship:draw()
if alltagged then
scale = scale + 0.1
if scale > 8 then
system = system + 1
score = score + ship.fuel
newSystem()
end
else
if scale > 1 then
scale = scale - 0.1
end
end
if ship.radius < 10 then
if scale > 0 then
sound(DATA, "ZgJAQgBFETsPLjNnGVWbO2JQWT8Y"..
"mL++QwA4ZEF+PxYvbRph")
scale = scale - 0.1
else
gameon = false
end
end
if ship.exploded and ship.exptimer > 20 then
gameon = false
end
if not gameon then
font("Copperplate-Bold")
fill(252, 252, 252, 255)
fontSize(48)
text("Game Over", WIDTH / 2, HEIGHT / 2 - 50)
end
fadetimer = fadetimer - 1
end