summaryrefslogtreecommitdiffhomepage
path: root/camera.rb
blob: be1e3f06ceec97ba555bc72b110b55f9edbb027e (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

class Camera

  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.move_by(Window.width/2 * (zoom-1),Window.height/2 * (zoom-1))
    self.zoom_level *= zoom
  end

  def self.zoom_to zoom
    self.zoom_by(zoom/self.zoom_level)
  end
  
  def self.elasticity
    @elasticity ||= 1
  end

  def self.elasticity= speed
    @elasticity = speed
  end

  def self.follow item
    self.move_to((item.x - (Window.width / 2))/self.elasticity,
                 (item.y - (Window.height / 2))/self.elasticity)
  end

  def self.objects
    @objects ||= []
  end

  def self.<< item
    unless self.objects.include?(item)
      self.objects.push(item)
    end
  end

  def self.add item
    self << item
  end

  def self.remove item
    if self.objects.include?(item)
      self.objects.delete(item)
    end
  end

  
  def self.move_by(x,y)
    self.camera_position[0] += x
    self.camera_position[1] += y
    objects.each do |object|
      object.x -= x
      object.y -= y
    end
  end
  def self.move_to(x,y)
    self.camera_position = [x+camera_position[0],y+camera_position[1]]
    objects.each do |object|
      object.x -= x
      object.y -= y
    end
  end
  
  def self.camera_position
    @camera_position ||= [0,0]
  end

  private

  def self.camera_position= array
    @camera_position = array
  end

  def self.zoom_level= value
    @zoom_level = value
  end

  
end