猫史档案馆


【岛3活动】搬砖喵看家代码公布:粒子大乱斗!

用户:神岛吉吉喵神岛吉吉喵查看:40 回复:55 评论:40 创建时间:2021-03-24T19:22:03


center_image

大神在线写代码第二期圆满结束!

这期所有的代码如下

26号的创作节用起来!

Q1:我想让一个粒子朝玩家面向的方向发射怎么办?

async function loop(entity, fn) {
    while(!entity.destroyed){ //不断循环直到实体不在场景里
        fn()
        await sleep(60) //每60毫秒执行一次fn, 相当于一秒内能执行16.666次
    }
}
const RED = new Box3RGBColor(10, 2, 2) //发光的红色
world.onPlayerJoin(({ entity }) => {
    entity.particleRate = 80 //每秒发出80个粒子
    entity.particleLifetime = 2 //每个粒子存活2秒
    entity.particleSize = [2, 2, 2, 2, 2] //粒子在5个阶段的大小都是2
    entity.particleColor = [RED, RED, RED, RED, RED] //粒子在5个阶段的颜色都是红色
    loop(entity, () => { //不断更新玩家身上粒子的朝向
        entity.particleVelocity = entity.player.facingDirection.scale(50) //粒子朝玩家面向的方向50倍速移动
    })
})

Q2: 我想要实现子弹发射效果,以及飞刀碰到实体减血量的效果

// Q1: 我想要实现子弹发射效果,需要全部的代码
// Q2: 我想要飞刀碰到实体减血量的效果


//注意, mesh/刀.vb的模型需要在模型编辑器里将它旋转到刀头指向X轴的正方向

const MeshScale = [1 / 16, 1 / 16, 1 / 16] //正常的模型缩放比例
const Quat = new Box3Quaternion(0, 0, 0, 1) //默认的旋转状态

world.onPress(async ({ entity, button }) => {

    if (button === Box3ButtonType.ACTION0) {
        const d = entity.player.facingDirection //玩家的朝向
        const knife = world.createEntity({
            mesh: 'mesh/刀.vb',
            meshScale: MeshScale,
            collides: true, // 开启碰撞
            gravity: false, // 不受重力影响
            position: entity.position, // 在玩家的位置生成飞刀
            velocity: d.scale(2), // 飞刀的初速度是玩家朝向向量的2倍
            meshOrientation: Quat.rotateY(Math.atan2(d.z, d.x)), // 刀头指向玩家的朝向
        })
        knife.id = entity.player.userKey //将小刀的id设置成玩家userKey, 便于碰撞过滤器识别
        knife.onEntityContact(({ other }) => {//每当飞刀碰到另一个实体
            other.hurt(10)//被碰实体受10点伤害
        })
        await sleep(2000)//等2秒后
        knife.destroy()//清除飞刀, 防止飞刀数量太多超过服务器负载
    }
    if(button===Box3ButtonType.CROUCH){
        entity.hp += 20
    }
})

world.onPlayerJoin(({ entity }) => { //当玩家进入地图时
    if(entity.player.name==='搬砖喵'||entity.player.name==='吉吉喵'){
        entity.addTag('ghost') //本喵不受攻击
    }
    entity.enableDamage = true //允许这个玩家受伤
    entity.id = entity.player.userKey//把userKey作为玩家的id
    world.addCollisionFilter('#' + entity.id, '#' + entity.id)//让id跟玩家id一样的实体不会相互碰撞, 比如玩家的飞刀不会碰到玩家, 自己的飞刀之间也不会碰撞
})
world.addCollisionFilter('.ghost', '*')

world.onPlayerLeave(({ entity }) => { //当玩家离开地图时
    world.removeCollisionFilter('#' + entity.id, '#' + entity.id)//取消这个玩家的碰撞过滤器
})

world.onDie(async ({ entity }) => {
    await sleep(3000)
    entity.hp = entity.maxHp //复活
})

