(local entity (require :lib.entity)) (local vec (require :lib.vec)) (local cell (require :lib.cell)) (local cells (require :lib.cells)) (local bullet (require :lib.bullet)) (fn init [self pos] (setmetatable {entity.position pos entity.velocity {:x 0 :y 0} :target-spin 0 :shot-age 20 :direction 0} self)) (fn steer [self game id controls] (when (> self.shot-age 0) (set self.shot-age (- self.shot-age 1))) ;; TODO: smooth turning (when controls.left (set self.target-spin (- self.target-spin 0.15))) ;; (set self.direction (% (- self.direction 0.1) (* math.pi 2))) (when controls.right (set self.target-spin (+ self.target-spin 0.15))) (set self.direction (% (+ self.direction (* self.target-spin 0.1)) (* math.pi 2))) (set self.target-spin (* self.target-spin 0.9)) (when controls.up (local v (entity.velocity self)) (set v.x (+ v.x (* (math.cos self.direction) 0.02))) (set v.y (+ v.y (* (math.sin self.direction) 0.02))) (when (> (vec.mag v) 0.8) (tset self entity.velocity (vec.mul v (/ 0.8 (vec.mag v)))))) (when (and controls.shoot (= self.shot-age 0)) (set self.shot-age 10) (local v (entity.velocity self)) (table.insert game.entities (entity.init bullet (vec.clone (entity.position self)) {:x (+ v.x (* (math.cos self.direction) 0.6)) :y (+ v.y (* (math.sin self.direction) 0.6))})))) (fn draw [self game id] (love.graphics.setColor 1 1 1) (love.graphics.rotate self.direction) (love.graphics.polygon :fill -0.6 -0.4 0.6 0 -0.6 0.4)) (fn collide [self game id x y] (print "ow!") (tset game.entities id nil) (tset game.grid x y (cell.init cells.boom))) {entity.init init entity.steer steer entity.draw draw entity.collide collide}