猫史档案馆


{ 神岛 教程 } 强化方块碰撞系统,适合用于跑酷中!

用户:QC一二二一QC一二二一查看:4 回复:13 评论:4 创建时间:2022-08-09T20:50:07


在跑酷的时候

如果是碰到岩浆就喵的话

由于神岛特性

踩在岩浆上瞬间跳起来有几率不会被判断到

这就很不好()因为会作弊()

那么,要强化方块碰撞系统,就不能用onVoxelContact哦!)

如果要监测玩家碰到方块,就要用上world.onTick,检测玩家的话就要querySelectorAll

world.onTick(()=>{
    world.querySelectorAll('player').forEach(entity=>{
        
    })
});

 如果要强化方块碰撞,检测玩家距离方块范围要广

当然就是查看玩家四周有没有方块咯

那么你需要计算出玩家的区域

function getEntityBounds(entity){
    return new Box3Bounds3(
         entity.position.sub(entity.bounds), 
         entity.position.add(entity.bounds)
    )
}

 这个函数弄完后

就是检测玩家四周方块

由于这个代码太长,你需要缩短定义名,写的才方便

const v=(x,y,z)=>new Box3Vector3(x,y,z);//缩短Box3Vector3
const g=(v)=>voxels.getVoxel(v.x,v.y,v.z);//缩短voxels.getVoxel
const b=getEntityBounds(entity);//缩短表示玩家的占用区域
const add=0.2;
const allAround=[
    v(b.hi.x+add,b.hi.y+add,b.hi.z+add),//加0.2是因为如果要加强,那么要检测的更广 
    v(b.hi.x+add,b.hi.y+add,b.hi.z-add),
    v(b.hi.x+add,b.hi.y+add,b.hi.z),
    v(b.hi.x+add,b.hi.y-add,b.hi.z+add), 
    v(b.hi.x+add,b.hi.y-add,b.hi.z-add), 
    v(b.hi.x+add,b.hi.y-add,b.hi.z), 
    v(b.hi.x+add,b.hi.y,b.hi.z+add), 
    v(b.hi.x+add,b.hi.y,b.hi.z-add), 
    v(b.hi.x+add,b.hi.y,b.hi.z), 
    v(b.hi.x-add,b.hi.y+add,b.hi.z+add), 
    v(b.hi.x-add,b.hi.y+add,b.hi.z-add), 
    v(b.hi.x-add,b.hi.y+add,b.hi.z), 
    v(b.hi.x-add,b.hi.y-add,b.hi.z+add),
    v(b.hi.x-add,b.hi.y-add,b.hi.z-add), 
    v(b.hi.x-add,b.hi.y-add,b.hi.z), 
    v(b.hi.x-add,b.hi.y,b.hi.z+add), 
    v(b.hi.x-add,b.hi.y,b.hi.z-add), 
    v(b.hi.x-add,b.hi.y,b.hi.z), 
    v(b.hi.x,b.hi.y+add,b.hi.z+add), 
    v(b.hi.x,b.hi.y+add,b.hi.z-add), 
    v(b.hi.x,b.hi.y+add,b.hi.z), 
    v(b.hi.x,b.hi.y-add,b.hi.z+add), 
    v(b.hi.x,b.hi.y-add,b.hi.z-add), 
    v(b.hi.x,b.hi.y-add,b.hi.z), 
    v(b.hi.x,b.hi.y,b.hi.z+add), 
    v(b.hi.x,b.hi.y,b.hi.z-add), 
    v(b.hi.x,b.hi.y,b.hi.z)
];//四周位置 

那么,存储四周的数组就做好了(是不是太长了())

你要查看这个四周所有的方块的话……

for(const e of allAround){
    if(g(e)==voxels.id('lava_02')){
        entity.hurt(100);
        break;//退出循环是为了防止多次检测到玩家碰撞
    }//如果检测到玩家碰到岩浆那么就直接KO掉
}

那么,玩家碰到岩浆的全部代码是?

