blob: 1ccea91863d6b3d822abf9b5e0a383fdf3cfe224 (
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
|
# frozen_string_literal: true
# Simulates a moving camera by manipulating objects it knows
class Camera
class <<self
attr_writer :elasticity
private
attr_writer :camera_position, :zoom_level
end
def self.elasticity
@elasticity ||= 1
end
def self.camera_position
@camera_position ||= [0, 0]
end
def self.zoom_level
@zoom_level ||= 1
end
def self.zoom_by(zoom)
objects.each do |object|
object.size *= zoom
object.x *= zoom
object.y *= zoom
end
self.zoom_level *= zoom
move_by(Window.width / 2 * (zoom - 1),
Window.height / 2 * (zoom - 1))
end
def self.zoom_to(zoom)
zoom_by(zoom / self.zoom_level)
end
def self.follow(item)
move_to(((item.x + item.size / 2) - (Window.width / 2)) / elasticity,
((item.y + item.size / 2) - (Window.height / 2)) / elasticity)
end
def self.objects
@objects ||= []
end
def self.<<(item)
objects.push(item) unless objects.include?(item)
end
def self.add(item)
self << item
end
def self.remove(item)
objects.delete(item) if objects.include?(item)
end
def self.move_by(x, y)
camera_position[0] += x / zoom_level
camera_position[1] += y / zoom_level
objects.each do |object|
object.x -= x
object.y -= y
end
end
def self.move_to(x, y)
self.camera_position = [x / zoom_level + camera_position[0],
y / zoom_level + camera_position[1]]
objects.each do |object|
object.x -= x
object.y -= y
end
end
end
|