Last active
November 15, 2018 19:20
-
-
Save JettMonstersGoBoom/a9717c9caf4e7a64bbae3f344fcb6b3a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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