# 06 信息采集显示与对话框

本节涉及的API:

  1. world.onPlayerJoin() :玩家进入地图(例如可设置让玩家加入时,身上无任何东西)
  2. player.onPress() : 按下按钮触发事件(例如点击右键弹出对话框)
  3. entity.destroy() : 让实体消失(捡废品)
  4. player.directMessage() : 让世界对玩家发送私人消息
  5. player.dialog() : 对玩家显示对话框


步骤一:首先是捡废品——收集地图中的瓶盖和空瓶

(点击->高清B站视频) (opens new window)


步骤二:捡完废品后,就可以和npc进行交易,并且用赚到的钱买零食吃啦~

(点击->高清B站视频) (opens new window)


本节涉及的代码如下:


1.捡废品

//封装成函数是因为它会被多次用到(显示玩家状态, 显示与NPC交互结果)
function textDialog(entity, content, title) {
    return entity.player.dialog({ //弹出对话框
        type: Box3DialogType.TEXT, //对话框类型为纯文本
        content, //文本内容
        title, //对话框左上角标题内容
    })
}

world.onPlayerJoin(({ entity }) => { //玩家进入游戏时在这里初始化玩家的资产
    entity.junk = 0 //废品
    entity.money = 0 //钱
    entity.itemList = [] //口袋里的货品

    entity.player.onPress(({ button }) => { //每当有按钮被按下
        if (button == Box3ButtonType.ACTION1) { //如果按钮是右键
            textDialog(entity, `你身上有:\n\n${entity.money}元, ${entity.junk}个废品\n道具: [${entity.itemList}]`)
        }
    })
})

2.与npc交互

//NPC是non-player character的简称, 表示游戏里无人控制的虚构人物
for (const npc of world.querySelectorAll('.NPC')) {
    npc.enableInteract = true //允许当前npc实体触发交互
    npc.interactRadius = 4.5 //交互范围
    npc.interactHint = npc.id //交互提示文本显示实体名字
    npc.interactColor.set(0, 1, 0) //交互提示文本颜色为绿色

    if (npc.id == '学生') { //如果实体名是'学生'
        npc.onInteract(async ({ entity }) => { //当玩家对这个npc按E触发交互, npc对玩家打招呼
            textDialog(entity, `${entity.player.name}, 你好呀~`, npc.id)
        })
    }
}

3.将废品卖给回收员工

if (amount > 0 && amount <= entity.junk) { //如果持有的废品数符合输入的数值
                entity.junk -= amount //交出废品
                const gain = amount * 2 //废品换算成钱
                entity.money += gain //钱入账到玩家
                textDialog(entity, `${amount}废品卖得${gain}`)
            }

4.向小卖部大叔买零食

else if (npc.id == '小卖部老板') { //如果实体名是'小卖部老板'
        npc.onInteract(async ({ entity }) => { //当玩家对这个npc按E触发交互, npc问你想买哪些商品
            const goodsList = ['薯片', '可乐', '糖果'] //货品列表
            const priceList = [7, 5, 4] //价格列表
            const selection = await entity.player.dialog({
                type: Box3DialogType.SELECT, //对话框类型为选择框
                content: `你有${entity.money}元, 想买点什么呢?`,
                title: npc.id, //对话框左上角显示NPC名字
                options: ['薯片 (7元)', '可乐 (5元)', '糖果 (4元)'], //选项
            })
        })
    }

5.吃掉零食!

else if (button == Box3ButtonType.ACTION0) { //如果按钮是左键
            const eaten = entity.itemList.pop() //口袋列表最右边的一个物品拿出来
            if (eaten) {
                entity.player.directMessage(`${entity.player.name}吃掉了"${eaten}"`)
            }
        }