Javascript RPG-为半复杂树结构存储玩家数据
我正在用js制作一个web RPG,在PHP中使用瓜js和SQL DB。这个问题是关于如何存储每个非玩家角色(NPC)的已完成任务和当前任务 NPC对话框和任务数据:所有对话框都以以下结构存储在js对象中:Javascript RPG-为半复杂树结构存储玩家数据,javascript,php,mysql,game-engine,melonjs,Javascript,Php,Mysql,Game Engine,Melonjs,我正在用js制作一个web RPG,在PHP中使用瓜js和SQL DB。这个问题是关于如何存储每个非玩家角色(NPC)的已完成任务和当前任务 NPC对话框和任务数据:所有对话框都以以下结构存储在js对象中: var dialog = { quests : { quest1 : { NPCName ("Joe"): { TaskName ("1 - Introductions") : {
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
};
我没有将所有地图对话框存储在同一个文件中,因为该文件会变得太混乱。。。因此:当映射发生变化时,我使用js\u require
加载一个新的js
文件,其中包含一组新的对话框:
loadNpcDialog : function (dialogNumber) {
require(["./dialog/npc_dialog_level_" + dialogNumber + ".js"], function(dialog) {
});
},
任务编号:创建新NPC时(classgame.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风格,因为整个游戏遵循线性进程,但通过与世界上随机的人交谈,你可以灵活地开始任何你想要的任务
- 游戏数据:游戏应为每个登录的玩家ID存储当前和完成的等级、每个等级的任务名称、每个任务的npc名称和每个npc名称的任务。它应加载以下树(红色=完成):
- 当游戏加载时,它应该记住我在上面的树中提到的那些事情。我已经将数据库设置为加载级别和任务信息(我只是从DB返回当前级别和任务数,然后通过上面显示的
结构循环,将值存储在NPC对话框
和CurrentandCompleteLevel
数组中,直到循环达到DB的当前级别和任务数)…以及玩家的坐标和经验currentAndCompleteQuests
NPC completed num
和tasks completed num
列添加到数据库中。这是因为我不能像对level
和NPC对话框的结构和加载ode>quest
信息,因为您完成NPC任务的顺序不是线性的。不知何故,我必须跟踪每个NPC完成的任务数量。我该怎么做
我正在考虑创建一个新的NPCData
表来存储游戏中的所有NPC,然后为该NPC存储current task num
。但是,我必须为任何登录我的游戏的新玩家创建一个新条目
或者可以在userstats表中创建两个DB列,currenpc
和currTask
,然后循环通过一个关联数组,存储每个NPC的所有任务?但是,我需要为每个完成的NPC和每个NPC的完成任务创建一个列。哎,我的脑袋在转
当前数据库模式:
我想这是用户和任务之间典型的多对多数据库关系,在这种情况下,我建议创建一个关系表
usertasks
。在这里我将存储外键:id\u user
,levelnum
,questnum
我还要补充:
这是该任务的NPC id,并且npcnum
是完成的任务数tasknum
levelnum
、questnum
和npcnum
标识,我们可以将其与具有id\u user
的用户关联
因此,您可以从userstats加载为加入levelnum
和questnum
的任务而完成的任务,以便为用户当前时间点的每个任务完成任务
下面是建议的关系表的SQLFIDLE
假设您只需要在内存中存储当前子任务,我们可以使用一个数字数组来存储进度,假设levelnum
和questnum
始终是“当前”子任务
拥有usertasks的注意事项是,您将拥有旧任务和级别的条目,您最终会担心拥有一个包含子任务*用户行数的
NPCData
类型表。如果这感觉很混乱,那么另一个选项可能只是将javscript变量tasks
转换为JSON并存储,loa当你加载userstats
的时候,再把它放回去,这可能是更简单的方法。你能在你的问题中澄清一下问题中的“NPC”是什么吗?我必须在网上搜索它!呸,这个问题非常详细(通常我们这里有相反的问题)。但是,我想知道您是否可以将问题变得更一般一些,以便更清楚,更不局限于您的用例?我们更喜欢对未来观众有用的问题。@halfer当然,我这个周末回家了,所以直到现在才看到这一点。我将尝试概括一下,不是我反对SQL,而是像may这样的无SQL数据库这里更合适。这看起来不错,但我希望避免每个玩家每个NPC都有多个db条目。这可以很快地加起来,不是吗?所以对于每个任务,有多个NPC,每个NPC可以有多个任务,对于n个玩家。我想这是没有办法的?我想,使用SQL,这应该不会是一个问题,因为它是为玩家准备的T
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);