Files
gplan-2/game/presentation/views/board_world.gd
T

67 lines
3.5 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# VERTICAL SLICE - NOT FOR PRODUCTION
# 棋盘 Node2D 迁移批 Phase A 2026-09-23:BoardWorld——棋盘 Node2D 世界根(SubViewport 内
# CellUnit 容器)。职责单点:世界级材质挂点(set_desaturated 去饱和挂此处,CellUnit
# use_parent_material 链下随世界灰化)+ 主题/字体显式注入槽位(SubViewport 不自动继承主场景
# Control 主题——ADR-0006 Negative 项;Phase B 两舞台共用骨架,ADR-0006 Decision 5)。
# 无 class_name(类名缓存面纪律——BoardView 经 preload 使用)。
# 立体原型批 2026-09-24(用户拍板「三档厚度实机对比」):板块伪立体绘制——正俯视纸雕风,
# 顶面方格不变(数字可读性硬指标不受伤),厚度全部画在网格矩形外的正面/右侧悬崖带:
# 正面(背光暗)+右侧(微受光)+列分隔缝(ITB 悬崖列感)+岩层横纹+底部悬浮影(厚档)+
# 顶面接触 AO。零布局/命中改动(悬崖向网格外延展,世界尺寸由 BoardView._update_world_size 加 D)。
extends Node2D
var board_font: Font = null # 字体注入槽位(null = ThemeDB.fallback_font——与旧 Button 缺省主题字体同源)
# ── 立体原型(BoardView.set_depth_mode / set_cell_area 单点驱动)──
var depth_px := 0.0: # 悬崖厚度(0 = 平面现行;档位 4/8/14)
set(v):
depth_px = v
queue_redraw()
var slab := Vector2.ZERO: # 网格矩形像素尺寸(不含悬崖外延)
set(v):
slab = v
queue_redraw()
var stride_px := 48.0: # 格步距(cell + SEP——列分隔缝对齐格边界)
set(v):
stride_px = v
queue_redraw()
var cols := 0: # 列数(正面悬崖竖缝数 = cols−1)
set(v):
cols = v
queue_redraw()
var mat := Color8(201, 175, 131) # 材质锚色(掩尘 #C9AF83——侧面由此派生明暗;BoardView 传入)
func _draw() -> void:
if depth_px <= 0.0 or slab == Vector2.ZERO:
return
var w := slab.x
var h := slab.y
var d := depth_px
var front := mat.darkened(0.55) # 正面悬崖(背光)
var right := mat.darkened(0.38) # 右侧悬崖(微受光)
# 正面悬崖带 + 右侧悬崖带
draw_rect(Rect2(0, h, w, d), front, true)
draw_rect(Rect2(w, 0, d, h + d), right, true)
# 正面列分隔竖缝(对齐格边界——ITB 悬崖列感)
for i in range(1, cols):
var x := float(i) * stride_px - 1.0
draw_rect(Rect2(x, h, 2.0, d), front.darkened(0.25), true)
# 岩层横纹(两条微暗横带——碎石层理)
draw_rect(Rect2(0, h + d * 0.38, w, 1.5), front.darkened(0.18), true)
draw_rect(Rect2(0, h + d * 0.72, w, 1.5), front.darkened(0.12), true)
# 悬崖口沿高光(顶面与悬崖交界 1px 亮线——倒角受光)
draw_rect(Rect2(0, h, w, 1.0), mat.lightened(0.18), true)
draw_rect(Rect2(w, 0, 1.0, h), mat.lightened(0.12), true)
# 顶面接触 AO(网格内侧贴边 2px 暗带——顶面陷进阴影的衔接感)
draw_rect(Rect2(0, h - 2.0, w, 2.0), Color(0, 0, 0, 0.18), true)
draw_rect(Rect2(w - 2.0, 0, 2.0, h), Color(0, 0, 0, 0.14), true)
# 底线(悬崖最底 2px 最暗——收边)
draw_rect(Rect2(0, h + d - 2.0, w + d, 2.0), front.darkened(0.35), true)
# 底部悬浮影(中厚档起——悬浮岛离地感;三层渐隐)
if d >= 8.0:
var layers := [Color(0, 0, 0, 0.16), Color(0, 0, 0, 0.10), Color(0, 0, 0, 0.05)]
for i in layers.size():
var sh := 3.0 + float(i) * 3.0
draw_rect(Rect2(sh, h + d + sh * 0.5, w + d - sh * 1.5, float(2 + i)), layers[i], true)