Files
ttipo 519e4980de 먼 바다 배경·하루의 빛·층 구조·감상 모드
네 가지 작업이 같은 함수들을 겹쳐 고쳐서 한 커밋으로 묶는다.
쪼개려면 hunk 단위로 갈라야 하는데 서로 얽혀 있어 오히려 위험하다.

먼 바다 배경 (backdrop.gd)
- 3/4 부감에서 화면 위쪽은 더 먼 곳이다. 거기까지 모래를 깔면
  바다가 아니라 사막처럼 보여서, 위쪽 띠를 물로 비웠다.
- 먼 물 그라디언트 → 능선 → 먼 실루엣 순으로 깊이를 만든다.
- Seabed가 뒷줄일수록 색을 물빛 쪽으로 당겨 공기원근을 준다.
- 빛줄기를 알파를 더하는 방향으로 바꿨다. 걷어내는 방향이면
  바닥만 밝아지고 물기둥은 텅 빈 채로 남는다.

하루의 빛 (day_cycle.gd)
- 실제 시각에 맞춰 새벽/아침/낮/저녁/밤. 이름은 구간으로 끊고
  색과 밝기는 계속 보간한다.
- 밤에는 물결과 빛줄기가 잦아들고, 스스로 빛나는 것은 어둠을
  되밀어 오히려 도드라진다.
- godot --path . -- --hour=21 로 특정 시각을 눈으로 확인할 수 있다.

한 화면에 한 층
- 가로 연속 스크롤을 버리고 층 전환으로 바꿨다. 위층(얕은 바다)에서
  아래층(열수구)으로 내려간다. 층 선택기·휠·↑↓ 키.
- 층은 내부적으로 여전히 옆으로 늘어서 있고 화면이 한 구간만 비춘다.
  갈아탈 때만 세로로 미끄러뜨려 깊이가 위아래로 읽히게 했다.
- 칸 크기를 가로에서 정하도록 뒤집고 ZONE_COLUMNS를 36으로 올렸다.
  층당 칸이 96 -> 216이라 정원과 해금 곡선은 다시 봐야 한다.
- 한 화면에 한 층만 보이므로 층 색은 이웃과 섞지 않는다.

감상 모드 (F11)
- 창을 화면 전체로. 세로로 남는 공간은 격자가 아니라 물기둥에 준다.
  격자를 키우면 타일만 커지고 보이는 열은 오히려 줄어든다.
- 창을 화면과 픽셀까지 똑같이 맞추면 Windows가 독점 전체화면으로
  승격시켜 size 지정이 먹지 않는다. usable_rect까지만 쓴다.

그 밖에
- 저장 window_state: scroll_x -> layer
- 알림이 정보 바와 겹치던 것을 바 아래로 옮겼다
- 난파선 선체 폴리곤이 제 몸을 가로질러 삼각분할이 실패하던 것 수정

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 12:41:36 +09:00

59 lines
2.2 KiB
GDScript

extends Node2D
class_name Seabed
## 격자가 깔리는 바닥. 칸마다 그 자리 구역의 모래색을 조금씩 달리해 깔고,
## 그 위에 아주 옅은 격자선을 얹어 "어디에 놓을 수 있는지"가 보이게 한다.
##
## 위쪽 띠(grid_top 위)는 Backdrop이 먼 바다로 그리므로 여기서는 손대지 않는다.
var rect_size := Vector2(1280, 220)
## 이 높이 위쪽은 먼 바다다. 격자는 여기서부터 시작한다.
var grid_top := 46.0
## 격자선. 감상 모드에서는 옅게 눌러 그림이 앞에 오게 한다.
var grid_alpha := 0.13
const SPECK := Color(0, 0, 0, 0.06)
## 칸마다 늘 같은 값을 주는 해시. 매번 다른 무늬가 나오면 재배치할 때마다 바닥이 깜빡인다.
func _hash(col: int, row: int, salt: int) -> float:
var h := (col * 73856093) ^ (row * 19349663) ^ (salt * 83492791)
return float(absi(h) % 1000) / 1000.0
func _draw() -> void:
var cols := GameState.columns()
var rows := GameState.rows()
if rect_size.x < 4.0 or cols <= 0 or rows <= 0:
return
var grid_height := maxf(rect_size.y - grid_top, 1.0)
var tw := rect_size.x / cols
var th := grid_height / rows
for col in cols:
var f := (col + 0.5) / cols
var base := Catalog.ramp_color("sand", f)
var tint := Catalog.ramp_color("tint", f)
for row in rows:
var shade := (_hash(col, row, 1) - 0.5) * 0.09
var c := base.lightened(shade) if shade > 0.0 else base.darkened(-shade)
# 공기원근. 뒷줄(위쪽)일수록 물빛에 먹혀 멀어 보인다.
c = c.lerp(tint, (1.0 - float(row) / maxf(rows - 1, 1)) * 0.22)
var y := grid_top + row * th
# 칸 경계에 실선이 비지 않도록 1px씩 겹쳐 그린다.
draw_rect(Rect2(col * tw, y, tw + 1.0, th + 1.0), c)
# 모래알 몇 점. 바닥이 완전히 평평해 보이는 걸 막는다.
for s in 2:
var px := (col + _hash(col, row, 10 + s)) * tw
var py := y + _hash(col, row, 20 + s) * th
draw_circle(Vector2(px, py), 1.0 + _hash(col, row, 30 + s), SPECK)
var line := Color(0, 0, 0, grid_alpha)
for col in range(1, cols):
draw_line(Vector2(col * tw, grid_top), Vector2(col * tw, rect_size.y), line, 1.0)
for row in rows + 1:
var y := grid_top + row * th
draw_line(Vector2(0, y), Vector2(rect_size.x, y), line, 1.0)