From 5b5a72a7804f0b136f8ffa6cdac604ee941e1faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Sun, 30 Jun 2019 10:49:11 +0300 Subject: [PATCH] Pillar/letterbox instead of stretching, if window size has different aspect ratio --- bundle/main.lua | 80 +++++++++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/bundle/main.lua b/bundle/main.lua index 3faf7fd..d4992d4 100644 --- a/bundle/main.lua +++ b/bundle/main.lua @@ -702,90 +702,104 @@ end -- Drawing -- ------------------------------------------------------------------ function drawCavern() - local x_scale = love.graphics.getWidth() / cavern.width - local y_scale = love.graphics.getHeight() / cavern.height + local screen_width = love.graphics.getWidth() + local screen_height = love.graphics.getHeight() + + local width_scale = screen_width / cavern.width + local height_scale = screen_height / cavern.height + local scale = math.min(width_scale, height_scale) + + local x_offset = (screen_width - cavern.width * scale) / 2 + local y_offset = (screen_height - cavern.height * scale) / 2 for tile_x, list in ipairs(visibility_map) do - local x = (tile_x - 1) * x_scale + local x = (tile_x - 1) * scale + x_offset for tile_y, visible in ipairs(list) do - local y = (tile_y - 1) * y_scale + local y = (tile_y - 1) * scale + y_offset if visible or debug then tile = cavern[tile_x][tile_y] if tile == tiletypes.empty then love.graphics.setColor(0, 0, 0) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) elseif tile == tiletypes.wall then love.graphics.setColor(1, 1, 1) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) elseif tile == tiletypes.orb then love.graphics.setColor(0.5, 0.3, 0.3) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) love.graphics.setColor(0, 1, 0) - love.graphics.ellipse('fill', x + 0.5 * x_scale, y + 0.5 * y_scale, 0.7 * x_scale/2, 0.7 * y_scale/2) + love.graphics.ellipse('fill', x + 0.5 * scale, y + 0.5 * scale, 0.7 * scale/2, 0.7 * scale/2) elseif tile == tiletypes.slime then love.graphics.setColor(0, 0, 0) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) love.graphics.setColor(1, 1, 0) - love.graphics.ellipse('fill', x + 0.5 * x_scale, y + 0.5 * y_scale, 0.8 * x_scale/2, 0.8 * y_scale/2) - love.graphics.rectangle('fill', x + 0.1 * x_scale , y + 0.5 * y_scale, 0.8 * x_scale, 0.8 * y_scale/2) + love.graphics.ellipse('fill', x + 0.5 * scale, y + 0.5 * scale, 0.8 * scale/2, 0.8 * scale/2) + love.graphics.rectangle('fill', x + 0.1 * scale , y + 0.5 * scale, 0.8 * scale, 0.8 * scale/2) elseif tile == tiletypes.unknown then love.graphics.setColor(1, 0.5, 0.5) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) else print("Impossible tile!!!") love.graphics.setColor(1, 1, 0) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) end else tile = remembered_cavern[tile_x][tile_y] if tile == tiletypes.empty then love.graphics.setColor(0.2, 0.2, 0.2) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) elseif tile == tiletypes.wall then love.graphics.setColor(0.9, 0.9, 0.9) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) elseif tile == tiletypes.orb then love.graphics.setColor(0.4, 0.4, 0.4) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) love.graphics.setColor(0.2, 0.7, 0.2) - love.graphics.ellipse('fill', x + 0.5 * x_scale, y + 0.5 * y_scale, 0.7 * x_scale/2, 0.7 * y_scale/2) + love.graphics.ellipse('fill', x + 0.5 * scale, y + 0.5 * scale, 0.7 * scale/2, 0.7 * scale/2) elseif tile == tiletypes.slime then love.graphics.setColor(0.2, 0.2, 0.2) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) love.graphics.setColor(0.7, 0.7, 0.2) - love.graphics.ellipse('fill', x + 0.5 * x_scale, y + 0.5 * y_scale, 0.8 * x_scale/2, 0.8 * y_scale/2) - love.graphics.rectangle('fill', x + 0.1 * x_scale , y + 0.5 * y_scale, 0.8 * x_scale, 0.8 * y_scale/2) + love.graphics.ellipse('fill', x + 0.5 * scale, y + 0.5 * scale, 0.8 * scale/2, 0.8 * scale/2) + love.graphics.rectangle('fill', x + 0.1 * scale , y + 0.5 * scale, 0.8 * scale, 0.8 * scale/2) else love.graphics.setColor(0.7, 0.5, 0.5) - love.graphics.rectangle('fill', x, y, x_scale, y_scale) + love.graphics.rectangle('fill', x, y, scale, scale) end end if debug and tile_x == player_x and tile_y == player_y then love.graphics.setColor(1, 1, 0) - love.graphics.rectangle('fill', x + 0.5 * x_scale, y + 0.5 * y_scale, x_scale/2, y_scale/2) + love.graphics.rectangle('fill', x + 0.5 * scale, y + 0.5 * scale, scale/2, scale/2) end end end end function drawPlayer() - local x_scale = love.graphics.getWidth() / cavern.width - local y_scale = love.graphics.getHeight() / cavern.height + local screen_width = love.graphics.getWidth() + local screen_height = love.graphics.getHeight() - local player_head_center_x = (player_x - 1) * x_scale + 0.5 * x_scale - local player_head_center_y = (player_y - 1) * y_scale + 0.5 * y_scale + local width_scale = screen_width / cavern.width + local height_scale = screen_height / cavern.height + local scale = math.min(width_scale, height_scale) + + local x_offset = (screen_width - cavern.width * scale) / 2 + local y_offset = (screen_height - cavern.height * scale) / 2 + + local player_head_center_x = (player_x - 1) * scale + x_offset + 0.5 * scale + local player_head_center_y = (player_y - 1) * scale + y_offset + 0.5 * scale love.graphics.setColor(0.6, 0.3, 0.2) - love.graphics.ellipse('fill', player_head_center_x, player_head_center_y, x_scale/2, y_scale/2) + love.graphics.ellipse('fill', player_head_center_x, player_head_center_y, scale/2, scale/2) local player_body_x, player_body_y = getBodyLocation() - local player_body_x = (player_body_x - 1) * x_scale - local player_body_y = (player_body_y - 1) * y_scale + local player_body_x = (player_body_x - 1) * scale + x_offset + local player_body_y = (player_body_y - 1) * scale + y_offset love.graphics.setColor(0, 0, 1) - love.graphics.rectangle('fill', player_body_x, player_body_y, x_scale, y_scale) + love.graphics.rectangle('fill', player_body_x, player_body_y, scale, scale) end function drawWin() @@ -798,11 +812,11 @@ function drawWin() local height_scale = screen_height / img_height local scale = math.min(width_scale, height_scale) - local left_border = (screen_width - img_width * scale) / 2 - local up_border = (screen_height - img_height * scale) / 2 + local x_offset = (screen_width - img_width * scale) / 2 + local y_offset = (screen_height - img_height * scale) / 2 love.graphics.setColor(1, 1, 1) - love.graphics.draw(win_image, left_border, up_border, 0, scale, scale) + love.graphics.draw(win_image, x_offset, y_offset, 0, scale, scale) end function drawConfig()