用户:
神岛吉吉喵查看:59 回复:44 评论:59 创建时间:2020-12-20T12:53:38

在上一篇api教程中
教会了大家如何建造小卖部并查找实体
本期的知识点是用对话框和按钮与实体互动
并实现和NPC的金币交易~

本期教程涉及API:
1.world.onPlayerJoin (例如让玩家加入时没有任何东西)
2.player.onPress 按下按钮触发事件(例如点击右键弹出对话框)

3.entity.destroy 让实体消失(捡垃圾)

4.player.directMessage,让世界对玩家发送私人消息

5.player.dialog,对玩家显示对话框

首先是捡垃圾——收集地图中的瓶盖和空瓶垃圾
↓↓具体方法戳视频↓↓
https://www.bilibili.com/video/BV1xt4y1k7nk
捡完垃圾后,就可以和npc进行交易
并且用赚到的钱买零食吃啦~
https://www.bilibili.com/video/BV1ma4y1H7iX
本期教程用到的代码
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}"`)
}
}
这两节课知识量巨大
大家记得回去练习哦~

本期互动作业:
1、让老板出售一个价格10元的热狗,该怎样修改代码呢?
2、代码处只写了当输入的数值合理的情况
如果玩家输入了一个很离谱的值
让地图弹出一个提醒
这个该怎么实现?
3、修改代码,让小女孩从原来的问好
变成我们请她吃东西
她吃掉我们的零食会说:“谢谢喵,某某”
记得把你的回答写在评论区哦
我们下期再见啦~

- 相关API文档:https://docs.box3.codemao.cn/
加入代码岛3.0官方内测Q喵
(づ。◕‿‿◕。)づ
学霸8号帮我看看这段代码有啥问题
for (const e of world.querySelectorAll('.瓶盖垃圾,.空瓶垃圾')){ //搜索每一个废品实体
e.enableInteract = true //开启交互
e.interactRadius = 2.5 //交互范围
e.interactHint = e.tags() //交互提示文本显示标签名
e.interactColor.set(0, 1, 0) //交互提示文本为绿色点赞0
评论