用户:
ACL番茄炒蛋查看:0 回复:3 评论:0 创建时间:2023-02-01T10:11:18
————————防窥线————————
在虚空跑酷游戏中,我们经常会发现,作者不会把存档点贴着方块放,而是比方块高出2~3个方块(如下图所示)。

这样做是为了让玩家复活的时候,不会因为穿模而掉入虚空。而会让玩家穿模掉入虚空,是因为没有掉入虚空的判断代码,所以存档位置设为的是存档点模型位置。
所以,此类存档代码应为:
//这样做,踩到存档点时存档位置就是模型位置了
for (const e of world.querySelectorAll('*')) {//遍历所有实体并判断是否为存档点
if (e.id.startsWith('地砖')) {
e.collides = true//打开碰撞并设置不可推动
e.fixed = true
e.onEntityContact(({other}) => {//碰撞事件触发
if (other.isPlayer) {//判断碰撞者是否为玩家实体
other.player.spawnPoint = e.position //将重生点设为存档点位置
other.player.directMessage('到达新的存档点')
}
})
}
}
这样也可以免掉读档代码,但是……存档点不贴这方块放,也不美观吧……
解决方案1:
既然API里本身没有掉入虚空的判断,那就自己做一个呀!(该代码需要与以上代码连用才能生效)
world.onTick(() => {//游戏每时每刻检查
world.querySelectorAll("player").forEach((entity)=>{//遍历所有是玩家的实体
if (8 < entity.position.y && 20 > entity.position.y) {//判断是否掉入虚空
entity.player.directMessage(entity.player.name+' 掉 入 虚 空')
entity.position.copy(entity.player.spawnPoint)
entity.position.y+=4//存档点上方复活
}
})
});
但是,地图中即使没有写代码,掉入虚空也会回到存档点。我们就可以利用它,省略掉读档代码。
看解决方式2↓
解决方式2:
不需要回档代码,将存档位置提前设置好。
作者发现这个解决方案前,在bilibili上还看到了路卡的存档代码。
他是以一个方块为存档点来存档的。
当然,不推荐这种存档方式,也不精准。
大家可以想一下,如果存档的时候我不是在y轴方向存的档,那我回档的时候不就会在方块旁边复活?
于是我就参考他的存档方式,把这种存档带进了模型存档中,并做了改良。
for (const e of world.querySelectorAll('*')) {
if (e.id.startsWith('地砖')) {
e.collides = true
e.fixed = true
e.onEntityContact(({other}) => {
if (other.isPlayer) { other.player.spawnPoint.set(e.position.x,other.position.y,e.position.z)
//存档时,我把存档位置的x和z坐标设为了存档点坐标,这样回档时就能复活在存档点中间
//存档位置的y坐标则设为了玩家的y坐标,便可以让回档时不会穿模掉下去
other.player.directMessage('到达新的存档点')
}
})
}
希望我的教程能帮到你!
(tips:如发现有报错,请及时反馈在评论区哟!
反馈格式:我发现第…段代码有报错,报错内容…
最好还能加个图片!)