猫史档案馆


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

用户:神岛吉吉喵神岛吉吉喵查看:6676 回复: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


评论

可以加入我们队吗?!@#¥%……&*()

!@#¥%……&*

&*

&?

可以呀 发链接

反正都是混皮肤

https://box3.codemao.cn/e/e407e61574ea37a978d2


韵律源点Arcaea韵律源点Arcaea

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

点赞0


评论

哇knife.id可以设置成userKey是我没想到的

顺手白嫖走玩家朝向代码()

()

要我做模型吗()比如压路机()

压路机就算了()那个太难做()但是飞刀你可以做一下()

最近在搞武器的模型模板()要用的时候直接从电脑导入画个皮肤就行()

明天就开始了你有团了吗()

我很懒的()所以又要去找大腿了()

可以加入我们队吗?!?!@#¥%……&*()


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

又是屏蔽词!

点赞0


评论


神岛吉吉喵神岛吉吉喵

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

队友还不快找起来~

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

emotion_编程猫_加油

 

 

点赞0


评论

捉!

能开始做了吗

捕捉某只狼

吉吉喵,岛三有随机数的代码吗

代码报错了

吉吉喵可以来一下我图吗https://box3.codemao.cn/e/84e99f8d3311adb39dfd

阿吉问个问题,Q2的代码如何加入仰角


YLS菊花黄YLS菊花黄

后排

点赞0


评论


AbnormalLOGAbnormalLOG

喵是什么?

点赞0


评论

换了个名字好了... 原本是v x,表示x轴上的速度v


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

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

点赞0


评论

这这这


帅气的剑杰帅气的剑杰

ye

点赞0


评论


神兽喵神兽喵

好耶

点赞0


评论


MrAssMrAss

有我的问题的回答!

点赞0


评论

这个头像和我之前看到的那个毁图的人的头像差不多呀。


星海茫茫_tammy星海茫茫_tammy

有人抱团组队吗???

点赞0


评论

WOWOWOOWOW

我抱团


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


评论