猫史档案馆


【久违的API系列教程】来啊,互相伤害吧!

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


center_image

 

在游戏中

“互相伤害”是常见的设定

PVP、射击游戏、闯关等等类型都需要用到

center_image

今天吉吉喵就传授给大伙儿看家的本领

一起来岛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)喵变蓝

把你的答案写在评论区吧~

emotion_编程猫_点赞

加入代码岛3.0官方内测Q喵

官网:box3.codemao.cn

下面的二维码会扫出来什么呢?( =•ω•= )m

center_image


回复

上一页1 页 / 共 2下一页
SKQASKQA

沙发!

点赞0


评论


荷花编程荷花编程

板凳

点赞0


评论


醉醉白凰醉醉白凰

地板

点赞0


评论


ZNS_RemytowerJimmyZNS_RemytowerJimmy

地下室

点赞0


评论


AlcalaAlcala

前排

点赞0


评论


你好2050_反防沉迷_反岛三出图形化你好2050_反防沉迷_反岛三出图形化

前排

点赞0


评论


GZ006GZ006

大前排

点赞0


评论


Chengxuyee_已退Chengxuyee_已退

entity.hurt(10, {attacker: entity,});

点赞0


评论


YOF冇人GGYOF冇人GG

空气

点赞0


评论


南方一霸南方一霸

喵于火焰那不就是烧烤了吗?emotion_doge

点赞1


评论


T不减不等于T不减不等于

代码岛用户,喵变了emotion_doge

点赞0


评论


lon江航lon江航

emotion_编程猫_点赞

点赞0


评论


YLS菊花黄YLS菊花黄

后排

 

点赞0


评论


望_庐山望_庐山

那么问题来了,如果我一只脚踩着火焰一只脚踩着冰块会怎么样emotion_doge

点赞0


评论


Mellin_AmpMellin_Amp

API教程非常好

但吉吉喵为什么要放DNA里的那条团长的街道啊emotion_doge

点赞2


评论


我是曲奇饼干我是曲奇饼干

这个看家本领?!

点赞0


评论


YKS夜晚的星空YKS夜晚的星空

goooooooooooooooooooood

点赞0


评论


MrAssMrAss

针不戳

点赞0


评论


MrAssMrAss

entity.enableDamage = true //允许这个实体 受伤/死亡/复活

world.onVoxelContact(({ entity, voxel, x, y, z }) => { //当触碰方块

    if (voxel === voxels.id('lava02')) { //如果方块类型是岩浆

        entity.hurt(100) //受伤

点赞0


评论


MrAssMrAss

entity.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


评论


你好2050_反防沉迷_反岛三出图形化你好2050_反防沉迷_反岛三出图形化

吉吉喵要知道要是你的帖子没有前缀名标题就引战了emotion_doge

点赞0


评论


MrAssMrAss

entity.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


评论


KazekaKazeka

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
})
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


评论


谁告诉我类型为布尔值的返回值怎么用啊???

点赞0


评论


嘉豪从不破防嘉豪从不破防

呃呃呃呃呃呃e

点赞0


评论


爱笑的赤星芽芽牛爱笑的赤星芽芽牛

收藏一下

点赞0


评论


霜雾霜雾

终于找到帖子了(doge)

点赞0


评论


IaeaIaea

666

点赞0


评论


fomqfomq

谁能说说怎么取消玩家的攻击功能???

点赞0


评论