summaryrefslogtreecommitdiffhomepage
path: root/app/systems/camera.rb
blob: db6e3fc40b9957712a6fda00a1be587849f29002 (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
FF::Scn::Render.add(
  # Update the position of the sprite according
  # to camera values before the sprite is rendered
  FF::Sys.new('Camera', priority: 97) do
    camera = FF::Cmp::SingletonCamera[0]
    camera.entities.each do |ent|
      sprite = ent.components[FF::Cmp::Sprite][0].props

      angle = camera.angle * (Math::PI / 180)
      half_width = $gtk.args.grid.w * 0.5
      half_height = $gtk.args.grid.h * 0.5
      offset_x = sprite[:x] + (sprite[:w] / 2)
      offset_y = sprite[:y] + (sprite[:h] / 2)
      temp_x = (((offset_x - camera.x) * Math.cos(angle)) - ((offset_y - camera.y) * Math.sin(angle))) \
        * camera.zoom + half_width - (sprite[:w] * camera.zoom / 2)
      temp_y = (((offset_x - camera.x) * Math.sin(angle)) + ((offset_y - camera.y) * Math.cos(angle))) \
        * camera.zoom + half_height - (sprite[:h] * camera.zoom / 2)
      temp_rotate = sprite[:angle] + camera.angle
      temp_width = sprite[:w] * camera.zoom
      temp_height = sprite[:h] * camera.zoom

      sprite[:x] = temp_x
      sprite[:y] = temp_y
      sprite[:w] = temp_width
      sprite[:h] = temp_height
      sprite[:angle] = temp_rotate
    end
  end
)