1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
local game = require 'game'
local physics = require 'physics'
local Camera = require 'Camera'
local Bolvis = physics.Object:extend()
Bolvis.sprite_unblink = love.graphics.newImage("bolvis.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_unblink
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)
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_unblink
self.blink = math.random(30, 256)
elseif self.sprite == self.sprite_unblink then
self.sprite = self.sprite_blink
self.blink = 4
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
end
local function clamp(n, max, min)
return math.max(math.min(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]
else
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)
return x - bx, y - by
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
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
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()}
end
end
function Hand:draw()
local x1, y1 = unpack(self.bolvis.pos)
local x2, y2 = unpack(self.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
|