mirror of
https://github.com/cyberarm/i-mic-rts.git
synced 2025-12-14 23:32:35 +00:00
Camera#pick almost works, fixed Map tile exclusion
This commit is contained in:
@@ -20,7 +20,6 @@ class IMICRTS
|
|||||||
def draw(&block)
|
def draw(&block)
|
||||||
if block
|
if block
|
||||||
Gosu.clip_to(@viewport.min.x, @viewport.min.y, @viewport.max.x, @viewport.max.y) do
|
Gosu.clip_to(@viewport.min.x, @viewport.min.y, @viewport.max.x, @viewport.max.y) do
|
||||||
center_point = center
|
|
||||||
Gosu.transform(*worldspace.elements) do
|
Gosu.transform(*worldspace.elements) do
|
||||||
block.call
|
block.call
|
||||||
end
|
end
|
||||||
@@ -39,7 +38,13 @@ class IMICRTS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def pick(vector)
|
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.x = inverse.x.floor
|
||||||
inverse.y = inverse.y.floor
|
inverse.y = inverse.y.floor
|
||||||
|
|
||||||
@@ -47,7 +52,7 @@ class IMICRTS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def center
|
def center
|
||||||
(CyberarmEngine::Vector.new(window.width / 2, window.height / 2) - @position)
|
CyberarmEngine::Vector.new(window.width / 2, window.height / 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
def center_around(vector, factor)
|
def center_around(vector, factor)
|
||||||
@@ -57,9 +62,9 @@ class IMICRTS
|
|||||||
|
|
||||||
def worldspace
|
def worldspace
|
||||||
zoom_vector = CyberarmEngine::Vector.new(@zoom, @zoom)
|
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
|
end
|
||||||
|
|
||||||
def visible?(object)
|
def visible?(object)
|
||||||
|
|||||||
19
lib/map.rb
19
lib/map.rb
@@ -32,19 +32,24 @@ class IMICRTS
|
|||||||
def visible_tiles(camera)
|
def visible_tiles(camera)
|
||||||
_tiles = []
|
_tiles = []
|
||||||
|
|
||||||
top_left = camera.center - CyberarmEngine::Vector.new($window.width / 2, $window.height / 2) / camera.zoom
|
top_left = (camera.center - camera.position) - 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 /= @tile_size
|
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
|
# +1 to overdraw a bit to hide pop-in
|
||||||
_width = ($window.width / @tile_size) + 1
|
_width = ((($window.width / @tile_size) + 2) / camera.zoom).ceil
|
||||||
_height = ($window.height / @tile_size) + 1
|
_height = ((($window.height / @tile_size) + 2) / camera.zoom).ceil
|
||||||
|
|
||||||
_height.times do |y|
|
_height.times do |y|
|
||||||
_width.times do |x|
|
_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)
|
_tiles.push(tile)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ class IMICRTS
|
|||||||
@director.entities.each(&:draw)
|
@director.entities.each(&:draw)
|
||||||
@selected_entities.each(&:selected_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)
|
mouse = @player.camera.pick(window.mouse)
|
||||||
draw_rect(mouse.x - 10, mouse.y - 10, 20, 20, Gosu::Color::YELLOW, Float::INFINITY)
|
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 X: #{window.mouse.x}
|
||||||
Window Mouse Y: #{window.mouse.y}
|
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 X: #{mouse.x}
|
||||||
World Mouse Y: #{mouse.y}
|
World Mouse Y: #{mouse.y}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user