当前位置: 首页 > Web前端 > vue.js

基于盛网互动白板实现一款多人数独游戏

时间:2023-04-01 02:04:53 vue.js

本文作者为声网社区开发者“tjss”。基于Vue的代码模板和SoundNet的交互式白板,他构建了一个支持多人交互的数独游戏。本文记录他的实现过程。欢迎您尝试实现自己的小游戏或应用程序。本文涉及的所有声网产品均支持免费注册和下载,并为每位开发者提供每月10000分钟的免费使用额度。欢迎大家尝试实践。本人基于声网交互式白板的SDK和窗口管理器开发了场景窗口插件,实现了多人数独游戏。游戏中,每位玩家进入白板房间,都能看到数独游戏插件,并可同时参与其中,与房间内的小伙伴一起完成数独解题。前期准备1.注册一个声网账号并实名认证,这样就可以在后台创建项目,获取开发用的Appid和Token。2.了解Vue开发的基础知识。3、了解声网Agora的交互式白板产品,一些基本的界面和功能,看官方文档就够了。4.搭建开发环境:NodeJs16.0.0版本@Vue/cli4.5.1VSCode代码开发工具启用和配置交互式白板服务首先我们需要一个实名认证的voicenet账号,进入控制台(console.agora.io),在Agora控制台启动交互式白板服务。这里需要注意的是,交互式电子白板是作为服务来展示的,而控制台只是展示项目列表,并没有直接展示服务。这个时候我们先创建一个项目,然后点击“Configure”进入项目详情,就可以在里面的页面看到服务内容了。这时,找到交互式白板服务,点击打开。由于我的已经打开,它显示配置按钮。使用官网提供的代码模板场景窗口插件。目前,我们不需要从头开始构建它。SoundNet提供了一个代码模板。基于这个模板,我们可以很容易的实现一个在交互式电子白板上使用的插件。模板地址:https://github.com/netless-io...搭建好开发环境后,就可以下载模板代码了,Git或者Zip都可以。注意README.md中的开发环境配置:1.在.env文件中配置白板间UUID和Token。请复制该目录下的.env.example文件并重命名为.env或.env.local,填写必要的白板配置信息。可以到声学交互白板官方NetlessWorkshop申请专用白板配置。2.执行npminstall安装依赖3.执行npmstart在本地开发如果代码是通过Git命令拉取的,需要切换分支到Vue分支。项目结构如下:playground目录基本不用修改,我们实现的插件都在src目录下完成。index.ts文件是我们插件的一些数据设置,比如插件名称。其他逻辑基本不需要修改。onstSudoku:NetlessApp={kind:"Sudoku",setup(context){constbox=context.getBox();}box.mountStyles(样式);const$content=document.createElement("div");$content.className="应用计数器";box.mountContent($content);constapp=createApp(App).provide("上下文",上下文);app.mount($content);context.emitter.on("destroy",()=>{app.unmount();});},};导出默认数独;数独游戏规则数独网格由9x9格组成。玩家只能使用数字1到9,每个3×3房子只能包含数字1到9,每列只能包含数字1到9,每行只能包含数字1到9,每个3×3房子,每个数字在每一列或每一行中只能使用一次。当所有数独格都填满正确的数字时,游戏结束。(摘自网络)数据同步核心思想1.通过交互式白板SDK提供的createStorage方法,初始化一个数独板并存储数据,同时需要更新自己的棋盘。constchessBoard=ref();constcontext=inject("context");conststorage=context.createStorage("chessBoard",{chessBoard:ChessBoard.init()});chessBoard.value=deepCopy(storage.state.chessBoard)2.在vue接口的onMounted回调函数中添加存储值的更新监听,让玩家在填格时广播最新的格子数据,其他玩家可以收到更新通知,然后重新-渲染界面。onMounted(()=>{initAppData()storage.addStateChangedListener((diff)=>{chessBoard.value=deepCopy(diff.chessBoard?.newValue)if(finish(chessBoard.value.gridItems)){statistics(chessBoard.value.gridItems)finishTag.value=true}})});3、填格时,使用SDK的setState方法更新数独板的数据。if(e.data&&e.data>0){grid.number=parseInt(e.data)grid.userId=uid.valuegrid.color=rgb}else{grid.number=0grid.userId=''网格.color=newRgb(233,233,233)}storage.setState({chessBoard:chessBoard.value})数独游戏界面作者是先实现这个互动游戏的核心功能,所以设计的游戏界面是比较简单。数独数据结构exportclassChessBoard{gridItems:GridItem[][]}由于游戏结束后需要统计每个玩家填写的项目数,所以在更新格子值的时候也会记录是哪位玩家填写的。默认字段表示格子是自动生成的,不需要玩家填写。exportclassGridItem{number:numbercolor:RgbuserId:stringdefault:boolean}运行项目,点击工具栏下方的按钮,找到我们实现的插件图标,然后点击打开。打开插件后,会通过createStorage方法初始化并存储一道数独题。所有进入房间的玩家都可以获得这个数据,后续的数独更新会被玩家同步修改。因为这个项目的重点是学习外挂开发和数据同步,所以游戏界面和内容都比较简单。接下来就是打开多个网页,输入localhost:3000进入我们的交互式白板房,因为模板的uid是随机生成的,也就是说进入了不同的玩家。其他玩家填完方格后,其他玩家就不能再填这个格子了。游戏结束时,将统计并显示每位玩家填写的正确数字。游戏结束小结通过官方提供的基于场景的插件模板,我们可以轻松实现一些好玩的交互场景功能。在这个简单的项目中,由于时间仓促,一直没来得及更好的优化。待会儿有时间再打磨吧。例如,不同玩家填写的号码用不同的颜色区分,加入时间限制机制等。有兴趣的朋友,一起来开发一些好玩的实时互动功能吧~现在注册声网账号下载SDK,每月免费使用10000分钟。如果您在开发过程中有任何问题,可以在声网开发者社区与官方工程师进行交流。