iter48-卡2:卡②(立绘显示档批): 九件素材原稿分辨率入包(紧裁零降采样,STANDEE_SRC_H九键+产物计数自证)+standee_motion显示档PORTRAIT_DISPLAY_H九键钉值(_place_portrait按档算倍率,缺键push_error按1×)+portrait_probe扩display_size/display_scale+闸件standee_asset_check换口径(源高==原稿表值/显示宽≤150酋长157例外逐字)+样张站桩段按显示档取数(A4解冻重校88×92,V10并排30/30)+V13–V18全绿(50checks)+三面对照图

This commit is contained in:
DKChan committed 2026-11-02 01:58:23 +08:00
1 parent 1e35ab947b
commit 4c3f0f6082
9 files changed
+255 -119

No files matched your search

+2 -1
View File
@@ -173,7 +173,8 @@ func _build_status_bar(box: VBoxContainer) -> void:
strip.add_child(abandon_btn)
## 头像域:定高 48px=1×、宽随源图比自适应(源 46×48 → 46×48;纵横异倍消除)
## 头像域:定高 48px 框、宽随源图比自适应(源 = 原稿分辨率;该面为独立消费面——
## 显示档批不改框尺寸,画面随素材分辨率自动变化)
func _build_face_rect() -> TextureRect:
var face := TextureRect.new()
var face_tex := UiKit.load_tex(UiKit.TEX_HERO_PORTRAIT)
+5 -1
View File
@@ -281,7 +281,11 @@ func _portrait_glyph() -> String:
# 立绘落位探针出口(站桩纹理非空断言面;缺位回退链保持的对照面)
func portrait_probe() -> Dictionary:
return {"has_tex": mo._portrait_sprite != null and mo._portrait_sprite.texture != null}
var sp: Sprite2D = mo._portrait_sprite
if sp == null or sp.texture == null:
return {"has_tex": false, "display_size": Vector2.ZERO, "display_scale": 0.0}
var src := Vector2(sp.texture.get_width(), sp.texture.get_height())
return {"has_tex": true, "display_size": src * sp.scale, "display_scale": sp.scale.x}
# ---- 主角三态切换(攻击演出→attack/受击→hit/结算回 idle;§8.4 帧数档挂点) ----
+28 -7
View File
@@ -12,6 +12,15 @@ const _HS_VALUE := {"idle": HeroState.IDLE, "reset": HeroState.RESET, "attack":
var _owner: Node2D = null
var _portrait_sprite: Sprite2D = null # 资产挂点(null = 未落位,字形在位)
var _portrait_tex: Texture2D = null # 落位纹理引用(set_portrait_texture 装载;字形回退判据)
# 站桩立绘显示档(三档绝对高——art-bible §8.2 显示档定值单点;九键逐键钉值,禁兜底字面量):
# 小型 96 = 地精/巨蜘蛛/灰矮人;中型 144 = 主角/钩爪恐魔/熊地精;大型 188 = 酋长/卓尔/石君王。
# 显示倍率 = 档高 / 源高(宽随源比例);源高 = 原稿表值(Python 侧 STANDEE_SRC_H——
# 跨语言逐键对账由 standee_present_values_test V17 承担)。
const PORTRAIT_DISPLAY_H := {
"goblin": 96.0, "giant_spider": 96.0, "duergar": 96.0,
"hook_horror": 144.0, "bugbear": 144.0, "hero": 144.0,
"ogre_chief": 188.0, "drider": 188.0, "duergar_king": 188.0,
}
# 主角三态切换:state 名 → 纹理(battle_stage_view 组合点注册);缺态=保持现纹理
# (缺位回退链延伸——三态素材缺任一不炸不空)。敌站桩不注册不消费。
var _hero_tex := {}
@@ -35,8 +44,9 @@ func _init(owner: Node2D) -> void:
# 资产挂点:tex 落位后字形隐退、纹理立绘顶位——零代码换装契约;tex=null 回退字形。
# flip = 立绘朝向翻转(素材基准朝左时传 true 呈现朝右)。盒高 96px = 48px 立绘源整数 2×
# (圣经 §8.2 禁非整数缩放)——源换代时随源重算。(box = 宿主冻结 var,由宿主传入)
# flip = 立绘朝向翻转(素材基准朝左时传 true 呈现朝右)。显示高 = PORTRAIT_DISPLAY_H
# 逐键绝对高(art-bible §8.2 三档),宽随源比例(高定宽随)。
# (box = 宿主冻结 var,由宿主传入)
func set_portrait_texture(tex: Texture2D, flip: bool, box: Vector2) -> void:
if tex == null:
if _portrait_sprite != null:
@@ -56,14 +66,25 @@ func set_portrait_texture(tex: Texture2D, flip: bool, box: Vector2) -> void:
func _place_portrait(box: Vector2) -> void:
# 立绘盒 = (0,44)-(box.x, box.y-36);48 源 ×2 整数档居中
# 立绘盒 = (0,44)-(box.x, box.y-36);显示档逐键取 PORTRAIT_DISPLAY_H 绝对高,
# 宽随源比例(高定宽随);高于盒者沿既有居中溢出机制((box_h-h)*0.5 为负即上溢)
if _portrait_sprite == null or _portrait_tex == null:
return
var eid: String = _owner.enemy_id()
var key := "hero" if eid.is_empty() else eid
var box_h := box.y - 44.0 - 36.0
var w := _portrait_tex.get_width() * 2.0
var h := _portrait_tex.get_height() * 2.0
_portrait_sprite.scale = Vector2(2.0, 2.0) # 整数 2×(C5)
_portrait_sprite.position = Vector2((box.x - w) * 0.5, 44.0 + (box_h - h) * 0.5)
var disp_h: float = PORTRAIT_DISPLAY_H.get(key, -1.0)
if disp_h < 0.0:
# 缺键不崩、不静默兜档——push_error 报警后按 1× 落位(V18 键集自检在测试期报警)
push_error("[站桩] 显示档表缺键: %s(逐键登记纪律)" % key)
_portrait_sprite.scale = Vector2.ONE
_portrait_sprite.position = Vector2((box.x - _portrait_tex.get_width()) * 0.5,
44.0 + (box_h - _portrait_tex.get_height()) * 0.5)
return
var s := disp_h / float(_portrait_tex.get_height())
_portrait_sprite.scale = Vector2(s, s)
_portrait_sprite.position = Vector2((box.x - _portrait_tex.get_width() * s) * 0.5,
44.0 + (box_h - disp_h) * 0.5)
# 组合点注册(battle_stage_view _init——UiKit 常量 load_tex,缺位 null 不注册=该态保持现纹理)