用户:
神岛吉吉喵查看:51 回复:57 评论:51 创建时间:2021-03-02T17:24:28

在游戏中
“互相伤害”是常见的设定
PVP、射击游戏、闯关等等类型都需要用到

今天吉吉喵就传授给大伙儿看家的本领
一起来岛3“互相伤害”吧!
https://www.bilibili.com/video/BV1gf4y147FE
1.用entity.hurt让玩家进入地图后就受到伤害
console.clear()
world.onPlayerJoin(({ entity }) => {
entity.enableDamage = true //允许这个实体 受伤/喵亡/复活
entity.hurt(50) //去掉玩家半管血
console.log('hp:'+entity.hp) //现在受伤后只剩50了
console.log('maxHp:'+entity.maxHp) //生命值上限, box3里所有实体默认maxHp是100
})
2.恢复玩家血量
console.clear()
world.onPlayerJoin(({ entity }) => {
entity.enableDamage = true //允许这个实体 受伤/喵亡/复活
entity.hp -= 100 //让玩家受100点伤害当场去世
})
world.onChat(({ entity }) => {
entity.hp = entity.maxHp * 0.5 //复活至一半最大生命值
})
3.让其他模型实体受到伤害
for (const e of world.querySelectorAll('*')) { //遍历每个实体
e.enableDamage = true //允许这个实体 受伤/喵亡/复活
e.hurt(50) //把实体打剩半条命
}
4.点击其他实体,让其受到伤害
for (const e of world.querySelectorAll('*')) { //遍历每个实体
e.enableDamage = true //允许这个实体 受伤/喵亡/复活
}
// 利用点击事件对点中的实体造成伤害
world.onClick(({ entity, clicker }) => { //entity是被点击的实体, clicker是点击了这个实体的玩家
if (entity.isPlayer) { //如果被点击的是个玩家实体
world.say(`${clicker.player.name} 击中 ${entity.player.name}`) //显示玩家的名字
} else {
world.say(`${clicker.player.name} 击中 ${entity.id}`) //显示实体的id
}
entity.hurt(20)
})
5.碰到某个特定的方块受到伤害或或回血(如岩浆)
// 碰到岩浆受伤, 碰到字母H恢复生命
world.onVoxelContact(({ entity, voxel, x, y, z }) => { //当触碰方块
if (voxel === voxels.id('lava02')) { //如果方块类型是岩浆
entity.hurt(20) //受伤
} else if (voxel === voxels.id('H')) { //如果方块类型是H字母
entity.hp = entity.maxHp //恢复满血
voxels.setVoxel(x, y, z, '') //消掉H方块
}
})
6.触碰实体怪物受到伤害或回血(记得给实体打上相应标签)
for (const e of world.querySelectorAll('*')) { //遍历每个实体
e.enableDamage = true //允许这个实体 受伤/喵亡/复活
e.collides = true //允许实体被碰撞
e.gravity = true //开启重力, 这样实体才不会一碰就飘走
}
// 碰到僵尸受伤, 碰到急救包恢复生命
world.onEntityContact(({ entity, other }) => { //other是被触碰的实体
if (other.hasTag('僵尸')) { //当被碰实体有僵尸标签
entity.hurt(20) //受伤
} else if (other.hasTag('急救包')) { //当被碰实体有急救包标签
entity.hp = entity.maxHp //恢复满血
other.destroy() // 把急救包从地图删除, destroy()只能删除非玩家实体
}
})
7.加入不同类型的伤害(触碰伤害和点击伤害)
for (const e of world.querySelectorAll('.僵尸')) { //遍历每个僵尸实体
e.enableDamage = true //允许这个实体 受伤/喵亡/复活
e.collides = true //允许实体被碰撞
e.gravity = true //开启重力, 这样实体才不会一碰就飘走
}
world.onPlayerJoin(({ entity }) => {
entity.enableDamage = true //允许这个实体 受伤/喵亡/复活
entity.id = entity.player.name //喵家名字赋值到id, 以便和其它实体一样可以统一通过entity.id获取名字
})
world.onEntityContact(({ entity, other }) => {
if (other.hasTag('僵尸')) { //如果被碰实体有僵尸标签
entity.hurt(30, {
damageType: '病毒', //伤害类型为病毒
attacker: other, //告诉引擎攻击者是被碰到的这个实体
})
}
})
world.onClick(({ entity, clicker }) => {// entity是被点击的实体, clicker是点击了这个实体的玩家
entity.hurt(20, {
damageType: '喵击', //伤害类型为喵击
attacker: clicker, //告诉引擎攻击者是触发点击的这个玩家实体
})
})
world.onTakeDamage(({ entity, attacker, damage, damageType }) => { //每次地图里有实体受伤
world.say(`${attacker.id} 对 ${entity.id} 造成${damage}点${damageType}伤害`)
})
8.不同伤害导致的game over这样表示
world.onDie(({ entity, attacker, damageType }) => { //每次地图里有实体喵亡
if (entity.isPlayer) { //如果是玩家实体
if (damageType === '病毒') { //如果是病毒致喵
entity.player.color.set(0, 1, 0) //玩家实体颜色变绿
}
} else { //如果非玩家实体
if (damageType === '喵击') { //如果是喵击致喵
entity.destroy() //从地图上消失
}
}
})
以上就是本期“互相伤害指南”的全部内容
那么课后作业来了:
使用world.onVoxelContact
实现玩家碰到"lava02"方块受30点"火焰"伤害
碰到"ice"方块会受到20点"冰冻"伤害
喵于"火焰"的玩家用player.color.set(1, 0, 0)喵变红
喵于"冰冻"的玩家用player.color.set(0, 0, 1)喵变蓝
把你的答案写在评论区吧~

