目录

介绍

用模型作为存档点

准备

代码

思路 

用方块作为存档点

准备

代码

思路

最后总结 



用模型作为存档点

准备

现在地图中准备3个出身点,两个岩浆地。

基于python的地铁跑酷游戏_赋值

岩浆名为"lava02" 换成其他的方块也是可以的,或者换成模型也还是可以的。

存档模型的名字如下

存档点-1   存档点-2    存档点-3

但是,当你换成模型之后,代码就不一样了。

代码

地图准备完毕,开始构建代码吧

先是查找所有存档模型

for (const e of world.querySelectorAll("*")){  //查找所有模型
    if (e.id.startsWith("存档点")){   //添加符合条件判断
        e.collides = true;  //开启碰撞
        e.fixed = true;   //定住,防止玩家碰到模型之后将模型推开
        e.onEntityContact(async({other})=>{  //检测但玩家碰到此模型之后就存档
            if (e.position !== other.position.spawnPoint){
                other.player.directMessage("存档成功")  //给玩家发送提示
                other.player.spawnPoint = e.position  //修改玩家的出身点
            }
        })
    }
}

现在找到所有模型之后,就要进行玩家的死亡碰撞判断了。

world.onVoxelContact(({entity,voxel})=>{
    const voxelName = voxels.name(voxel) //将玩家碰到方块赋值给常量voxelName
    if (voxelName == "lava02"){  //检测玩家碰到的模型是否为lava02
        entity.position.copy(entity.player.spawnPoint)  //将玩家移到存档点
    }
})

好了,现在所有代码都写完了,现在看一下所有代码

for (const e of world.querySelectorAll("*")){  //查找所有模型
    if (e.id.startsWith("存档点")){   //添加符合条件判断
        e.collides = true;  //开启碰撞
        e.fixed = true;   //定住,防止玩家碰到模型之后将模型推开
        e.onEntityContact(async({other})=>{  //检测但玩家碰到此模型之后就存档
            if (e.position !== other.position.spawnPoint){
                other.player.directMessage("存档成功")  //给玩家发送提示
                entity.player.spawnPoint = e.position  //修改玩家的出身点
            }
        })
    }
}

world.onVoxelContact(({entity,voxel})=>{
    const voxelName = voxels.name(voxel) //将玩家碰到方块赋值给常量voxelName
    if (voxelName == "lava02"){  //检测玩家碰到的模型是否为lava02
        entity.position.copy(entity.player.spawnPoint)  //将玩家移到存档点
    }
})

思路 

接下来给大家讲解一下思路

基于python的地铁跑酷游戏_游戏_02

此时有人就会有疑问,为什么我要将他存在entity.player.spawnPoint()的常量中呢?难道我就不能自己创建一个变量来存储吗?

其实原因很简单,var spawnPoint变量是全局的,是面向所有玩家的

基于python的地铁跑酷游戏_游戏_03

用方块作为存档点

准备

伤害方块:lava02  存档方块:stone_wall 

代码

world.onVoxelContact(({entity,voxel})=>{
    const voxelName = voxels.name(voxel)
    if(voxelName == "lava02"){ //判断碰到岩浆(碰到名为lava02)
        entity.position.copy(entity.position.spawnPoint)//强制玩家重生  如果为真
    }
    else if (voxelName == "stone_wall"){
        entity.position.spawnPoint = new Box3Vector3(entity.position.x,entity.position.y,entity.position.z)//将玩家的出身点设置为我们碰到名为“stone_wall”这个方块时的位置
    }
})

这么样,是不是非常简单?

思路

最后总结 

创建带有entity类的属性的变量,是只面向单个玩家的,而不会面向多个玩家,而没有带有entity类的属性的变量,是面向所有玩家的,所有玩家都会操控这个变量,也就是说一个创建了一个给玩家的私有变量里面的值只有一个玩家可以拥有。