Q3: 我需要碰到lime_juice方块变成绿色,并减去一半的血的效果,需要伤害代码

world.onPlayerJoin(({ entity }) => {
    entity.enableDamage = true //允许这个玩家受伤
    entity.onFluidEnter(({ voxel }) => { //每当玩家进入液体方块
        if (voxel === voxels.id('lime_juice')) { //如果液体方块类型是lime_juice
            entity.player.color.set(0, 1, 0) //玩家颜色设成绿色
            entity.hurt(entity.maxHp * 0.5) //减去一半的生命
        }
    })
})

Q4: 我想要实现飞机在空中转弯和飞行效果,需要这部分代码

//注意, 飞机的模型需要在模型编辑器里将它旋转到机头指向X轴的正方向
async function loop(entity, fn) {
    while (!entity.destroyed) { //不断循环直到实体不在场景里
        fn()
        await sleep(60) //每60毫秒执行一次fn, 相当于一秒内能执行16.666次
    }
}
const Quat = new Box3Quaternion(0, 0, 0, 1) //默认的旋转状态
function flyAround(plane) {
    plane.gravity = false //取消重力对飞机的影响
    let speed = 0.1 //飞机的前进速度
    let rotation = 0 //飞机的旋转弧度
    let rotSpeed = 0.1 //飞机当前的旋转速度
    loop(plane, () => {
        const sdx = Math.cos(rotation) * speed //用余弦计算x轴上的速度
        const vz = Math.sin(rotation) * speed //用正弦计算z轴上的速度
        plane.velocity.set(sdx, 0, vz) //更新飞机当前的速度
        plane.meshOrientation = Quat.rotateY(rotation) //按当前旋转弧度更新飞机的朝向
        if (rotation > Math.PI || rotation < -Math.PI) {//当飞机旋转到达完全相反的方向(180度)
            rotSpeed *= -1 //飞机改变旋转方向
        }
        rotation += rotSpeed //更新飞机的旋转弧度
    })
}
const plane = world.querySelector('#飞机-1') //获取场景中的飞机实体
flyAround(plane) //让飞机动起来

Q5:粒子攻击特效(Q2的改良版)

const MeshScale = [1 / 16, 1 / 16, 1 / 16] //正常的模型缩放比例
const Quat = new Box3Quaternion(0, 0, 0, 1) //默认的旋转状态
const RED = new Box3RGBColor(10, 2, 2) //发光的红色
world.onPress(async ({ entity, button }) => {

    if (button === Box3ButtonType.ACTION0) {
        const d = entity.player.facingDirection //玩家的朝向
        const knife = world.createEntity({
            meshScale: MeshScale,
            collides: true, // 开启碰撞
            gravity: false, // 不受重力影响
            position: entity.position, // 在玩家的位置生成飞刀
            velocity: d.scale(2), // 飞刀的初速度是玩家朝向向量的2倍
            meshOrientation: Quat.rotateY(Math.atan2(d.z, d.x)), // 刀头指向玩家的朝向
            particleRate: 20, //每秒发出80个粒子
            particleLifetime: 2, //每个粒子存活2秒
            particleSize: [2, 2, 2, 2, 2], //粒子在5个阶段的大小都是2
            particleColor: [RED, RED, RED, RED, RED], //粒子在5个阶段的颜色都是红色
            // particleTarget: entity,
            particleVelocity: d.scale(-2),
            bounds: [0.2, 0.2, 0.2],// 子弹实体0.2个方块大小
        })
        knife.id = entity.player.userKey //将小刀的id设置成玩家userKey, 便于碰撞过滤器识别
        knife.onEntityContact(({ other }) => {//每当飞刀碰到另一个实体
            other.hurt(10)//被碰实体受10点伤害
        })
        await sleep(2000)//等2秒后
        knife.destroy()//清除飞刀, 防止飞刀数量太多超过服务器负载
    }

})

