summaryrefslogtreecommitdiffhomepage
path: root/app/systems/camera.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/systems/camera.rb')
-rw-r--r--app/systems/camera.rb29
1 files changed, 29 insertions, 0 deletions
diff --git a/app/systems/camera.rb b/app/systems/camera.rb
new file mode 100644
index 0000000..db6e3fc
--- /dev/null
+++ b/app/systems/camera.rb
@@ -0,0 +1,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
+)