diff options
Diffstat (limited to 'Bolvis.lua')
-rw-r--r-- | Bolvis.lua | 218 |
1 files changed, 103 insertions, 115 deletions
@@ -1,83 +1,64 @@ -local game = require 'game' -local physics = require 'physics' +local component = require 'component' +local Drawable = require 'Drawable' +local Input = require 'Input' +local Sprite = require 'Sprite' +local Transform = require 'Transform' local Camera = require 'Camera' -local Bolvis = physics.Object:extend() -Bolvis.sprite_center = love.graphics.newImage("bolvis.png", {dpiscale = 5}) -Bolvis.sprite_left = love.graphics.newImage("bolvis-left.png", {dpiscale = 5}) -Bolvis.sprite_right = love.graphics.newImage("bolvis-right.png", {dpiscale = 5}) -Bolvis.sprite_blink = love.graphics.newImage("bolvis-blink.png", {dpiscale = 5}) -Bolvis.z = 50 - -local Hand = physics.Object:extend() -Hand.sprite_open = love.graphics.newImage("hand-open.png", {dpiscale = 3.5}) -Hand.sprite_closed = love.graphics.newImage("hand-closed.png", {dpiscale = 3.5}) -Hand.max_speed = 10 -Hand.z = 49 - -function Bolvis:new(pos, rotation) - self.sprite = self.sprite_center - self.blink = 10 - - physics.Object.new(self, pos, rotation, nil, 'dynamic') - self.shape = love.physics.newRectangleShape(90, 90) - self.fixture = love.physics.newFixture(self.body, self.shape) - self.fixture:setRestitution(0.2) - self.fixture:setDensity(20) - self.hand = Hand(self) - self.camera = Camera() - self.camera:follow(self) +local Bolvis = component( + {Drawable, {z = 50}}, + {Input}, + {Sprite, {name = "bolvis"}} +) + +local Hand = component( + {Drawable, {z = 49}}, + {Input}, + {Sprite, {name = "hand", z = 1}} +) + +function Bolvis:init(inst) + inst.hand = self.obj.world:object(Hand {bolvis = self.obj}) + inst.camera = self.obj.world:object(Camera {following = self.obj}) + inst.blink = 10 end function Bolvis:update(dt) - self.body:setAngle(0) - physics.Object.update(self, dt) - - self.blink = self.blink - (dt * 30) - if self.blink <= 0 then - if self.sprite == self.sprite_blink then - self.sprite = self.sprite_center - self.blink = math.random(30, 256) + local sprite = self.obj:get(Sprite) + self.i.blink = self.i.blink - (dt * 30) + if self.i.blink <= 0 then + if sprite.i.state == "blink" then + sprite.i.state = "bolvis" + self.i.blink = math.random(30, 256) else - self.sprite = self.sprite_blink - self.blink = 4 - end - end - if self.sprite ~= self.sprite_blink then - if self.hand.grab_joint then - local offsx = self.hand:present_offset() - if offsx > 150 then - self.sprite = self.sprite_right - elseif offsx < -150 then - self.sprite = self.sprite_left - else - self.sprite = self.sprite_center - end - elseif self.sprite ~= self.sprite_center then - if math.random(1, 4) == 1 then - self.sprite = self.sprite_blink - self.blink = 4 - else - self.sprite = self.sprite_center - end + sprite.i.state = "blink" + self.i.blink = 4 end end +-- if self.sprite ~= self.sprite_blink then +-- if self.hand.grab_joint then +-- local offsx = self.hand:present_offset() +-- if offsx > 150 then +-- self.sprite = self.sprite_right +-- elseif offsx < -150 then +-- self.sprite = self.sprite_left +-- else +-- self.sprite = self.sprite_center +-- end +-- elseif self.sprite ~= self.sprite_center then +-- if math.random(1, 4) == 1 then +-- self.sprite = self.sprite_blink +-- self.blink = 4 +-- else +-- self.sprite = self.sprite_center +-- end +-- end +-- end end -function Hand:new(bolvis) - physics.Object.new(self) - self.offset = {100, -100} - self.bolvis = bolvis - self.sprite = self.sprite_open -end - -function Hand:angle() - local x, y = unpack(self.pos) - local bx, by = unpack(self.bolvis.pos) - local ox, oy = x - bx, y - by - local a = math.atan(oy / math.abs(ox)) + math.pi / 2 - if ox < 0 then a = -a end - return a +function Hand:init(inst) + assert(inst.bolvis) + inst.offset = {100, -100} end local function clamp(n, max, min) @@ -85,77 +66,84 @@ local function clamp(n, max, min) end function Hand:update() - self.rot = self:angle() - if not self.grab_joint then - self.pos[1] = self.bolvis.pos[1] + self.offset[1] - self.pos[2] = self.bolvis.pos[2] + self.offset[2] + local this = self.obj:get(Transform) + local bolvis = self.i.bolvis:get(Transform) + this.i.angle = self:angle() + if not self.i.grab then + this.i.pos[1] = bolvis.i.pos[1] + self.i.offset[1] + this.i.pos[2] = bolvis.i.pos[2] + self.i.offset[2] else - self.pos = {self.grabbed.body:getWorldPoint(unpack(self.grab_pos))} + -- self.pos = {self.grabbed.body:getWorldPoint(unpack(self.grab_pos))} end end function Hand:present_offset() - local x, y = unpack(self.pos) - local bx, by = unpack(self.bolvis.pos) + local x, y = unpack(self.obj:get(Transform).i.pos) + local bx, by = unpack(self.i.bolvis:get(Transform).i.pos) return x - bx, y - by end +function Hand:angle() + local ox, oy = self:present_offset() + local a = math.atan(oy / math.abs(ox)) + math.pi / 2 + if ox < 0 then a = -a end + return a +end + + function Hand:mousemoved(_, _, dx, dy) - dx = clamp(dx, self.max_speed, -self.max_speed) - dy = clamp(dy, self.max_speed, -self.max_speed) - self.offset[1] = clamp(self.offset[1] + dx, 1920 / 2, -1920 / 2) - self.offset[2] = clamp(self.offset[2] + dy, 1080 / 2, -1080 / 2) - if self.grab_joint then - local x, y = unpack(self.offset) - self.grab_joint:setLinearOffset(x + self.grab_pos[1], y + self.grab_pos[2]) - end + self.i.offset[1] = clamp(self.i.offset[1] + dx, 1920 / 2, -1920 / 2) + self.i.offset[2] = clamp(self.i.offset[2] + dy, 1080 / 2, -1080 / 2) + --if self.grab_joint then + -- local x, y = unpack(self.offset) + -- self.grab_joint:setLinearOffset(x + self.grab_pos[1], y + self.grab_pos[2]) + --end end function Hand:mousepressed(_, _, button) if button == 1 then - self.sprite = self.sprite_closed - local grabbed - for o in pairs(game.all_objects) do - if o.fixture then - if o.fixture:testPoint(unpack(self.pos)) then - if o ~= self.bolvis then - self.grabbed = o - break - end - end - end - end - if self.grabbed then - local x1, y1 = unpack(self.bolvis.pos) - local x2, y2 = unpack(self.bolvis.pos) - self.grab_joint = love.physics.newMotorJoint( - self.bolvis.body, self.grabbed.body, 0.5, true) - self.grab_joint:setMaxForce(500) - self.grab_pos = {self.grabbed.body:getLocalPoint(unpack(self.pos))} - end + self.obj:get(Sprite).i.state = "closed" +-- local grabbed +-- for o in pairs(game.all_objects) do +-- if o.fixture then +-- if o.fixture:testPoint(unpack(self.pos)) then +-- if o ~= self.bolvis then +-- self.grabbed = o +-- break +-- end +-- end +-- end +-- end +-- if self.grabbed then +-- local x1, y1 = unpack(self.bolvis.pos) +-- local x2, y2 = unpack(self.bolvis.pos) +-- self.grab_joint = love.physics.newMotorJoint( +-- self.bolvis.body, self.grabbed.body, 0.5, true) +-- self.grab_joint:setMaxForce(500) +-- self.grab_pos = {self.grabbed.body:getLocalPoint(unpack(self.pos))} +-- end end end function Hand:mousereleased(_, _, button) if button == 1 then - self.sprite = self.sprite_open - if self.grab_joint then - self.grabbed = nil - self.grab_joint:destroy() - self.grab_joint = nil - end - self.offset = {self:present_offset()} + self.obj:get(Sprite).i.state = "hand" +-- if self.grab_joint then +-- self.grabbed = nil +-- self.grab_joint:destroy() +-- self.grab_joint = nil +-- end +-- self.offset = {self:present_offset()} end end function Hand:draw() - local x1, y1 = unpack(self.bolvis.pos) - local x2, y2 = unpack(self.pos) + local x1, y1 = unpack(self.i.bolvis[Transform].i.pos) + local x2, y2 = unpack(self.obj[Transform].i.pos) love.graphics.setColor(0.73, 0.76, 0.91) love.graphics.setLineWidth(15) love.graphics.line(x1, y1, x2, y2) love.graphics.setColor(1, 1, 1) - game.Object.draw(self) end return Bolvis |