用户:
追梦喵aowC查看:24 回复:24 评论:24 创建时间:2021-09-04T21:57:25
哦吼吼吼吼吼)这里是sha雕追梦的小课堂(滑稽)
由于开学了作业多所以气得我天天吃作业)
由于追梦光顾着吃作业所以更新难免会不及时)可能下次更新就是十月了))))
话不多说进入正题)
首先老规矩我们先把框架抬上来
world.onPress(async({ button, entity, raycast }) => { //事件(玩家按下按钮)
if(button ==='action0'){//如果这个按钮是左键
}
})
然后在玩家的位置放置一个TNT的模型,让他往鼠标方向移动
world.onPress(async({ button, entity, raycast }) => { //事件
if(button ==='action0'){
const ball =world.createEntity({//放个模型
mesh:"mesh/tnt.vb",
collides:true,
meshScale:[0.06,0.06,0.06],//模型缩放
position:[entity.position.x, entity.position.y+, entity.position.z],
})
ball.velocity.x += raycast.direction.x*2; ball.velocity.y += raycast.direction.y*2; ball.velocity.z += raycast.direction.z*2;//设置速度
}
})
这时候就轮到奇妙的bug出场了)
因为放置的位置在玩家的正中间,所以有百分之80的几率会在玩家身上弹开
这里有种解决方法是让tnt模型等待几秒再开启碰撞,但是如果玩家想要炸自己)朝地面发射——
TNT就穿墙了)
所以这里在放置的时候可以让它先朝鼠标的方向走一点,这样就不至于弹开了
world.onPress(async({ button, entity, raycast }) => { //事件
if(button ==='action0'){
const ball =world.createEntity({//放个模型
mesh:"mesh/tnt.vb",
collides:true,
meshScale:[0.06,0.06,0.06],
position:[entity.position.x+raycast.direction.x, entity.position.y+raycast.direction.y, entity.position.z+raycast.direction.z],//此处有变化
})
ball.velocity.x += raycast.direction.x*2; ball.velocity.y += raycast.direction.y*2; ball.velocity.z += raycast.direction.z*2;
}
})
接下来就是灵魂一步了(敲黑板)我们要给它加上炸掉方块的效果
如果用for循环设置范围炸出一个正方形就会肥肠美观)

好吧美观到我不忍直视)
所以聪明的我就搬来了造球代码))))我们可以用造球代码在爆炸的位置造一个球,只不过方块是空气
async function sphere(vox, cx, cy, cz, radius){//参数分别是方块、x,y,z和圆的半径
let xend = cx+radius
let yend = cy+radius
let zend = cz+radius
for(let x=cx-radius;x<=xend;x++){
for(let y=cy-radius;y<=yend;y++){
for(let z=cz-radius;z<=zend;z++){
let dx = x-cx;
let dy = y-cy;
let dz = z-cz;
if(Math.round(Math.sqrt(dx*dx+dy*dy+dz*dz)) <= radius){
voxels.setVoxel(x,y,z,vox)
}
}}}
}
world.onPress(async({ button, entity, raycast }) => { //事件
if(button ==='action0'){
const ball =world.createEntity({//放个模型
mesh:"mesh/tnt.vb",
collides:true,
meshScale:[0.06,0.06,0.06],
position:[entity.position.x+raycast.direction.x, entity.position.y+raycast.direction.y, entity.position.z+raycast.direction.z],
})
ball.onVoxelContact(({ x, y, z, voxel }) => {//TNT碰到了方块
sphere('air',ball.position.x,ball.position.y,ball.position.z,3)//造一个空气球
ball.destroy()//删除TNT
});
ball.velocity.x += raycast.direction.x*2; ball.velocity.y += raycast.direction.y*2; ball.velocity.z += raycast.direction.z*2;
}
})
所以)))
伟大的TNT特效就此诞生!(鼓掌!~)
ps:作业太多搞的人都傻了所以有点抽风(doge)
好吧回到正题,到这里基本的功能就实现了,如果想增大爆炸范围或者增加伤害自行在原程序上做亿点点小改变就行了(滑稽)
下面是展示图)因为本喵过于手残所以没有抓拍到瞬间)
如果觉得不够炫你也可以给它加个粒子特效或者爆炸伤害之类的)十点的我太懒了)不想做了)
因为之前做kitten习惯了图形化的理解方式)如有错误欢迎批评指正