world.onPlayerJoin(({ entity }) => { //当玩家进入地图时
    if (entity.player.name === '搬砖喵' || entity.player.name === '吉吉喵') {
        entity.addTag('ghost') //本喵不受攻击
    }
    entity.enableDamage = true //允许这个玩家受伤
    entity.id = entity.player.userKey//把userKey作为玩家的id
    world.addCollisionFilter('#' + entity.id, '#' + entity.id)//让id跟玩家id一样的实体不会相互碰撞, 比如玩家的飞刀不会碰到玩家, 自己的飞刀之间也不会碰撞
})
world.addCollisionFilter('.ghost', '*')

world.onPlayerLeave(({ entity }) => { //当玩家离开地图时
    world.removeCollisionFilter('#' + entity.id, '#' + entity.id)//取消这个玩家的碰撞过滤器
})

world.onDie(async ({ entity }) => {
    await sleep(3000)
    entity.hp = entity.maxHp //复活
})

开发API文档:https://docs.box3.codemao.cn/

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

官网:box3.codemao.cn

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

center_image


回复

上一页1 页 / 共 2下一页
SSR级学霸_拉文克劳SSR级学霸_拉文克劳

沙发

点赞0


评论


我爱宇宙本人我爱宇宙本人

地板

点赞0


评论


隐日青空隐日青空

板凳2333

点赞0


评论


CJP理科生全息碎影孙悟空CJP理科生全息碎影孙悟空

前排!

点赞0


评论


AlcalaAlcala

前排

点赞0


评论


我爱宇宙本人我爱宇宙本人

龙椅()(炸掉前面的)

点赞0


评论


治愈绾兮治愈绾兮

前排!

点赞0


评论


ZNS_哪吒ZNS_哪吒

前排

点赞0


评论


­­­­­­­­­­­­­­

前排!

点赞0


评论


梦里觅深海梦里觅深海

板凳

点赞0


评论


亿只懒Ink亿只懒Ink

前排!

点赞0


评论


SKQASKQA

前排

看到两个喵

喵屏蔽词

点赞0


评论


神兽喵神兽喵

前排?

点赞0


评论


SKQASKQA

反正学到了

点赞0


评论


韵律源点Arcaea韵律源点Arcaea

好耶我最近正好在研究dio的技能,时间停止和飞刀居然都被做出来了好耶!

点赞0


评论


一勺小汤_纪念号一勺小汤_纪念号

又是屏蔽词!

点赞0


评论


神岛吉吉喵神岛吉吉喵

后天就公布创作节比赛规则啦,代码已经有了

队友还不快找起来~

https://shequ.codemao.cn/community/368493

emotion_编程猫_加油

 

 

点赞0


评论


YLS菊花黄YLS菊花黄

后排

点赞0


评论


AbnormalLOGAbnormalLOG

喵是什么?

点赞0


评论


面具狐狸云绾兮面具狐狸云绾兮

我在想新皮肤会不会是我跟吉吉喵说的狐狸皮肤()

点赞0


评论


帅气的剑杰帅气的剑杰

ye

点赞0


评论


神兽喵神兽喵

好耶

点赞0


评论


MrAssMrAss

有我的问题的回答!

点赞0


评论


星海茫茫_tammy星海茫茫_tammy

有人抱团组队吗???

点赞0


评论


cool-creepercool-creeper

那个粒子攻击特效是我提出的o(* ̄︶ ̄*)o

点赞2


评论


一个会飞的煎鸡蛋一个会飞的煎鸡蛋

为啥我的代码报错了?center_image

点赞0


评论


IaeaIaea

666  

点赞0


评论


Architect_皮卡awaArchitect_皮卡awa

点赞0


评论


AB骉AlobokAB骉Alobok

https://box3.codemao.cn/e/3d1ed9fe89fa894f6fcf

报错!

点赞0


评论


AlcalaAlcala

点赞0


评论