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>
53 lines
2.0 KiB
GDScript
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)
|