Gro*_*ler 7 javascript php mysql game-engine melonjs
我正在js中使用melon JS和SQL DB和PHP制作一个Web RPG.这个问题是关于如何存储每个非玩家角色(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
};
Run Code Online (Sandbox Code Playgroud)
我没有将所有地图对话框存储在同一个文件中,因为文件会变得太杂乱......所以:当地图发生变化时,我会用一组新的对话框js_require加载一个新js文件:

loadNpcDialog : function (dialogNumber) {
require(["./dialog/npc_dialog_level_" + dialogNumber + ".js"], function(dialog) {
});
},
Run Code Online (Sandbox Code Playgroud)
任务编号:当创建一个新的NPC(类game.NPCEntity)时,我为每个NPC实例创建一个局部变量taskNum,设置为0.当他们完成一个任务时,我只是访问并递增该NPC的任务编号:
game.player = me.game.getEntityByName(game.data.currNPC)[0];
game.player.taskNum++;
Run Code Online (Sandbox Code Playgroud)
对于这个RPG,我想实现以下目标:
GTA风格的自由世界任务队列:等级进展,任务进展和每个NPC进程的任务是线性的(完成等级1进入等级2等),但是对于每个任务,生成一组NPC ......(你可以将它们视为子请求),每个包含1到n个任务.我想建立任务队列灵活性,允许玩家以任何顺序与任何生成的NPC对话......并按线性顺序完成任务(任务1然后是2,然后是3 ...).这就像GTA风格,因为整体游戏遵循线性进展,但通过与世界上随机的人交谈,您可以灵活地开始任何您想要的任务.
游戏数据:游戏应存储当前和已完成的级别,每个级别的任务名称,每个任务的npc名称以及每个登录玩家ID的每个npc名称的任务.它应该加载以下树(红色=完整):

NPC dialog显示上面显示的结构,将值存储在a currentAndCompleteLevels和currentAndCompleteQuests数组中,直到循环达到当前级别和任务来自DB的num)...以及玩家的坐标和体验......但是,由于我允许播放器随时启动,暂停,然后恢复任何NPC任务列表,我无法在数据库中添加一个npc completed num和tasks completed num列.这是因为我不能NPC dialog以与我所做的相同的方式循环结构和加载level和quest信息,因为你完成NPC任务的顺序不是线性的.不知何故,我必须跟踪每个NPC完成的任务数量.我怎样才能做到这一点?
我正在考虑创建一个新NPCData表来存储游戏中的所有NPC,然后current task num为该NPC 存储......但是我必须为登录我游戏的任何新玩家创建一个新条目.
或者,也许在创建两个数据库列userstats表,currNPC并currTask通过关联数组存储每个NPC所有任务,然后循环?但是,我需要为每个完成的NPC和每个NPC完成的任务创建一个列.哦,我的头在旋转.
当前的DB架构:

我想这是用户和任务之间的经典多对多数据库关系,在这种情况下我建议创建一个关系表usertasks。在这里我将存储外键: id_user, levelnum, questnum。
我还要补充一下:
npcnum这是该任务的 NPC ID,并且tasknum这是完成的任务数。因此,“子任务”实际上由 标识levelnum,questnum并且npcnum我们可以将其与具有 的用户相关联id_user。
levelnum因此,您可以加载为加入userstats 的任务完成的任务,questnum以获取用户当前时间点的每个任务完成的任务。
这是建议的关系表的 SQLfiddle。
http://sqlfiddle.com/#!2/edea9/1
假设您只需要在内存中保存当前的子任务,我们可以用一组数字来存储进度,并假设levelnum和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);
Run Code Online (Sandbox Code Playgroud)
拥有用户任务的注意事项是,您将拥有旧任务和级别的条目,并且您最终会担心拥有一个NPCData包含子任务*用户行数的类型表。如果这感觉很混乱,那么另一个选择可能只是将 javscript 变量转换tasks为 JSON 并存储它,在加载时再次加载它userstats,这可能是更简单的路线。
| 归档时间: |
|
| 查看次数: |
709 次 |
| 最近记录: |