world.onTick(()=>{
    world.querySelectorAll('player').forEach(entity=>{
        function getEntityBounds(entity){
            return new Box3Bounds3(
                 entity.position.sub(entity.bounds), 
                 entity.position.add(entity.bounds)
            )
        }
        const v=(x,y,z)=>new Box3Vector3(x,y,z);//缩短Box3Vector3
        const g=(v)=>voxels.getVoxel(v.x,v.y,v.z);//缩短voxels.getVoxel
        const b=getEntityBounds(entity);//缩短表示玩家的占用区域
        const add=0.2;
        const allAround=[
            v(b.hi.x+add,b.hi.y+add,b.hi.z+add),//加0.2是因为如果要加强,那么要检测的更广 
            v(b.hi.x+add,b.hi.y+add,b.hi.z-add),
            v(b.hi.x+add,b.hi.y+add,b.hi.z),
            v(b.hi.x+add,b.hi.y-add,b.hi.z+add), 
            v(b.hi.x+add,b.hi.y-add,b.hi.z-add), 
            v(b.hi.x+add,b.hi.y-add,b.hi.z), 
            v(b.hi.x+add,b.hi.y,b.hi.z+add), 
            v(b.hi.x+add,b.hi.y,b.hi.z-add), 
            v(b.hi.x+add,b.hi.y,b.hi.z), 
            v(b.hi.x-add,b.hi.y+add,b.hi.z+add), 
            v(b.hi.x-add,b.hi.y+add,b.hi.z-add), 
            v(b.hi.x-add,b.hi.y+add,b.hi.z), 
            v(b.hi.x-add,b.hi.y-add,b.hi.z+add),
            v(b.hi.x-add,b.hi.y-add,b.hi.z-add), 
            v(b.hi.x-add,b.hi.y-add,b.hi.z), 
            v(b.hi.x-add,b.hi.y,b.hi.z+add), 
            v(b.hi.x-add,b.hi.y,b.hi.z-add), 
            v(b.hi.x-add,b.hi.y,b.hi.z), 
            v(b.hi.x,b.hi.y+add,b.hi.z+add), 
            v(b.hi.x,b.hi.y+add,b.hi.z-add), 
            v(b.hi.x,b.hi.y+add,b.hi.z), 
            v(b.hi.x,b.hi.y-add,b.hi.z+add), 
            v(b.hi.x,b.hi.y-add,b.hi.z-add), 
            v(b.hi.x,b.hi.y-add,b.hi.z), 
            v(b.hi.x,b.hi.y,b.hi.z+add), 
            v(b.hi.x,b.hi.y,b.hi.z-add), 
            v(b.hi.x,b.hi.y,b.hi.z)
        ];//四周位置 
        for(const e of allAround){
            if(g(e)==voxels.id('lava_02')){
                entity.hurt(100);
                break;//退出循环是为了防止多次检测到玩家碰撞
            }//如果检测到玩家碰到岩浆那么就直接KO掉
        }
    })
});

今天的教程就到这啦

大佬勿喷()()

别吞排版了吧为了重新整理排版我吐了 


回复

上一页1 页 / 共 1下一页
array_已退array_已退

测试过吗,会不会误判啊

点赞0


评论


QC一二二一QC一二二一

此代码有点问题,改进后:

world.onTick(()=>{
    world.querySelectorAll('player').forEach(entity=>{
        const v=(x,y,z)=>new Box3Vector3(x,y,z);//缩短Box3Vector3
        const g=(v)=>voxels.getVoxel(v.x,v.y,v.z);//缩短voxels.getVoxel
        const x=entity.bounds.x;//用x,y,z缩短玩家的体积长宽高的1/2
        const y=entity.bounds.y+0.25;//y检测加多一点是因为跳着瞬间起来的话要检测还要广一点,光加0.1也是有几率检测不到
        const z=entity.bounds.z;
        const add=0.1;//数值可以调
        const p=entity.position.clone();//用p缩短玩家的位置
        const allAround=[
            v(p.x+x+add,p.y+y+add,p.z+z+add),//加0.1是因为如果要加强,那么要检测的更广 
            v(p.x+x+add,p.y+y+add,p.z-z-add),
            v(p.x+x+add,p.y+y+add,p.z),
            v(p.x+x+add,p.y-y-add,p.z+z+add), 
            v(p.x+x+add,p.y-y-add,p.z-z-add),
            v(p.x+x+add,p.y-y-add,p.z),
            v(p.x+x+add,p.y,p.z+z+add),
            v(p.x+x+add,p.y,p.z-z-add),
            v(p.x+x+add,p.y,p.z),
            v(p.x-x-add,p.y+y+add,p.z+z+add),
            v(p.x-x-add,p.y+y+add,p.z-z-add),
            v(p.x-x-add,p.y+y+add,p.z),
            v(p.x-x-add,p.y-y-add,p.z+z+add), 
            v(p.x-x-add,p.y-y-add,p.z-z-add),
            v(p.x-x-add,p.y-y-add,p.z),
            v(p.x-x-add,p.y,p.z+z+add),
            v(p.x-x-add,p.y,p.z-z-add),
            v(p.x-x-add,p.y,p.z),
            v(p.x,p.y+y+add,p.z+z+add),
            v(p.x,p.y+y+add,p.z-z-add),
            v(p.x,p.y+y+add,p.z),
            v(p.x,p.y-y-add,p.z+z+add), 
            v(p.x,p.y-y-add,p.z-z-add),
            v(p.x,p.y-y-add,p.z),
            v(p.x,p.y,p.z+z+add),
            v(p.x,p.y,p.z-z-add),
            v(p.x,p.y,p.z),
        ];//四周位置 
        for(const e of allAround){
            if(g(e)==voxels.id('lava02')){//帖主把岩浆的方块名称写成了lava_02,正确的应该是lava02
                entity.hurt(100);
                break;//退出循环是为了防止多次检测到玩家碰撞
            }//如果检测到玩家碰到岩浆那么就直接KO掉
        }
    })
});

其实getEntityBounds这个函数是没用的)

点赞0


评论


呵呵0486呵呵0486

不会很卡吗()

onTick+querySelectorAll()

点赞0


评论


QC一二二一QC一二二一

顶顶顶

点赞0


评论


QC一二二一QC一二二一

顶顶顶

点赞0


评论


呵呵0486呵呵0486

喵d

点赞0


评论


ZNS_哪吒ZNS_哪吒

ddd()

点赞0


评论


治愈绾兮治愈绾兮

ddd

点赞0


评论


QC一二二一QC一二二一

顶顶顶

点赞0


评论


名字送冷吖O名字送冷吖O

顶顶顶

点赞0


评论


yee剑走天下yee剑走天下

喵d

点赞0


评论


DebugDynamoDebugDynamo

喵d

点赞0


评论


Weeb_ETOWeeb_ETO

DD

点赞0


评论