summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2021-01-20 22:25:54 -0500
committerrealtradam <[email protected]>2021-01-20 22:25:54 -0500
commit178a62eb3b0244f975ec24eb28520d23349e3dfc (patch)
treed4bf34791590bc9150f59a54b752504590571519
parentba1392414af9c18779c386af4f67325c546d9025 (diff)
downloadruby2d-camera-old-178a62eb3b0244f975ec24eb28520d23349e3dfc.tar.gz
ruby2d-camera-old-178a62eb3b0244f975ec24eb28520d23349e3dfc.zip
added camera zoom
-rw-r--r--animator.rb28
-rw-r--r--camera.rb22
-rw-r--r--run.rb43
3 files changed, 81 insertions, 12 deletions
diff --git a/animator.rb b/animator.rb
index c2640f6..9fae771 100644
--- a/animator.rb
+++ b/animator.rb
@@ -16,6 +16,7 @@ class AnimatedSquare
def x= x
@square.x = x
end
+
def y
@square.y
end
@@ -23,18 +24,31 @@ class AnimatedSquare
@square.y = y
end
+ def size
+ @square.size
+ end
+ def size= size
+ @square.size = size
+ end
+
- def update offset
+ def update(offset, zoom)
+ width_zoom_offset = Window.width/2 * (zoom-1)
+ height_zoom_offset = Window.height/2 * (zoom-1)
if @axis == 0
- @square.x += @speed
- if @square.x > (@range[1] - offset[0]) or @square.x < (@range[0] - offset[0])
- @speed = -@speed
+ @square.x += @speed * zoom
+ if @square.x >= ((@range[1] - offset[0]))
+ @speed = -(@speed.abs)
+ elsif @square.x <= ((@range[0] - offset[0]))
+ @speed = @speed.abs
end
else
- @square.y += @speed
- if @square.y > (@range[1] - offset[1]) or @square.y < (@range[0] - offset[1])
- @speed = -@speed
+ @square.y += @speed * zoom
+ if @square.y >= ((@range[1] - offset[1]))
+ @speed = -(@speed.abs)
+ elsif @square.y <= ((@range[0] - offset[1]))
+ @speed = @speed.abs
end
end
end
diff --git a/camera.rb b/camera.rb
index 7e93f7e..be1e3f0 100644
--- a/camera.rb
+++ b/camera.rb
@@ -1,5 +1,23 @@
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
@@ -61,5 +79,9 @@ class Camera
@camera_position = array
end
+ def self.zoom_level= value
+ @zoom_level = value
+ end
+
end
diff --git a/run.rb b/run.rb
index daca24e..e8d6d0f 100644
--- a/run.rb
+++ b/run.rb
@@ -6,6 +6,19 @@ require_relative 'animator'
@player = Image.new('assets/player.png')
@squares = []
+module SizableImage
+ def size
+ self.width
+ end
+ def size= value
+ self.height *= (value / self.width)
+ self.width *= (value / self.width)
+ end
+end
+
[email protected] SizableImage
[email protected] SizableImage
+
# There is 2 ways you can add objects to be known and controlled by the camera, both do the same thing
Camera << @background
Camera.add @player
@@ -32,19 +45,20 @@ end
@cam_x_move = 0
@cam_y_move = 0
@is_follow = true
+@zoom_by = 1
on :key do |event|
if event.key == 'a'
- @x_move -= @speed
+ @x_move -= @speed * Camera.zoom_level
end
if event.key == 'd'
- @x_move += @speed
+ @x_move += @speed * Camera.zoom_level
end
if event.key == 'w'
- @y_move -= @speed
+ @y_move -= @speed * Camera.zoom_level
end
if event.key == 's'
- @y_move += @speed
+ @y_move += @speed * Camera.zoom_level
end
@@ -68,6 +82,19 @@ on :key do |event|
if event.key == 'f'
@is_follow = true
end
+
+end
+
+on :key do |event|
+ if event.key == 'q'
+ @zoom_by = 1.1
+ end
+ if event.key == 'e'
+ @zoom_by = 0.9
+ end
+ if event.key == 'r'
+ Camera.zoom_to 1
+ end
end
update do
@@ -76,9 +103,15 @@ update do
@x_move = 0
@y_move = 0
+ if @zoom_by != 1
+ Camera.zoom_by @zoom_by
+ end
+ @zoom_by = 1
+
# Need to use the cameras position as an offset to keep the shapes range of movement working
+ # Need to make the zoom also give an offset
@squares.each do |square|
- square.update Camera.camera_position
+ square.update(Camera.camera_position,Camera.zoom_level)
end