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)