Refactor vault camera and grid logic for improved zoom and positioning. Adjusted zoom step value, refined camera limits based on vault structure, and updated grid depth calculations. Enhanced drawing functions in vault view to include entrance visualization and corrected depth handling for pebbles and dirt rendering.
This commit is contained in:
@@ -5,7 +5,7 @@ extends Camera2D
|
||||
## Границы задаются встроенными limit_* по размеру убежища, поэтому вручную
|
||||
## позицию не зажимаем — движок делает это сам.
|
||||
|
||||
const ZOOM_STEP := 1.12
|
||||
const ZOOM_STEP := 1.2
|
||||
const MIN_ZOOM := 0.45
|
||||
const MAX_ZOOM := 2.2
|
||||
const KEY_PAN_SPEED := 900.0
|
||||
@@ -18,9 +18,12 @@ func _ready() -> void:
|
||||
var bounds := VaultGrid.bounds()
|
||||
limit_left = int(bounds.position.x - EDGE_MARGIN)
|
||||
limit_right = int(bounds.end.x + EDGE_MARGIN)
|
||||
limit_top = int(bounds.position.y - EDGE_MARGIN)
|
||||
# Сверху отмеряем от поверхности, а не от бункера: над землёй стоит будка
|
||||
# входа, и до неё нужно доезжать.
|
||||
limit_top = int(-EDGE_MARGIN)
|
||||
limit_bottom = int(bounds.end.y + EDGE_MARGIN)
|
||||
position = bounds.get_center()
|
||||
# Открываемся на верхних этажах — оттуда видно и вход, и застройку.
|
||||
position = Vector2(bounds.get_center().x, bounds.position.y + VaultGrid.CELL.y)
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
@@ -39,11 +42,15 @@ func _unhandled_input(event: InputEvent) -> void:
|
||||
|
||||
func _handle_mouse_button(event: InputEventMouseButton) -> void:
|
||||
match event.button_index:
|
||||
# На один щелчок колеса Godot шлёт и нажатие, и отпускание. Без
|
||||
# проверки pressed шаг зума применялся бы дважды.
|
||||
MOUSE_BUTTON_WHEEL_UP:
|
||||
_zoom_by(ZOOM_STEP)
|
||||
if event.pressed:
|
||||
_zoom_by(ZOOM_STEP)
|
||||
get_viewport().set_input_as_handled()
|
||||
MOUSE_BUTTON_WHEEL_DOWN:
|
||||
_zoom_by(1.0 / ZOOM_STEP)
|
||||
if event.pressed:
|
||||
_zoom_by(1.0 / ZOOM_STEP)
|
||||
get_viewport().set_input_as_handled()
|
||||
MOUSE_BUTTON_RIGHT, MOUSE_BUTTON_MIDDLE:
|
||||
# Правая и средняя кнопки таскают вид; левая остаётся строительству.
|
||||
|
||||
@@ -11,6 +11,10 @@ const CELL := Vector2(140.0, 120.0)
|
||||
const COLUMNS := 9
|
||||
const FLOORS := 6
|
||||
const ELEVATOR_COLUMN := 0
|
||||
## Насколько верхний этаж утоплен под поверхность. y = 0 — уровень земли,
|
||||
## выше — небо. Смещение живёт здесь, а не в отрисовке, чтобы вместе с
|
||||
## картинкой уехали и попадание мышью, и границы камеры.
|
||||
const DEPTH := 360.0
|
||||
|
||||
## Типы комнат: подпись, цвет, ширина в ячейках и баланс ресурсов за цикл.
|
||||
const KINDS := {
|
||||
@@ -106,7 +110,7 @@ func remove_at(a_floor: int, column: int) -> bool:
|
||||
|
||||
static func cell_rect(a_floor: int, column: int, width: int = 1) -> Rect2:
|
||||
return Rect2(
|
||||
Vector2(column * CELL.x, a_floor * CELL.y),
|
||||
Vector2(column * CELL.x, DEPTH + a_floor * CELL.y),
|
||||
Vector2(CELL.x * width, CELL.y)
|
||||
)
|
||||
|
||||
@@ -120,13 +124,13 @@ static func room_rect(room: Dictionary) -> Rect2:
|
||||
static func cell_at(local_position: Vector2) -> Vector2i:
|
||||
return Vector2i(
|
||||
int(floor(local_position.x / CELL.x)),
|
||||
int(floor(local_position.y / CELL.y))
|
||||
int(floor((local_position.y - DEPTH) / CELL.y))
|
||||
)
|
||||
|
||||
|
||||
## Прямоугольник всего убежища в координатах вида.
|
||||
static func bounds() -> Rect2:
|
||||
return Rect2(Vector2.ZERO, Vector2(COLUMNS * CELL.x, FLOORS * CELL.y))
|
||||
return Rect2(Vector2(0.0, DEPTH), Vector2(COLUMNS * CELL.x, FLOORS * CELL.y))
|
||||
|
||||
|
||||
# --- Сводка по ресурсам -----------------------------------------------------
|
||||
|
||||
@@ -20,6 +20,11 @@ const SHAFT := Color("#141c21")
|
||||
const RUNG := Color("#c9a227", 0.45)
|
||||
const CABIN := Color("#c9a227", 0.22)
|
||||
|
||||
const HUT_WALL := Color("#26333b")
|
||||
const HUT_ROOF := Color("#33434d")
|
||||
const HUT_DOOR := Color("#0a1014")
|
||||
const HUT_LAMP := Color("#f2b134")
|
||||
|
||||
const EMPTY_FILL := Color("#ffffff", 0.02)
|
||||
const EMPTY_LINE := Color("#ffffff", 0.06)
|
||||
const GHOST_OK := Color("#2ee6c5")
|
||||
@@ -74,6 +79,7 @@ func _draw() -> void:
|
||||
_draw_shell()
|
||||
_draw_empty_cells()
|
||||
_draw_shaft()
|
||||
_draw_entrance()
|
||||
_draw_floor_numbers()
|
||||
for room: Dictionary in grid.rooms:
|
||||
_draw_room(room)
|
||||
@@ -95,7 +101,7 @@ func _draw_dirt() -> void:
|
||||
var bounds := VaultGrid.bounds()
|
||||
var left := -MARGIN
|
||||
var right := bounds.size.x + MARGIN
|
||||
var depth := bounds.size.y + DIRT_DEPTH
|
||||
var depth := bounds.end.y + DIRT_DEPTH
|
||||
_fill_gradient(Rect2(Vector2(left, 0.0), Vector2(right - left, depth)), DIRT_TOP, DIRT_BOTTOM)
|
||||
|
||||
for pebble: Dictionary in _pebbles:
|
||||
@@ -125,7 +131,7 @@ func _generate_pebbles() -> void:
|
||||
_pebbles.append({
|
||||
"position": Vector2(
|
||||
rng.randf_range(-MARGIN, bounds.size.x + MARGIN),
|
||||
rng.randf_range(6.0, bounds.size.y + DIRT_DEPTH)
|
||||
rng.randf_range(6.0, bounds.end.y + DIRT_DEPTH)
|
||||
),
|
||||
"radius": rng.randf_range(1.5, 5.0),
|
||||
"color": Color("#000000", rng.randf_range(0.10, 0.28)),
|
||||
@@ -149,9 +155,15 @@ func _draw_empty_cells() -> void:
|
||||
|
||||
|
||||
func _draw_shaft() -> void:
|
||||
var rect := Rect2(
|
||||
Vector2(VaultGrid.ELEVATOR_COLUMN * VaultGrid.CELL.x, 0.0),
|
||||
Vector2(VaultGrid.CELL.x, VaultGrid.FLOORS * VaultGrid.CELL.y)
|
||||
var bounds := VaultGrid.bounds()
|
||||
var left := VaultGrid.ELEVATOR_COLUMN * VaultGrid.CELL.x
|
||||
# Шахта идёт от самой поверхности до низа: она связывает вход с этажами.
|
||||
var rect := Rect2(Vector2(left, 0.0), Vector2(VaultGrid.CELL.x, bounds.end.y))
|
||||
|
||||
# Ствол выше убежища обшиваем — иначе шахта висит в породе без стенок.
|
||||
draw_rect(
|
||||
Rect2(Vector2(left - 9.0, 0.0), Vector2(rect.size.x + 18.0, bounds.position.y)),
|
||||
SHELL
|
||||
)
|
||||
draw_rect(rect, SHAFT)
|
||||
|
||||
@@ -160,17 +172,58 @@ func _draw_shaft() -> void:
|
||||
draw_line(Vector2(rect.position.x + 18.0, y), Vector2(rect.end.x - 18.0, y), RUNG, 2.0)
|
||||
y += 26.0
|
||||
|
||||
# Кабина стоит на верхнем этаже.
|
||||
var cabin := Rect2(rect.position + Vector2(22.0, 14.0), Vector2(rect.size.x - 44.0, 92.0))
|
||||
# Кабина стоит на верхнем этаже убежища, а не на уровне земли.
|
||||
var cabin := Rect2(
|
||||
Vector2(rect.position.x + 22.0, bounds.position.y + 14.0),
|
||||
Vector2(rect.size.x - 44.0, 92.0)
|
||||
)
|
||||
draw_rect(cabin, CABIN)
|
||||
draw_rect(cabin, RUNG, false, 2.0)
|
||||
draw_rect(rect, OUTLINE, false, 2.0)
|
||||
|
||||
|
||||
## Будка входа на поверхности: то, что видно снаружи над шахтой.
|
||||
func _draw_entrance() -> void:
|
||||
var center_x := VaultGrid.ELEVATOR_COLUMN * VaultGrid.CELL.x + VaultGrid.CELL.x * 0.5
|
||||
var half := 96.0
|
||||
var height := 132.0
|
||||
|
||||
var body := Rect2(Vector2(center_x - half, -height), Vector2(half * 2.0, height))
|
||||
draw_rect(body, HUT_WALL)
|
||||
draw_rect(body, OUTLINE, false, 2.0)
|
||||
|
||||
var roof := Rect2(
|
||||
Vector2(center_x - half - 16.0, -height - 18.0), Vector2((half + 16.0) * 2.0, 18.0)
|
||||
)
|
||||
draw_rect(roof, HUT_ROOF)
|
||||
draw_rect(roof, OUTLINE, false, 2.0)
|
||||
|
||||
# Проём над шахтой — вход и есть устье ствола.
|
||||
var door := Rect2(Vector2(center_x - 34.0, -height + 40.0), Vector2(68.0, height - 40.0))
|
||||
draw_rect(door, HUT_DOOR)
|
||||
draw_rect(door, RUNG, false, 2.0)
|
||||
|
||||
# Лампа над дверью со скромным ореолом.
|
||||
var lamp := Vector2(center_x, -height + 24.0)
|
||||
draw_circle(lamp, 16.0, Color(HUT_LAMP, 0.10))
|
||||
draw_circle(lamp, 6.0, HUT_LAMP)
|
||||
|
||||
# Мачта на крыше — силуэт, который читается издалека.
|
||||
var mast_x := center_x + half - 22.0
|
||||
draw_line(
|
||||
Vector2(mast_x, -height - 18.0), Vector2(mast_x, -height - 86.0), HUT_ROOF, 4.0
|
||||
)
|
||||
draw_line(
|
||||
Vector2(mast_x - 14.0, -height - 62.0), Vector2(mast_x + 14.0, -height - 62.0),
|
||||
HUT_ROOF, 3.0
|
||||
)
|
||||
|
||||
|
||||
func _draw_floor_numbers() -> void:
|
||||
var font := ThemeDB.fallback_font
|
||||
for a_floor in VaultGrid.FLOORS:
|
||||
var pos := Vector2(-46.0, a_floor * VaultGrid.CELL.y + VaultGrid.CELL.y * 0.5 + 7.0)
|
||||
var row := VaultGrid.cell_rect(a_floor, 0)
|
||||
var pos := Vector2(-46.0, row.position.y + VaultGrid.CELL.y * 0.5 + 7.0)
|
||||
draw_string(font, pos, str(a_floor + 1), HORIZONTAL_ALIGNMENT_LEFT, -1, 20,
|
||||
Color("#ffffff", 0.28))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user