用户:
阿啊啊啊啊啊伟_ETO查看:0 回复:1 评论:0 创建时间:2021-12-04T10:58:31
最近有一些人问我: weeb你的那个黑暗战役的巫师代码到底是怎么弄的?我在我自己的地图里面都弄不起来。
现在公布源代码,其实就是将官方发的教程改一下,比如说模型的名字改成僵尸就行了。
/* 本代码实现的功能: 1. 僵尸追杀玩家, 并会对玩家造成伤害 2. 玩家可以点击僵尸进行反击 3. 玩家喵三秒后在空中随机的地点复活 使用说明: 请先在模型库中搜索一个叫做“僵尸"的模型,并放进地图里!不然会出错 */ const MeshScale = [0.05,0.05,0.05] function spawn() {//把生成僵尸的代码封装成函数 const e = world.createEntity({ mesh:'mesh/僵尸.vb', meshScale:MeshScale, collides:true, // 开启碰撞 gravity:true, // 开启重力 friction:0, // 关闭摩擦力 maxHp:200, hp:20, position:[ 64+(Math.random()-0.5) * 256, 24 + Math.random() * 256, 64+(Math.random()-0.5) * 256, ], }); e.addTag('僵尸'); e.enableDamage = false; e.onVoxelContact(({x,y,z,voxel})=>{ e.velocity.y = 0.5+Math.random()*0.9//碰到砖块就跳一下 }) e.onEntityContact(({other})=>{ if(other.isPlayer){//僵尸撞到玩家 other.hurt(40)//对玩家造成伤害 world.say(other.player.name+',被巫师勾了性命') } }) e.onDie(()=>{ e.destroy()//僵尸喵掉,实体消失!谢谢@1232RvE反馈 }) } for (let i = 0; i < 20; i++) {//开局生成一堆僵尸 spawn() } const Quat = new Box3Quaternion(0,0,0,1)// box引擎默认的旋转朝向 let allPlayers = []//所有玩家 let allZombies = []//所有僵尸 world.onTick(async ({tick}) => {//每秒16个tick if(tick%16===0){//每16个tick运行一次, 而不是每个tick都运行,节省性能 allPlayers = world.querySelectorAll('player') allZombies = world.querySelectorAll('.僵尸') } allZombies.forEach(async (e) => { let zomPos = e.position if(tick%11===0){//每11个tick运行一次, 而不是每个tick都运行,节省性能 let target = allPlayers.sort((a,b)=>{//僵尸寻找距离最近的玩家 return a.position.distance(zomPos)-b.position.distance(zomPos) })[0] if(target){//地图如果还有玩家 e.target = target//让僵尸记住要追杀的玩家 } } if(e.target && !e.target.destroyed){//如果要追杀的玩家还没有离开地图 var direction = e.target.position.sub(zomPos); //僵尸往玩家的方向矢量 var dist = direction.mag() //矢量的长度 var speed = 0.4+Math.random()*0.2 //速度0.2~0.5随机 e.velocity.x = direction.x*speed/dist e.velocity.z = direction.z*speed/dist // 让僵尸面向自己的前进方向 var orientation = Quat.rotateY(Math.atan2(e.velocity.z, e.velocity.x)) e.meshOrientation.copy(orientation) } }) })