From 5d8712946d7a7a43f5670d5b6ef08951d3d07e4b Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Mon, 7 Oct 2019 12:30:17 -0500 Subject: [PATCH] Camera#pick almost works, fixed Map tile exclusion --- lib/camera.rb | 15 ++++++++++----- lib/map.rb | 19 ++++++++++++------- lib/states/game.rb | 6 +++++- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/lib/camera.rb b/lib/camera.rb index fd20e85..f286557 100644 --- a/lib/camera.rb +++ b/lib/camera.rb @@ -20,7 +20,6 @@ class IMICRTS def draw(&block) if block Gosu.clip_to(@viewport.min.x, @viewport.min.y, @viewport.max.x, @viewport.max.y) do - center_point = center Gosu.transform(*worldspace.elements) do block.call end @@ -39,7 +38,13 @@ class IMICRTS end def pick(vector) - inverse = (vector - @position) / @zoom + neg_center = CyberarmEngine::Vector.new(-center.x, -center.y) + + scaled_position = ((vector - (@position)) / @zoom) + scaled_translation = (neg_center / @zoom + center) + # TODO: Fix error caused when @position != 0 + + inverse = (scaled_position + scaled_translation) inverse.x = inverse.x.floor inverse.y = inverse.y.floor @@ -47,7 +52,7 @@ class IMICRTS end def center - (CyberarmEngine::Vector.new(window.width / 2, window.height / 2) - @position) + CyberarmEngine::Vector.new(window.width / 2, window.height / 2) end def center_around(vector, factor) @@ -57,9 +62,9 @@ class IMICRTS def worldspace zoom_vector = CyberarmEngine::Vector.new(@zoom, @zoom) - position_matrix = CyberarmEngine::Matrix.translate(@position) + position_matrix = CyberarmEngine::Transform.translate(@position) - CyberarmEngine::Matrix.concat(CyberarmEngine::Matrix.scale(zoom_vector, center), position_matrix) + CyberarmEngine::Transform.concat(CyberarmEngine::Transform.scale(zoom_vector, center - @position), position_matrix) end def visible?(object) diff --git a/lib/map.rb b/lib/map.rb index 81e20d1..8a98366 100644 --- a/lib/map.rb +++ b/lib/map.rb @@ -32,19 +32,24 @@ class IMICRTS def visible_tiles(camera) _tiles = [] - top_left = camera.center - CyberarmEngine::Vector.new($window.width / 2, $window.height / 2) / camera.zoom - top_left.x = top_left.x.ceil - top_left.y = top_left.y.ceil - + top_left = (camera.center - camera.position) - CyberarmEngine::Vector.new($window.width / 2, $window.height / 2) / camera.zoom top_left /= @tile_size + top_left.x = top_left.x.floor + top_left.y = top_left.y.floor + + # +1 to overdraw a bit to hide pop-in - _width = ($window.width / @tile_size) + 1 - _height = ($window.height / @tile_size) + 1 + _width = ((($window.width / @tile_size) + 2) / camera.zoom).ceil + _height = ((($window.height / @tile_size) + 2) / camera.zoom).ceil _height.times do |y| _width.times do |x| - if tile = tile_at(x + top_left.x, y + top_left.y) + _x, _y = x + top_left.x, y + top_left.y + next if _x < 0 || _x > @width + next if _y < 0 || _y > @height + + if tile = tile_at(_x, _y) _tiles.push(tile) end end diff --git a/lib/states/game.rb b/lib/states/game.rb index ac78f34..f653f63 100644 --- a/lib/states/game.rb +++ b/lib/states/game.rb @@ -60,7 +60,8 @@ class IMICRTS @director.entities.each(&:draw) @selected_entities.each(&:selected_draw) - draw_rect(@player.camera.center.x - 10, @player.camera.center.y - 10, 20, 20, Gosu::Color::RED, Float::INFINITY) + center = @player.camera.center - @player.camera.position + draw_rect(center.x - 10, center.y - 10, 20, 20, Gosu::Color::RED, Float::INFINITY) mouse = @player.camera.pick(window.mouse) draw_rect(mouse.x - 10, mouse.y - 10, 20, 20, Gosu::Color::YELLOW, Float::INFINITY) @@ -95,6 +96,9 @@ class IMICRTS Window Mouse X: #{window.mouse.x} Window Mouse Y: #{window.mouse.y} + Camera Position X: #{@player.camera.position.x} + Camera Position Y: #{@player.camera.position.y} + World Mouse X: #{mouse.x} World Mouse Y: #{mouse.y}