Skip to content

Instantly share code, notes, and snippets.

@JettMonstersGoBoom
Last active November 15, 2018 19:20
Show Gist options
  • Save JettMonstersGoBoom/a9717c9caf4e7a64bbae3f344fcb6b3a to your computer and use it in GitHub Desktop.
Save JettMonstersGoBoom/a9717c9caf4e7a64bbae3f344fcb6b3a to your computer and use it in GitHub Desktop.
-- some math stuff for speed
local _atan2=math.atan2
local _sqrt=math.sqrt
local _sin=math.sin
local _cos=math.cos
local _2pi=math.pi * 2
-- 2d vector
local vec2 = {}
setmetatable(vec2, vec2);
vec2.type = vec2
function vec2:__call(x,y)
local d={}
vec2.__index=self
setmetatable(d,self)
d.x=x
d.y=y
return d
end
-- calc angle between two vec2's
function vec2:angTo(a)
return (_atan2(a.x-self.x,a.y-self.y))
end
-- printable vec2
function vec2:__tostring()
return string.format("(%f %f)",self.x,self.y)
end
-- make sure length is <1
function vec2:normalize()
local w = _sqrt( self.x * self.x + self.y * self.y )
self.x = self.x / w
self.y = self.y / w
end
function vec2:dist(b)
local dx = self.x - b.x
local dy = self.y - b.y
local s = dx * dx + dy * dy
return _sqrt(s)
end
-- lerp between 2 angles
function angleLerp(a0,a1,t)
da = (a1 - a0) % _2pi
det = 2*da % _2pi - da
return a0 + det*t
end
-- simple bullet
local bullets = {}
local bullet = {}
setmetatable(bullet, bullet)
bullet.type = bullet
function bullet:__call(x,y)
local b={}
bullet.__index=self
setmetatable(b,self)
b.pos = vec2(x,y)
b.angle = math.random(0,360)
b.speed = math.random(1,5)/5
b.turnspeed=math.random(1,50)/1000
table.insert(bullets,b)
return b
end
-- the logic part
function bullet:think()
if (self.pos:dist(posb)<15) then
return false
end
-- print(string.format("%0.2f",self.pos:dist(posb)),self.pos.x,self.pos.y,4)
self.aim_angle = self.pos:angTo(posb)
self.pos.x=self.pos.x + _sin(b.angle)*self.speed
self.pos.y=self.pos.y + _cos(b.angle)*self.speed
self.angle=angleLerp(b.angle,self.aim_angle,self.turnspeed)
return true
end
-- drawing
function bullet:draw()
circb(b.pos.x,b.pos.y,4,14)
line(b.pos.x,b.pos.y,
b.pos.x+_sin(b.aim_angle)*15,
b.pos.y+_cos(b.aim_angle)*15,
6)
line(b.pos.x,b.pos.y,
b.pos.x+_sin(b.angle)*15,
b.pos.y+_cos(b.angle)*15,
8)
end
posa=vec2(32,32)
posb=vec2(64,64)
function TIC()
cls(0)
posa.x,posa.y,b = mouse()
if b~=lb then
bullet(posa.x,posa.y)
lb=b
end
for i=#bullets,1,-1 do
b=bullets[i]
if (b:think()==false) then
table.remove(bullets,i)
end
b:draw()
end
-- draw the "hero" mouse
circ(posa.x,posa.y,4,14)
-- draw the target
circb(posb.x,posb.y,15,2)
posb.x=120+_sin(time()/1000)*120
posb.y=68+_cos(time()/1200)*68
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment