用户:
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掉
}
})
});
今天的教程就到这啦
大佬勿喷()()
别吞排版了吧为了重新整理排版我吐了
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
评论