fix(game): 崩溃修复(卸载区块实体冻结)+ 立面光照、掉落可见、打击感、水下效果、空手拳头、血条左/饥饿右
- 崩溃(index out of range):实体所在区块卸载后失去碰撞支撑无限下坠到 负坐标,光查询越界 panic——WorldView 增 ChunkLoaded,未加载区块实体冻结; chunk 光查询加越界防御(双保险) - 立面光照:mesh 每面取**邻格**光照(原版光照模型)——此前用方块自身光照 (sky=0)导致悬崖/矿洞立面全黑(泥土竖向黑色根因) - 掉落可见:生成后 1 秒拾取延迟 + 图标加大到 0.45 - 打击感:攻击命中音(block.hit)+ 实体受击白闪(uTint)+ 手持挥动动画 - 水下效果:相机入水蓝色叠加(渲染.md §8 水体) - 空手显示肤色拳头(白羊毛 × 肤色 tint),持方块正常显示 - HUD 布局:血条左下、饥饿右下(经典布局)
This commit is contained in:
@@ -40,6 +40,9 @@ type HUD struct {
|
||||
// 小地图(左上角,UI还原.md §3.5)
|
||||
minimapTex uint32
|
||||
|
||||
// 水下渲染(渲染.md §8 水体效果:蓝色叠加)
|
||||
underwater bool
|
||||
|
||||
// 逻辑分辨率与缩放(UI还原.md §3.1:427×240 基准 × 整数缩放)
|
||||
baseW, baseH float32
|
||||
scale float32
|
||||
@@ -82,11 +85,19 @@ func (h *HUD) SetTarget(tex uint32, w, hgt float32) {
|
||||
// SetMinimap 设置小地图纹理(渲染线程注入;tex=0 清除)。
|
||||
func (h *HUD) SetMinimap(tex uint32) { h.minimapTex = tex }
|
||||
|
||||
// SetUnderwater 设置水下状态(蓝色叠加与雾效)。
|
||||
func (h *HUD) SetUnderwater(b bool) { h.underwater = b }
|
||||
|
||||
// Draw 每帧绘制 HUD(调用方已 Begin)。
|
||||
func (h *HUD) Draw(r *Renderer) {
|
||||
w, hgt := float32(r.w), float32(r.h)
|
||||
s := h.scale
|
||||
|
||||
// 水下效果:蓝色叠加(渲染.md §8 水体)
|
||||
if h.underwater {
|
||||
r.DrawRect(0, 0, w, hgt, [4]float32{0.05, 0.2, 0.45, 0.42})
|
||||
}
|
||||
|
||||
// 准星(原版 crosshair.png 15×15,UI还原.md §3.4)
|
||||
cx, cy := w/2, hgt/2
|
||||
if h.haveSprites {
|
||||
@@ -147,11 +158,12 @@ func (h *HUD) Draw(r *Renderer) {
|
||||
}
|
||||
}
|
||||
|
||||
// 饥饿:10 鸡腿(原版 food_full,生命行下方)
|
||||
// 饥饿:10 鸡腿(原版 food_full,屏幕**右下**——血条左、饥饿右的经典布局)
|
||||
food := 20 // 饥饿值(饥饿系统后置,恒定 20)
|
||||
fy := hgt - 39*s
|
||||
fx := w/2 + 11*s // 与左侧生命行镜像对称(w/2+11 .. w/2+91)
|
||||
for i := 0; i < 10; i++ {
|
||||
x := hx + float32(i)*8*s
|
||||
x := fx + float32(i)*8*s
|
||||
switch {
|
||||
case food >= (i+1)*2:
|
||||
if h.haveSprites {
|
||||
|
||||
Reference in New Issue
Block a user