Files
blub-blub/scenes/aquarium/seabed.gd
T
ttipo 446d8d177c 바탕화면 바닷속 방치형 위젯 첫 커밋
화면 아래 가장자리에 가로로 깔리는 Godot 4.7 위젯.
거품을 모아 바다를 꾸미고, 꾸밀수록 거품이 더 빨리 모인다.

- 도킹 창: 투명·테두리 없음, 화면 폭 전체, 위/아래 가장자리 스냅,
  높이 프리셋, 클릭 통과(모서리로 복귀), DPI 배율 보정
- 3/4 부감 격자: 구역당 9x6, 전체 45x6 = 270칸.
  바닥은 위에서, 물체는 서 있는 모습으로 그리고 Y 정렬로 앞뒤를 가린다
- 구역 5개(얕은 바다 -> 열수구): 앞 구역을 꾸며야 다음이 열린다
- 칸이 곧 한계인 경제: 배치/이동/치우기(절반 환불), 여러 칸짜리 장식
- 저장: 30초 자동 저장, 백업 한 세대, 8시간 상한 오프라인 보상,
  격자 이전 형식 저장본 자동 이전
- 스모크 테스트 60여 개 (test.ps1)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 17:59:50 +09:00

53 lines
2.0 KiB
GDScript

extends Node2D
class_name Seabed
## 탑다운 바다의 바닥. 격자 칸마다 그 자리 구역의 모래색을 조금씩 달리해 깔고,
## 그 위에 아주 옅은 격자선을 얹어 "어디에 놓을 수 있는지"가 보이게 한다.
var rect_size := Vector2(1280, 220)
## 위쪽 정보 바 자리. 여기에는 격자를 긋지 않는다.
var grid_top := 30.0
const GRID_LINE := Color(0, 0, 0, 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 base := Catalog.ramp_color("sand", (col + 0.5) / cols)
# 정보 바가 앉는 위쪽 띠. 놓을 수 없는 자리라 조금 어둡게 둔다.
draw_rect(Rect2(col * tw, 0.0, tw + 1.0, grid_top + 1.0), base.darkened(0.10))
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)
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)
for col in range(1, cols):
draw_line(Vector2(col * tw, grid_top), Vector2(col * tw, rect_size.y), GRID_LINE, 1.0)
for row in rows + 1:
var y := grid_top + row * th
draw_line(Vector2(0, y), Vector2(rect_size.x, y), GRID_LINE, 1.0)