猫史档案馆


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

用户:追梦ez追梦ez查看:11 回复: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


评论


追梦ez追梦ez

ddd

点赞0


评论


yee剑走天下yee剑走天下

position那一段完全可以这样:

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

点赞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


评论


呵呵0486呵呵0486

为啥不能用new Box3Vector3().distance

点赞2


评论


萌新大佬萌新大佬

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

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

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

点赞1


评论


追梦ez追梦ez

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

点赞0


评论


夜影行者夜影行者

收藏

点赞0


评论


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

 

 

点赞0


评论