猫史档案馆


【神奇代码岛代码教程】如何做出像MC一样的拾取物品

用户:追梦ez追梦ez查看:874 回复:21 评论:11 创建时间:2023-03-11T13:18:55


上期我们讲了如何做出鸡块旋转的效果

链接:https://shequ.codemao.cn/wiki/forum/530959

但是生成出来的鸡块并不能像MC里的掉落物一样可拾取

这期我就来教大家

如何做出像MC一样的拾取物品

 

这期代码需配合上期代码使用

附上上期代码:

var velocity=7
var velocity2=16
function spawn(x,y,z) {
    const e = world.createEntity({
        mesh: 'mesh/只因块.vb',
        collides: true, 
        friction: 0, 
        scale: new Box3Vector3(2, 2, 2),
        position: [x,y+1,z],
    });
    setInterval(() => {
        e.meshOrientation.copy(e.meshOrientation.rotateY(Math.PI / 180))
    }, velocity)
    const startPos = [e.position.x, e.position.y + 0.3, e.position.z]
    const endPos = [e.position.x, e.position.y, e.position.z]

    const ani = e.animate([
        { position: startPos, duration: 1 },
        { position: endPos, duration: 1 },
    ], {
        duration: velocity2 * 2, 
        iterations: 1,
        direction: Box3AnimationDirection.WRAP,
    })
    ani.play({
        duration: velocity2 * 2, 
        iterations: Infinity,
        direction: Box3AnimationDirection.WRAP,
    })
}
spawn(喵,8,喵 )

我这个方法可能会有一点点卡(真的就一点点,没喵),如果你的地图本身就很卡,有好多onTick那不建议使用

给经验添加标签

var velocity=7
var velocity2=16
function spawn(x,y,z) {
    const e = world.createEntity({
        mesh: 'mesh/只因块.vb',
        collides: true, 
        friction: 0, 
        scale: new Box3Vector3(2, 2, 2),
        position: [x,y+1,z],
    });
    e.addTag('jk')
    setInterval(() => {
        e.meshOrientation.copy(e.meshOrientation.rotateY(Math.PI / 180))
    }, velocity)
    const startPos = [e.position.x, e.position.y + 0.3, e.position.z]
    const endPos = [e.position.x, e.position.y, e.position.z]

    const ani = e.animate([
        { position: startPos, duration: 1 },
        { position: endPos, duration: 1 },
    ], {
        duration: velocity2 * 2, 
        iterations: 1,
        direction: Box3AnimationDirection.WRAP,
    })
    ani.play({
        duration: velocity2 * 2, 
        iterations: Infinity,
        direction: Box3AnimationDirection.WRAP,
    })
}
spawn(喵,8,喵 )

再定个循环)

setInterval(() => {
    
},100)

不停判断所有玩家位置

setInterval(() => {
    world.querySelectorAll('player').forEach(async (entity) => {
        world.querySelectorAll('.jk').forEach(async (e) => {
            if(Math.floor(entity.position.y)==Math.floor(e.position.y)){//如果鸡块和玩家在一层,也就是y坐标相等,那么执行以下代码
                if(Math.floor(entity.position.x)==Math.floor(e.position.x)){//如果x坐标差不多
                    if(Math.floor(entity.position.z)==Math.floor(e.position.z)){//如果z坐标也差不多
                    }
                }
            }
        })
    })
},100)

最后给玩家提示就行啦

setInterval(() => {
    world.querySelectorAll('player').forEach(async (entity) => {
        world.querySelectorAll('.jk').forEach(async (e) => {
            if(Math.floor(entity.position.y)==Math.floor(e.position.y)){//如果鸡块和玩家在一层,也就是y坐标相等,那么执行以下代码
                if(Math.floor(entity.position.x)==Math.floor(e.position.x)){//如果x坐标差不多
                    if(Math.floor(entity.position.z)==Math.floor(e.position.z)){//如果z坐标也差不多
                        e.destroy()//消除鸡块
                        entity.player.directMessage('你获得了一个鸡块')//提示玩家
                    }
                }
            }
        })
    })
},100)

全部代码:

