RPG - 存储半复杂树结构的玩家数据

2024-02-16

我正在 js 中制作一个 web RPG,使用 melon JS 和 SQL DB 以及 PHP。这个问题是关于如何存储每个非玩家角色 (NPC) 的已完成任务和当前任务。

NPC对话和任务数据:所有对话框都存储在一个js对象中,结构如下:

var dialog = {
    quests : {
        quest1 : {  
            NPCName ("Joe"): {
                TaskName ("1 - Introductions") :  {
                     "english" : 
                      [
                          "Hello, here is some dialog",
                          "More dialog..." (stored in array so I can cycle through it)
                      ],//more items per task
                }, //more tasks per NPC
            }, //more NPCs per quest
        }, //more quests options per "quests"
    }, //more options in dialog besides "quests" if I want
};

I'm not将所有地图对话框存储在同一个文件中,因为该文件会变得太混乱......所以相反:当地图更改时,我使用js_require加载到一个新的js带有一组新对话框的文件:

loadNpcDialog : function (dialogNumber) {
    require(["./dialog/npc_dialog_level_" + dialogNumber + ".js"], function(dialog) {
    });     
},

任务编号:当创建一个新的 NPC 时(类game.NPCEntity),我为每个 NPC 实例创建一个局部变量,名为taskNum,设置为 0。当他们完成任务时,我只需访问并递增该 NPC 的任务编号:

    game.player = me.game.getEntityByName(game.data.currNPC)[0];
    game.player.taskNum++;

对于这款RPG,我想要实现以下目标:

  • GTA 风格的免费世界任务队列:等级进展、任务进展和每个 NPC 任务的进展是线性的(完成第 1 级进入第 2 级等),但对于每个任务,都会生成一组 NPC...(你可以将它们视为子任务),每个包含 1 到 n 个任务。我想建立任务队列的灵活性,允许玩家以任何顺序与任何生成的 NPC 对话...并按线性顺序完成任务(任务 1,然后 2,然后 3...)。这就像 GTA 风格,因为整个游戏遵循线性进展,但让你可以通过与世界上的随机人交谈来灵活地开始任何你想要的任务。

  • 游戏数据:游戏应该存储当前的and每个登录玩家 ID 的已完成关卡、每个关卡的任务名称、每个任务的 npc 名称以及每个 npc 名称的任务。它应该加载以下树(红色=完成):

我的问题

  • 当游戏加载时,它应该记住我在上面的树中提到的那些事情。我已经设置了数据库来加载级别和任务信息(我只是从数据库返回当前级别和任务编号,然后循环遍历NPC dialog上面显示的结构将值存储在currentAndCompleteLevels and currentAndCompleteQuests数组直到循环到达当前级别和来自DB的任务编号)...以及玩家的坐标和经验...

然而,由于我允许玩家随时开始、暂停、然后恢复任何 NPC 任务列表,所以我无法真正添加npc completed num and tasks completed num列到数据库。这是因为我无法循环NPC dialog结构和负载的方式与我相同level and quest信息,因为你完成 NPC 任务的顺序是非线性。我必须以某种方式跟踪每个 NPC 已完成的任务数。我怎样才能做到这一点?

我正在考虑创建一个新的NPCData表存储游戏中所有NPC,然后存储current task num对于那个 NPC...但是我必须为登录我游戏的任何新玩家创建一个新条目。

或者也许创建两个数据库列用户统计信息 table, currNPC and currTask,然后循环遍历存储每个 NPC 的所有任务的关联数组?但随后我需要为每个已完成的 NPC 以及每个 NPC 已完成的任务创建一个列。哎哟,我头晕了。

当前数据库架构:


我想这是用户和任务之间的经典多对多数据库关系,在这种情况下我建议创建一个关系表usertasks。我在这里存储外键:id_user, levelnum, questnum.

我还要补充一下:

  • npcnum这是该任务的 NPC ID,并且
  • tasknum这是完成的任务数。

因此,“子任务”实际上是由levelnum,questnum and npcnum我们可以将其与用户联系起来id_user.

因此您可以加载为加入任务而完成的任务levelnum and questnum从 userstats 获取用户当前时间点每个任务完成的任务。

这是建议的关系表的 SQLfiddle。