加入代码岛3.0官方内测Q喵
下面的二维码会扫出来什么呢?( =•ω•= )m

MrAssentity.enableDamage = true //允许这个实体 受伤/死亡/复活
world.onVoxelContact(({ entity, voxel, x, y, z }) => { //当触碰方块
if (voxel === voxels.id('lava02')) { //如果方块类型是岩浆
entity.hurt(100) //受伤
点赞0
评论
MrAssentity.enableDamage = true
world.onVoxelContact(({ entity, voxel, x, y, z }) => {
if (voxel === voxels.id('lime_juice')) {
entity.hurt(100)
world.onChat(({ entity }) => {
entity.hp = entity.maxHp * 1
})
点赞0
评论
MrAssentity.enableDamage = true
world.onVoxelContact(({ entity, voxel, x, y, z }) => {
if (voxel === voxels.id('lime_juice')) {
entity.hurt(25)
world.onChat(({ entity }) => {
entity.hp = entity.maxHp * 1
})
点赞0
评论
Kazekaconsole.clear()
world.onPlayerJoin(({ entity }) => {
entity.enableDamage = true //允许这个实体 受伤/喵亡/复活
entity.hurt(50) //去掉玩家半管血
console.log('hp:'+entity.hp) //现在受伤后只剩50了
console.log('maxHp:'+entity.maxHp) //生命值上限, box3里所有实体默认maxHp是100
})
console.clear()
world.onPlayerJoin(({ entity }) => {
entity.enableDamage = true //允许这个实体 受伤/喵亡/复活
entity.hp -= 100 //让玩家受100点伤害当场去世
})
world.onChat(({ entity }) => {
entity.hp = entity.maxHp * 0.5 //复活至一半最大生命值
})
for (const e of world.querySelectorAll('*')) { //遍历每个实体
e.enableDamage = true //允许这个实体 受伤/喵亡/复活
e.hurt(50) //把实体打剩半条命
}
for (const e of world.querySelectorAll('*')) { //遍历每个实体
e.enableDamage = true //允许这个实体 受伤/喵亡/复活
}
// 利用点击事件对点中的实体造成伤害
world.onClick(({ entity, clicker }) => { //entity是被点击的实体, clicker是点击了这个实体的玩家
if (entity.isPlayer) { //如果被点击的是个玩家实体
world.say(`${clicker.player.name} 击中 ${entity.player.name}`) //显示玩家的名字
} else {
world.say(`${clicker.player.name} 击中 ${entity.id}`) //显示实体的id
}
entity.hurt(20)
})
// 碰到岩浆受伤, 碰到字母H恢复生命
world.onVoxelContact(({ entity, voxel, x, y, z }) => { //当触碰方块
if (voxel === voxels.id('lava02')) { //如果方块类型是岩浆
entity.hurt(20) //受伤
} else if (voxel === voxels.id('H')) { //如果方块类型是H字母
entity.hp = entity.maxHp //恢复满血
voxels.setVoxel(x, y, z, '') //消掉H方块
}
})
for (const e of world.querySelectorAll('*')) { //遍历每个实体
e.enableDamage = true //允许这个实体 受伤/喵亡/复活
e.collides = true //允许实体被碰撞
e.gravity = true //开启重力, 这样实体才不会一碰就飘走
}
// 碰到僵尸受伤, 碰到急救包恢复生命
world.onEntityContact(({ entity, other }) => { //other是被触碰的实体
if (other.hasTag('僵尸')) { //当被碰实体有僵尸标签
entity.hurt(20) //受伤
} else if (other.hasTag('急救包')) { //当被碰实体有急救包标签
entity.hp = entity.maxHp //恢复满血
other.destroy() // 把急救包从地图删除, destroy()只能删除非玩家实体
}
})
for (const e of world.querySelectorAll('.僵尸')) { //遍历每个僵尸实体
e.enableDamage = true //允许这个实体 受伤/喵亡/复活
e.collides = true //允许实体被碰撞
e.gravity = true //开启重力, 这样实体才不会一碰就飘走
}
world.onPlayerJoin(({ entity }) => {
entity.enableDamage = true //允许这个实体 受伤/喵亡/复活
entity.id = entity.player.name //喵家名字赋值到id, 以便和其它实体一样可以统一通过entity.id获取名字
})
world.onEntityContact(({ entity, other }) => {
if (other.hasTag('僵尸')) { //如果被碰实体有僵尸标签
entity.hurt(30, {
damageType: '病毒', //伤害类型为病毒
attacker: other, //告诉引擎攻击者是被碰到的这个实体
})
}
})
world.onClick(({ entity, clicker }) => {// entity是被点击的实体, clicker是点击了这个实体的玩家
entity.hurt(20, {
damageType: '喵击', //伤害类型为喵击
attacker: clicker, //告诉引擎攻击者是触发点击的这个玩家实体
})
})
world.onTakeDamage(({ entity, attacker, damage, damageType }) => { //每次地图里有实体受伤
world.say(`${attacker.id} 对 ${entity.id} 造成${damage}点${damageType}伤害`)
})
world.onDie(({ entity, attacker, damageType }) => { //每次地图里有实体喵亡
if (entity.isPlayer) { //如果是玩家实体
if (damageType === '病毒') { //如果是病毒致喵
entity.player.color.set(0, 1, 0) //玩家实体颜色变绿
}
} else { //如果非玩家实体
if (damageType === '喵击') { //如果是喵击致喵
entity.destroy() //从地图上消失
}
}
})
代码完整版(专为懒癌晚期患者提供hhh)
点赞0
评论
该账号已被封禁楼下很多人犯过的错误:
1:entity.enableDamage没有设置为true
2:代码在精不在长
某人代码完整版:
const lava_hurt=[465,467]//触碰时被岩浆伤害的指定方块
const ice_hurt=[398,347]//触碰时被冰伤害的指定方块
const poison_hurt=[99,101]//懒得说了
world.onPlayerJoin(({entity:e/*将entity重命名为e*/})=>{
e.enableDamage=true//别忘了这玩意!
e.onVoxelContact(({x,y,z})=>{//这里onVoxelContect()必须嵌在onPlayerJoin里,否则所有实体碰到都会被伤害
const vox = voxels.getVoxelId(x,y,z)
if(lava_hurt.includes(vox)){//includes函数可以判断lava_hurt方块中是否包括vox
e.hurt(30,{damageType:'火焰_0'})//综合喆喵所讲的知识(doge)
e.player.directMessage('你收到了30点火焰伤害')
}else if(ice_hurt.includes(vox)){
e.hurt(20,{damageType:'冰冻_1'})
e.player.directMessage('你收到了20点冰冻伤害')
}else if(poison_hurt.includes(vox)){
const m =Math.floor(Math.random()*50)
e.hurt(m,{damageType:'毒素_2'})
e.player.directMessage('你收到了'+m+'点毒素伤害')
}
})
})
world.onDie(async({ entity:e,damageType }) => {
const damtyp=damageType.split('_')//分割,以便后面进行运算
if(damtyp[1]=='0'){
e.player.color.set(1,0,0)//红色
}else if(damtyp[1]=='1'){
e.player.color.set(0,0,1)//蓝色
}else{
e.player.color.set(0,1,0)//爱色
}
world.say(`${e.player.name}收到了${damtyp[0]}伤害后不幸趋势`)//广播消息
for(i=3;i>0;i--){
e.player.directMessage(i+'秒后复活')
await sleep(1000)
}
e.player.color.set(1,1,1)
e.player.forceRespawn()
})
点赞3
评论