var velocity=7
var velocity2=16
function spawn(x,y,z) {
    const e = world.createEntity({
        mesh: 'mesh/只因块.vb',
        collides: true, 
        friction: 0, 
        scale: new Box3Vector3(2, 2, 2),
        position: [x,y+1,z],
    });
    e.addTag('jk')
    setInterval(() => {
        e.meshOrientation.copy(e.meshOrientation.rotateY(Math.PI / 180))
    }, velocity)
    const startPos = [e.position.x, e.position.y + 0.3, e.position.z]
    const endPos = [e.position.x, e.position.y, e.position.z]

    const ani = e.animate([
        { position: startPos, duration: 1 },
        { position: endPos, duration: 1 },
    ], {
        duration: velocity2 * 2, 
        iterations: 1,
        direction: Box3AnimationDirection.WRAP,
    })
    ani.play({
        duration: velocity2 * 2, 
        iterations: Infinity,
        direction: Box3AnimationDirection.WRAP,
    })
}
spawn(喵,8,喵 )
setInterval(() => {
    world.querySelectorAll('player').forEach(async (entity) => {
        world.querySelectorAll('.jk').forEach(async (e) => {
            if(Math.floor(entity.position.y)==Math.floor(e.position.y)){
                if(Math.floor(entity.position.x)==Math.floor(e.position.x)){
                    if(Math.floor(entity.position.z)==Math.floor(e.position.z)){
                        e.destroy()
                        entity.player.directMessage('你获得了一个鸡块')
                    }
                }
            }
        })
    })
},100)

好了,以上就是本期教程的全部内容

如果你觉得对你有帮助的话,那就ddd

注:作者制作不易,copy请通知或标明出处o

 


回复

上一页第 1 页 / 共 1 页下一页
追梦ez追梦ez

如有Bug请在这条回帖下回复,贴主都会看到o

点赞0


评论

屑溜真努力,帮你顶顶QWQ


追梦ez追梦ez

ddd

点赞0


评论


yee剑走天下yee剑走天下

position那一段完全可以这样:

if (String(entity.position) == String(e.positon)) {
    ...
}

点赞0


评论

还有这代码巨容易卡(?)setInterval+嵌套querySelectorAll())(

原本那个应该是有一定波动幅度的()然后你这个只能严格等于把()那就有可能因为js的特性永远不相等()

浮动的话String(entity.position.map(i => i | 0)) == String(entity.positon.map(i => i | 0))应该可以(?)


屑怪盗屑怪盗

DDD

点赞0


评论


追梦ez追梦ez

好厉害()))好像没满30天())

点赞0


评论


SCS_user_eee2detYg0SCS_user_eee2detYg0

喵

点赞0


评论


指令者指令者

dddd

点赞0


评论


追梦ez追梦ez

ddd

点赞0


评论


________-_________-_

要不要c++链接,你还行

点赞0


评论

?,。


________-_________-_

kedaoi.cn/devcpp

点赞0


评论

??


DebugDynamoDebugDynamo

直接用区域判断不香吗()()

玩家或者模型都可以()()()

点赞0


评论

懒()


神奇代码岛func王清林神奇代码岛func王清林

66

点赞0


评论


YJH于YYDSYJH于YYDS

考古()

点赞0


评论


神秘的蟑螂zl神秘的蟑螂zl

啊)没有悬浮)爷青结)

点赞0


评论

有上下浮动


ChenGe_12ChenGe_12

顶贴

点赞0


评论


蓝buff蓝buff

考古,但是给每个物品加一个区域然后用角色进入区域来判断会简单很多(api里的区域

点赞1


评论

物品加区域不行()区域是有上限的()

上限为129个()


呵呵0486呵呵0486

为啥不能用new Box3Vector3().distance

点赞2


评论


萌新大佬萌新大佬

有没有可能每tick才刷新一次

所以7ms转一度和63ms转9度是一样的

另外我记得animation有角度的关键帧啊

点赞1


评论

az,这是我早期整得玩意儿,那时候不知道,谢谢()


追梦ez追梦ez

要弄创作节跑回来研究早期自己代码

点赞0


评论


夜影行者夜影行者

收藏

点赞0


评论


陈宇虹妈妈,18379942139陈宇虹妈妈,18379942139

 

喵

 

点赞0


评论