http://sqlfiddle.com/#!2/edea9/1 http://sqlfiddle.com/#!2/edea9/1

假设您只需要在内存中保存当前的子任务,我们可以用一个数字数组来存储进度,假设:levelnum and questnum永远是“当前”的。

var tasks=[];
function progress_task(npcNum){
  tasks[npcNum] = tasks[npcNum] ? tasks[npcNum]+1 : 1;
}
function get_task(npcNum){
  return tasks[npcNum] || 0;
}

var currNPC=1;
progress_task(currNpc);   

拥有用户任务的注意事项是,您将拥有较旧的任务和级别的条目,并且您最终会担心有一个NPCData类型表与子任务*用户行数。如果这感觉很混乱,那么另一个选择也许只是转换 javscript 变量tasks到 JSON 并存储它,加载时再次加载它userstats这也许是更简单的路线。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RPG - 存储半复杂树结构的玩家数据 的相关文章

  • phpunit测试调用其他需要mock的类方法的方法

    我正在尝试创建一个非常标准的单元测试 在其中调用一个方法并断言它的响应 但是我正在测试的方法调用同一类中的另一个方法 该方法做了一些繁重的工作 我想模拟该方法 但仍按原样执行我正在测试的方法 仅使用从调用另一种方法返回的模拟值 我简化了示例
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • 如何在 OS X 上使用 OpenSSL 1.0.1 编译 PHP 5.5.19

    我已经安装了 OpenSSL 1 0 1j usr local ssl现在我尝试使用此版本的 OpenSSL 编译 PHP 5 5 19 这是我的配置过程 export CFLAGS arch x86 64 export CXXFLAGS
  • 如何仅使用 PHP5 RecursiveDirectoryIterator 类递归显示具有特定文件类型的文件夹和子文件夹

    您好 我正在尝试使用 FilterIterator 上的扩展来获取 RecursiveDirectoryIterator 类 但由于某种原因 它仅在根目录上进行迭代 我的代码是这样的 class fileTypeFilter extends
  • 计算三次贝塞尔曲线的弧长、曲线长度。为什么不工作?

    我正在用这个算法计算弧长 三次贝塞尔曲线的长度 function getArcLength path var STEPS 1000 gt precision var t 1 STEPS var aX 0 var aY 0 var bX 0
  • WordPress 插件中的类自动加载器

    我想编写一个类自动加载器以在 WordPress 插件中使用 该插件将安装在多个站点上 我想尽量减少与其他插件发生冲突的机会 自动加载器将是这样的 function autoload name some code here 我的主要问题是
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • Google Maps API (v3) 添加/更新标记

    编辑 它现在可以工作 但如果用户不允许或没有基于位置的服务 则不会加载 请参阅 jsfiddle 示例接受的答案评论 我已经浏览了一些教程和问题 但我无法安静地理解正在发生的事情 或者在这种情况下 没有发生 当用户单击链接时 我正在加载地图
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 每行上的模态按钮显示从数据库获取详细信息的模态

    我已经使用表从两个表中获取所有记录 效果很好 我在显示的每一行末尾添加了一个按钮Modal 在此模式中 我想根据每个行 ID 显示数据 我的代码有一个 while 循环 它显示表中的记录 在该 while 循环中 我又编写了一个 sql 语
  • 如何在使用 XMLHttpRequest() 时在 python 中接收 POST 数据

    我有两个关于使用 XMLHttpRequest 时接收数据的问题 客户端是用javascript编写的 服务器端是用python写的 如何在 python 端接收 处理数据 如何响应 HTTP 请求 客户端 var http new XML
  • powershell - 使用文件名列表删除文件

    我从堆栈溢出中得到了以下代码 它工作正常 TargetFolder Pathofyourfolder Files Get ChildItem TargetFolder Exclude gc List txt Recurse foreach
  • 使用 AJAX 观察 SQL 数据库的更改 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的数据库中有一个列将随机更新 每当该列更新时 我都需要刷新页面上的内容 如何使用 AJAX jQuery 仅对数据库更改执行操作 你
  • 错误您已经拥有该商品

    我有一个新的 Android 应用程序 其中添加了应用程序内计费功能 我感到沮丧得抓狂 我已上传签名的 APK 并发布到 alpha 我创建了一组应用内产品并将其全部激活 我创建了一个新的 Gmail 帐户 并将其定义为应用程序 apk 页
  • Java 中的架构约束 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想确保我的项目不包含包之间不必要的依赖关系 例如 我想确保该项目具有分层结构 IE 模型低于一切 业务
  • 从 HDC 句柄创建 QPaintDevice

    我有一个来自外部库的 Windows HDC 句柄 我想使用 QPainter 功能来绘图 Qt 中有什么方法可以从 HDC 句柄创建 QPaintDevice 吗 这样做的一种方法 使用 Windows API 从 HDC 获取 HWND
  • 使用 jQuery 操作 TinyMCE 内容

    使用 TinyMCE 我可以轻松操作内容并将其发送回编辑器 如下所示 get content from tinyMCE var content tinyMCE get content getContent manipulate conten
  • 使用 NSMutableString 追加到文件末尾

    我有一个日志文件 我试图将数据附加到其末尾 我有一个NSMutableString textToWrite变量 我正在执行以下操作 textToWrite writeToFile filepath atomically YES encodi
  • 从 ASP.NET MVC2 升级到 MVC3 的原因 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用此关键字并揭示模块模式的严格违规

    无法让以下内容通过 jslint jshint jshint strict true var myModule function use strict var privVar true pubVar false function privF
  • MFC/WinAPI 的大问题

    我需要创建一个带有两个选项卡的表单视图的 SDI 表单 其中封装了多个对话框作为选项卡内容 但表格必须有彩色背景 诸如此类的事情让我讨厌编程 首先 我通过资源编辑器尝试了 CTabControl 尝试了不同的事情 但未记录的行为和没有答案的
  • 使用多个自定义表模型避免重复代码

    我正在从事一个项目 其中我们有几个领域类来对业务数据进行建模 这些类是简单的 POJO 我必须使用它们来显示几个表 例如 考虑这个类 public class Customer private Long id private Date en
  • IntelliJ 中的“用 try...catch 换行”?

    我可以选择一段代码并让 IntelliJ 用 try catch 将其包装起来吗 有键盘快捷键吗 选择代码 然后 Choose Code gt Surround With 按 Ctrl Alt T 对于 OS X 命令 选项 T 有时我喜欢
  • 如何修复 Mountain Lion 中的 VIM 系统剪贴板使用问题

    set clipboard unnamed是我最喜欢的之一 vimrc配置 多亏了它 猛拉和删除被复制到我的系统剪贴板 我可以轻松地将它们粘贴到其他应用程序 然而 当我升级到 Mountain Lion 时 这个设置就崩溃了 你知道如何解决
  • 更改 JButtons 背景的最佳方法

    现在我使用以下方法更改按钮的背景颜色 button setBackground Color WHITE 这是一个例子 但是当我有一个巨大的 jbuttons 网格 1000 时 仅仅运行一个 for 循环来改变每个按钮的背景是非常非常慢的
  • Hibernate - TypedQuery.getResultList() 返回同一对象的列表

    这是对问题的更多也许更好的描述 我做了一个简单的选择查询 返回的列表包含确切数量的记录 对象 就像我在数据库中执行相同的查询一样 但问题是所有对象都是相同 相同的 例如 这是数据库中的结果 我删除了空值 26801 01 JAN 00 7
  • 构建 Windows 版 Linphone 时出错

    我正在尝试按照以下说明构建适用于 Windows 的 linphoneReadme mingw使用 MinGw Msys 在下载belle sip包之前没有任何问题 当我跑步时 autogen sh我收到以下错误 Generating bu
  • Ruby 多字符串替换

    str Hello World 预期输出是 Hello World 我可以做这个 str gsub gsub 有没有其他方法可以在单个函数调用中完成此操作 就像是 str gsub s1 s2 r1 r2 从 Ruby 1 9 2 开始 S
  • RPG - 存储半复杂树结构的玩家数据

    我正在 js 中制作一个 web RPG 使用 melon JS 和 SQL DB 以及 PHP 这个问题是关于如何存储每个非玩家角色 NPC 的已完成任务和当前任务 NPC对话和任务数据 所有对话框都存储在一个js对象中 结构如下 var