summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2021-01-26 01:01:48 -0500
committerrealtradam <[email protected]>2021-01-26 01:01:48 -0500
commitf0d46fb2f12a8da8425330779863884d2bff79db (patch)
tree5499d157037fd6c5958c2a12b9f1377bbc9d5c8f
parentc1476cb451e93a54df8521ad5572732539f345dd (diff)
downloadruby2d-camera-f0d46fb2f12a8da8425330779863884d2bff79db.tar.gz
ruby2d-camera-f0d46fb2f12a8da8425330779863884d2bff79db.zip
added proper working rotation
-rw-r--r--quad_camera_tracker.rb41
-rw-r--r--run.rb5
2 files changed, 35 insertions, 11 deletions
diff --git a/quad_camera_tracker.rb b/quad_camera_tracker.rb
index d0bcd21..16473b8 100644
--- a/quad_camera_tracker.rb
+++ b/quad_camera_tracker.rb
@@ -35,9 +35,8 @@ module QuadCameraTracker
def height
[@y1, @y2, @y3, @y4].max - [@y1, @y2, @y3, @y4].min
end
-
def x
- @x ||= 0
+ @x ||= @x1 / Camera.zoom_level + Camera.camera_position[0]
end
def x=(x)
@@ -50,7 +49,7 @@ module QuadCameraTracker
end
def y
- @y ||= 0
+ @y ||= @y1 / Camera.zoom_level + Camera.camera_position[1]
end
def y=(y)
@@ -159,15 +158,41 @@ module QuadCameraTracker
# apply rotation/translation/zoom then pass to super
end
+ attr_writer :rotation_degrees
+
def rotation_degrees
@rotation_degrees ||= 0
end
- def rotate_degrees_by(degrees)
- # offset rotation to shape
- end
+ def rotate(x_pivot, y_pivot, angle)
+ self.rotation_degrees += angle
+ self.rotation_degrees %= 360
+ @angle = (Math::PI * angle) / 180
+ x_shifted1 = self.x1 - x_pivot
+ y_shifted1 = self.y1 - y_pivot
+ x_shifted2 = self.x2 - x_pivot
+ y_shifted2 = self.y2 - y_pivot
+ x_shifted3 = self.x3 - x_pivot
+ y_shifted3 = self.y3 - y_pivot
+ x_shifted4 = self.x4 - x_pivot
+ y_shifted4 = self.y4 - y_pivot
+
+ x1_old = self.x1
+ y1_old = self.y1
+
+ self.x1 = x_pivot + (x_shifted1 * Math.cos(@angle) - y_shifted1 * Math.sin(@angle))
+ self.y1 = y_pivot + (x_shifted1 * Math.sin(@angle) + y_shifted1 * Math.cos(@angle))
+
+ self.x2 = x_pivot + (x_shifted2 * Math.cos(@angle) - y_shifted2 * Math.sin(@angle))
+ self.y2 = y_pivot + (x_shifted2 * Math.sin(@angle) + y_shifted2 * Math.cos(@angle))
+
+ self.x3 = x_pivot + (x_shifted3 * Math.cos(@angle) - y_shifted3 * Math.sin(@angle))
+ self.y3 = y_pivot + (x_shifted3 * Math.sin(@angle) + y_shifted3 * Math.cos(@angle))
+
+ self.x4 = x_pivot + (x_shifted4 * Math.cos(@angle) - y_shifted4 * Math.sin(@angle))
+ self.y4 = y_pivot + (x_shifted4 * Math.sin(@angle) + y_shifted4 * Math.cos(@angle))
- def rotate_degree_to(degrees)
- # set rotation
+ @x += -x1_old + self.x1
+ @y += -y1_old + self.y1
end
end
diff --git a/run.rb b/run.rb
index 5149f89..163a3ff 100644
--- a/run.rb
+++ b/run.rb
@@ -146,16 +146,15 @@ update do
@squares.each do |square|
square.update(Camera.camera_position, Camera.zoom_level)
end
- @quad.x += 1
+ @quad.rotate(50 - @quad.x,50 - @quad.y,5)
@quad.color = 'random' if @frame.zero?
# Alternating between follow and manual control
- puts @player.x
- puts @player.y
if @is_follow
Camera.follow @player
else
Camera.move_by(@cam_x_move, @cam_y_move)
end
+ @player.rotate(@player.x1, @player.y1, 5)
# This function will teleport the camera directory to those coordinates
# It is used by Camera.follow but you can use it yourself too!