猫史档案馆


【起床战争】如何写一个类似起床的资源收集

用户:卑微OIer卑微OIer查看:5 回复:4 评论:5 创建时间:2022-07-24T09:40:36


world.addCollisionFilter('player', '.resourses');//取消碰撞
world.addCollisionFilter('.resourses', '.resourses');//取消碰撞
const resourceVox = [299, 289, 285, 287]//方块类型,资源点方块一定要放在里面
let resource = [
    {
        name: '铁资源点1', // 填入资源点的名称,不能有重复
        pos: new Box3Vector3(0, 8, 0)/*资源点的位置*/, ct: [
            { create: '铁锭', delay: 1, maxCD: 1 }, // 产出的物资 maxCd表示有每8*maxCd tick后产出一次 delay最好和maxCd同值
            { create: '金锭', delay: 4, maxCD: 4 },],//和上面一样
        hasThings: [], color: 0 // hasThings表示有多少东西 color表示资源点的颜色 颜色位于 resourseVox 里面 为白色,黄色,靛蓝,绿发光方块
    },
]
let timer = 0
for (let i = 0; i < resource.length; i++) { //放置资源点,最好别动这几行
    const e = resource[i];
    voxels.setVoxelId(e.pos.x, e.pos.y, e.pos.z, resourceVox[e.color])
}

world.onTick(({ tick }) => {
    world.querySelectorAll(".resourses").forEach((entity) => {//资源点的旋转,最好别动 但是agn可以,表示旋转的速度
        entity.meshOrientation.x = Math.sin(entity.agn * 180 / Math.PI);
        entity.meshOrientation.z = Math.cos(entity.agn * 180 / Math.PI);
        entity.agn += 0.0003;
    })
    if (tick % 8 !== 0) return; //timer计时器
    timer++;
    //资源点生成
    resource.forEach((res) => { // 生成代码,最好不要动
        for (let i = 0; i < res.ct.length; i++) {
            if (res.ct[i].delay <= 0) {
                res.ct[i].delay = res.ct[i].maxCD;
                res.hasThings.push(res.ct[i].create);
                if (res.hasThings.length <= 20) {
                    const m = world.createEntity({
                        mesh: `mesh/${res.ct[i].create}.vb`,
                        position: new Box3Vector3(res.pos.x + Math.random() * 1.5, res.pos.y + 1.5, res.pos.z + Math.random() * 1.5),
                        meshScale: [0.05, 0.05, 0.05],
                        collides: true,
                        fixed: false,
                        gravity: true,
                        id: res.name
                    })
                    m.velocity.y += 0.3;
                    m.addTag('resourses');
                    Object.assign(m, { agn: 0 });
                }
            } else res.ct[i].delay -= 1;
        }
    })
})
world.onPlayerJoin(({entity})=>{ // 获取资源
    entity.onVoxelContact(({ x, y, z }) => {
        if (resourceVox.includes(voxels.getVoxelId(x, y, z))) //是资源点
            resource.forEach((res) => {
                if (entity.position.distance(res.pos) < 3) { //防止隔空获得资源
                    console.log(entity.player.name, res.hasThings)
                    //玩家获取资源的代码可以放在这里
                    res.hasThings = [];
                    world.querySelectorAll(`#${res.name}`).forEach((e) => {
                        e.destroy();//销毁实体
                    })
                    //或者这里
                }
            })
    });
})


回复

上一页1 页 / 共 1下一页
卑微OIer卑微OIer

备注,需要相应的资源的模型,比如需要铁锭,就需要 mesh/铁锭.vb 的模型,不能含有其他字符

点赞0


评论


卑微OIer卑微OIer

这个帖子和真正的起床没有任何关系,没有盗取代码别想多

点赞0


评论


十殿阎王十殿阎王

az

点赞0


评论


yee剑走天下yee剑走天下

()()()

点赞0


评论