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:
@@ -48,13 +48,18 @@ type ChunkMesh struct {
|
||||
// Neighbor 邻居方块查询(跨区块面剔除用,区块管理.md §6)。
|
||||
type Neighbor func(x, y, z int32) block.State
|
||||
|
||||
// Light 邻居光照查询(面光照用:每个面取**邻格**的光照等级——
|
||||
// 方块自身 sky=0,用自身光照会让所有立面全黑(悬崖/矿洞立面黑色根因)。
|
||||
type Light func(x, y, z int32) (sky, blk uint8)
|
||||
|
||||
// UVFunc 纹理键 → 图集 UV(归一化坐标,含 inset)。
|
||||
type UVFunc func(texKey string) (u0, v0, u1, v1 float32, ok bool)
|
||||
|
||||
// Builder 网格构建器。
|
||||
type Builder struct {
|
||||
reg *block.Registry
|
||||
uv UVFunc
|
||||
reg *block.Registry
|
||||
uv UVFunc
|
||||
light Light // 面光照查询(邻格光照;nil 回退自身光照)
|
||||
}
|
||||
|
||||
// NewBuilder 创建构建器。
|
||||
@@ -62,6 +67,9 @@ func NewBuilder(reg *block.Registry, uv UVFunc) *Builder {
|
||||
return &Builder{reg: reg, uv: uv}
|
||||
}
|
||||
|
||||
// SetLight 设置面光照查询(每个面取邻格光照,光照.md 顶点光照)。
|
||||
func (b *Builder) SetLight(fn Light) { b.light = fn }
|
||||
|
||||
// face 一个面的 4 个角偏移与朝向。
|
||||
type faceDef struct {
|
||||
dir [3]int32
|
||||
@@ -114,7 +122,6 @@ func (b *Builder) Build(c *chunk.Chunk, nb Neighbor) *ChunkMesh {
|
||||
wx := int32(x) + c.CX*16
|
||||
wy := int32(y)
|
||||
wz := int32(z) + c.CZ*16
|
||||
sky, blk := c.SkyLight(x, y, z), c.BlockLight(x, y, z)
|
||||
|
||||
for fi, f := range faces {
|
||||
nx := wx + f.dir[0]
|
||||
@@ -129,6 +136,14 @@ func (b *Builder) Build(c *chunk.Chunk, nb Neighbor) *ChunkMesh {
|
||||
b.reg.IsTranslucent(neighbor) == b.reg.IsTranslucent(s) && b.reg.IsTranslucent(s) {
|
||||
continue
|
||||
}
|
||||
// 面光照:取**邻格**的光照(原版光照模型)——方块自身 sky=0,
|
||||
// 用自身光照会让悬崖/矿洞立面全黑
|
||||
sky, blk := uint8(0), uint8(0)
|
||||
if b.light != nil {
|
||||
sky, blk = b.light(nx, ny, nz)
|
||||
} else {
|
||||
sky, blk = c.SkyLight(x, y, z), c.BlockLight(x, y, z)
|
||||
}
|
||||
texKey := b.reg.Texture(s, faceTexture[fi])
|
||||
u0, v0, u1, v1, ok := b.uv(texKey)
|
||||
if !ok {
|
||||
|
||||
Reference in New Issue
Block a user