summaryrefslogtreecommitdiff
path: root/Bolvis.lua
blob: 721bc4d5bd5bd63917f478ada775b746575cd135 (plain)
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