V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
hd7771
V2EX  ›  JavaScript

在制作一个做 web 上 galgame 的脚本(?),想请教大佬们几个问题。

  •  
  •   hd7771 · 2017-01-24 17:47:20 +08:00 · 4421 次点击
    这是一个创建于 2893 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的问题:

    1. 我想弄一个网站,用户上传脚本,然后我翻译之后返回给他一个 js 的链接,然后他自己引用。问题就是我的代码用到了一个叫做 jquery 的基础库和一个叫做 pixi 的图形库可能之后还会有声音库,那么有没有办法让帮用户使用这些依赖呢或者还是告诉用户让用户自己去搞?
    2. 用户成功用了我这个东西之后,游戏资源是到我服务器获取好还是让他自己去获取好?那么 js 资源的获取该怎么写?
    3. 虽然本地跑的不慢,但是网络上可能出很多问题,可不可以做到先把游戏隐藏跑一段时间再返回去让用户玩呢?
    4. 如果用户提交上来的脚本一点问题都没有,那么一定没什么问题。如果提交上来的有问题,我能想到的情况有限,错误提示有没有方便的办法去做呢?

    我是 web 新手, js 都是当 c 来写的。。所以有些问题可能大佬们看起来比较白痴,但是你们的一点点帮助可能对我提高很大,谢谢。

    这是我定义的语法:
    bg.島_坂道_差分(夕方)|jpg
    middle.chrysoA_a|png
    dialog."???"."ass we can"
    option2."肛"|flag1."不肛"|flag2
    click
    op.flag1{
      dialog."???"."boy next door"
      click
      middle.clear
      bg.図書館2階_隠し書庫_白黒|jpg
      dialog.""."deep dark fantasy"
      click
      des."菊花好痛"
    }
    op.flag2{
      middle.chrysoB_g|png
      dialog."???"."interesting"
    }
    click

    然后对应的界面





    36 条回复    2017-01-29 19:03:30 +08:00
    arzusyume
        1
    arzusyume  
       2017-01-24 21:03:59 +08:00   ❤️ 1
    > 然后我翻译之后返回给他一个 js 的链接

    那直接返回一个 html 不是更好么
    bombless
        2
    bombless  
       2017-01-24 21:34:47 +08:00 via Android   ❤️ 1
    感觉可能做一个 js 库就可以了吧。也可以考虑打包成一个 exe 丢到 vps 上暴露一个端口来服务的方案。感觉主要取决于你希望运行环境有多灵活了。如果是对服务器环境没有假设的那种可能就是一个 css 库加上 js 库吧。
    hd7771
        3
    hd7771  
    OP
       2017-01-24 21:35:13 +08:00
    @arzusyume 我是想能够插入用户的网页中,如果直接返回网页大概是怎么做。
    tSQghkfhTtQt9mtd
        4
    tSQghkfhTtQt9mtd  
       2017-01-24 21:37:01 +08:00
    hd7771
        5
    hd7771  
    OP
       2017-01-24 21:38:17 +08:00
    @arzusyume 您的意思就是让用户自己去改吧
    hd7771
        6
    hd7771  
    OP
       2017-01-24 21:40:36 +08:00
    @liwanglin12 额,我加入绘图库就是为了之后更新可以加入一些特效的,比如柚子社常用的上下动一下,些许之后还能插入一些小游戏的。。
    tSQghkfhTtQt9mtd
        7
    tSQghkfhTtQt9mtd  
       2017-01-24 21:42:01 +08:00
    @hd7771 自己再改改喽= =
    hd7771
        8
    hd7771  
    OP
       2017-01-24 21:44:43 +08:00
    @liwanglin12 看了一下,,他写的那么少怎么处理分支嵌套的情况。。。
    tSQghkfhTtQt9mtd
        9
    tSQghkfhTtQt9mtd  
       2017-01-24 21:45:37 +08:00   ❤️ 1
    @hd7771 #8 朋友博客在用,具体实现我也没了解过
    hd7771
        10
    hd7771  
    OP
       2017-01-24 21:47:55 +08:00
    @liwanglin12 我解释器是 c++写的,有没有什么办法达到相似的效果呢?
    hd7771
        11
    hd7771  
    OP
       2017-01-24 21:56:41 +08:00
    @liwanglin12 我知道了,他这个东西,如果分支之后,,相同的东西全部要重新写,,他是处理 json 的数据,,我是按照传统的解析器写的,,,小游戏用他的很方便, json 相关的工具非常多。。但是游戏流程稍微长了,工作量就会大很多。。
    hd7771
        12
    hd7771  
    OP
       2017-01-24 22:10:00 +08:00
    @bombless 我是用 c++写的,是把脚本翻译成 js 的。我就是想按你的说法给别人调用。但是最理想的效果就是你说的一个库的效果,但是对于不同的脚本,翻译出来的东西是不一样的。可不可以对于每个翻译出来的文件制作一个库呢?大概怎么实现呢?
    aaronrzh
        13
    aaronrzh  
       2017-01-24 23:07:36 +08:00   ❤️ 1
    直接返回一个 url 吧,让用户用 iframe 嵌到自己的网页就可以了
    hd7771
        14
    hd7771  
    OP
       2017-01-24 23:15:41 +08:00
    @aaronrzh iframe 的作用是不是一个 html 文件可以插入到另一个 html 文件?那么我就把游戏资源放在我自己的服务器上。 localhost 上看的是什么样,对面引用看的也是什么样?
    murmur
        15
    murmur  
       2017-01-24 23:21:57 +08:00
    自定义语法都是多余的,踩过坑的人都知道没有编译原理基础自定义语言是多(zhui)痛苦的
    所以如果你不知道用什么语言,就用 lua 吧
    hd7771
        16
    hd7771  
    OP
       2017-01-24 23:23:57 +08:00
    @murmur 但是这个东西只有 if 啊。。。而且实现脚本语言本来就不需要多少编译原理的知识,,弄个 ast 树搜索一下就出来了。
    hd7771
        17
    hd7771  
    OP
       2017-01-24 23:26:01 +08:00
    @murmur 而且就算是编译性的语言,也有非常多的工具来帮助你实现,你要做的也就是词法分析语法分析这些编译器前端工作,和专门的编译工作不是一个概念。。
    murmur
        18
    murmur  
       2017-01-24 23:26:07 +08:00   ❤️ 1
    @hd7771 新手么,不知道怎么拟定需求,总以为什么都很简单,等后面逻辑复杂了就知道加功能多困难了
    所以我的建议是不知道嵌入什么语言就用 lua ,不知道什么语法就照着 lua 做, lua 那么多游戏做嵌入式引擎不是没道理的
    aaronrzh
        19
    aaronrzh  
       2017-01-24 23:49:38 +08:00   ❤️ 1
    @hd7771 iframe 的作用是引用一个网页, html 和资源放在你的服务器上,把 html 的地址给用户就可以了,用户在他们的页面上添加一个 iframe 把你的网页引用进去就可以了
    hd7771
        20
    hd7771  
    OP
       2017-01-24 23:49:51 +08:00
    @murmur 真的不是觉得很简单,是我就没想做难,能够跑个分支就行了,而且一个 if 语句主流语言全都是这么实现的。而且我问这个问题是我已经做完可以用了,然后想让别人能够方便用并插入网页中,我自己不做游戏(不会画画)。 lua 的作用很多,我不知道对于我现在这个情况怎么在网上搜索相关的资料。
    hd7771
        21
    hd7771  
    OP
       2017-01-24 23:52:11 +08:00
    @aaronrzh 那就是我要的效果,在给用户做个上次资源的界面应该就可以了,感谢大佬,一楼那位大哥估计也是这个意思,就是我太菜没看懂。
    vincentjie
        22
    vincentjie  
       2017-01-25 00:03:33 +08:00   ❤️ 1
    @hd7771 #17 如果你能把握你的需求就局限于这个 if 的话,确实自己实现个能满足需求的脚本也挺不错的,起码效率上应该会比绝大多数的脚本语言高。但是我觉得大概率,后面你会有更多的需求。
    hd7771
        23
    hd7771  
    OP
       2017-01-25 00:21:13 +08:00 via Android
    @vincentjie 我现在的需求都是特效方面的, cpp 文件已经不用改了,改改 js 就行了。而且 avg 这种东西没看到在流程上有什么新花样,都是玩特效,撑死加个还是 if 的好感度。我反正没这个能力在 avg 游戏上做出创新。我本来就是做个 0 门槛脚本给别人用,不可能就像上面那个哥们说的直接跟客户讲 lua 好用你去学 lua ,然后除了 lua 有学了一堆东西。至于效率,翻译和运行都是 O(n)的。但是你说的这些和我问的问题关系不大。。
    v2dead
        24
    v2dead  
       2017-01-25 09:09:43 +08:00   ❤️ 1
    说起来你们还喷楼主不会拟定需求,先完成楼主需求再说啊。不管这个写的合不合适。
    1.的解决方法可能可以采用一些讨巧的手段,网络上有公共的 jquery 的 cdn ,可以直接引用这个链接。
    2.肯定是让他自己获取比放到你服务器好,至于怎么获取,我不是前端我不知道,这个问题丢给用户去把: P
    3.基本游戏都是这么做的,开始前一段 Loading 加载资源。你多增加一个 loading 场景就好了。
    boy next♂door
    zhanglintc
        25
    zhanglintc  
       2017-01-25 12:33:00 +08:00
    第一遍看代码我以为是乱码
    hd7771
        26
    hd7771  
    OP
       2017-01-25 12:44:47 +08:00
    @zhanglintc 你肯定不是黄油玩家,这玩意是我找几个资深黄油玩家问出来的。
    timwei
        27
    timwei  
       2017-01-25 14:31:33 +08:00   ❤️ 1
    回问题

    >>>1.
    我的想法是,先在前端检测用户嵌入的页面上,检测是否存在这些外部依赖,没有的话就操作 DOM 帮用户导入

    例如检测 JQuery

    if (typeof jQuery == 'undefined') {
    var script = document.createElement('script');
    script.type = "text/javascript";
    script.src = "JQUERY CDN"; //replace jquery cdn url here
    document.getElementsByTagName('head')[0].appendChild(script);
    }


    >>>2.
    Game Assets 千万别让用户上传到游戏服务器,一是空间二是频宽三是安全性问题。

    定义好 assets 存放的路径配置方式,在文件中解释即可

    >>>3.
    用状态去控制,当某阶段的资源完全读取完毕後,在进入该游戏阶段

    效果应该能近似於
    [进入一个新的游戏阶段] -> [画面提示 loading] -> [该游戏阶段开始]


    >>>4.
    做个用户後台如何?

    用户操作後台使用该服务,提交丶显示结果等等也都在该後台操作

    <del>还可以插点广告赚赚资费</del>


    题外话

    我也有试着弄些 JS

    将一些游戏引擎常用的开发习惯搬到网页上,想迅速产生 SPA

    这是一个初始概念的 DEMO:

    https://timwei.github.io/rem-mywife/main.html#demo

    不过弄着弄着发现这梦太美,会遇到各浏览器差异性带来的问题

    处理起来会很坑

    懒癌发作就放着了
    murmur
        28
    murmur  
       2017-01-25 16:47:53 +08:00
    @v2dead 那个 galgame 的引擎要多少有多少, vb 差不多的语法,认识一个人都开始出作品卖碟子了
    这东西拼的技术?拼的剧情? NONONO !还不是谁的小姐姐好看
    需求这东西,现在都 2017 年了,你能想到的别人早做完了
    为什么要前端呢。。你前端要处理多大数据加载量啊,每张都是图还动不动要加音视频或者语音的
    timwei
        29
    timwei  
       2017-01-25 17:25:06 +08:00
    重复造的不是轮,是浪漫

    大型资源,如长达十来分钟的背景音乐,才会需要特别在後端处理分割,前端延迟加载

    背景图片丶人物立绘或人物语音,大小通常不大,随着游戏阶段加载资源就好了

    DMM 上有蛮多 HTML AVG 页游的, LZ 可以去看看他们的一些处理方式
    hd7771
        30
    hd7771  
    OP
       2017-01-25 17:35:43 +08:00
    @murmur 国内做相关引擎的我只服面包组,您那位朋友是哪位大组的啊,国内比较出名的制作组据我所限的知识也没见到哪个是自研引擎啊。而且 web 相关的都是 flash ,但就算有了和我什么关系。而且我为毛要在 web 前端搞事,就是为了学 web 前端。我是一个码农,我只能做好自己的事,而且我还没开始工作,放假没有其他事情做,闲着还不如撸这个。
    前端圈子里明显热心,学到不少。像您进来就说些莫名其妙的话然后各种不行的前端我还是第一次见,毕竟不管有没有用,思考问题本身对于程序员就是有意义的,不是么?至少在大佬帮助下,这玩意就算其他人不能用,我方便自己和朋友做一个小东西插入到自己网页上也是可以的吧。
    hd7771
        31
    hd7771  
    OP
       2017-01-25 17:42:46 +08:00
    @timwei 我本来就是抱着学习的心态来做这个的,那位大哥说你白搞了,数据库、编译器之类的基础设施都有那么多种。按他的想法就是,大一的学生到了学校,老师直接说,大家别学习了,和我去搞量子计算机吧,其他的东西都被别人搞烂了。
    FrankHB
        32
    FrankHB  
       2017-01-25 17:52:02 +08:00   ❤️ 1
    @murmur 撸个解释器要毛编译原理……有几个人喜欢作死倒腾上下文相关文法?
    要是光论语法…… Lua 比起 SICP 上的玩具都是一坨呵呵。当然大多数比 Lua 更作死的就不用提了。
    murmur
        33
    murmur  
       2017-01-25 21:24:03 +08:00
    @hd7771 都是搞过前端的,才不忍心你上来就被坑,造轮子之前先学会用轮子,以前也是懵懂的时候写过组件,后来发现就一坨屎,原因很大一部分就是不懂需求,结果做做改改搞出一坨无法维护的代码

    @timwei 按照前端优化理论声音和图片都要压缩的,但是对于 galgame 这不行啊,你把图片和音频全压了撸点就没了。。

    什么需求用什么技术,前端不是万能的,我希望你懂这点,前端现在太浮躁了,啥都想用 js 开发
    murmur
        34
    murmur  
       2017-01-25 21:50:31 +08:00   ❤️ 1
    既然你想要建议,那我就直说,你这个文法的可读性就是 0 ,为什么把 click 也放进去呢?看上去跟按键精灵一样
    标准化是什么意思,选择了前端就优先考虑 json ,或者长得像 json 的,或者跟 html 、 css 这些搭边的
    我把你的语法改了一下 不仅流程清晰了很多 还可以轻松加扩展
    lhc70000
        35
    lhc70000  
       2017-01-26 03:45:28 +08:00   ❤️ 1
    不太建议造轮子啊...

    有 novelsphere ( http://js.novelsphere.jp )又有面包工坊在做的 AVG.js... 都直接兼容 KAG 脚本了,感觉几乎没什么可以改进的;要说脚本语言的简洁度, ren'py ( https://www.renpy.org )的语法也够了,很难再简洁。

    如果想吸引人来用的话感觉一个是稳定性一个是自己的游戏平台,这些比语法重要得多。


    正经答问题:

    1. 按你的设定应该是用户来搞了,但是只返回 js 没看出有什么好处,还不如给用户一个网页;
    2~3. AJAX 后台加载;
    4. 没啥好方法,说不定得(像大多数 gal 引擎一样)做一个编辑器...


    说实话,语法的设定让我眼前一亮(有点结构化的感觉很棒),但是有几点建议...

    - click 之类的最好不要单独写成命令,实际游戏里几乎每句之后都要点击,都写出来就太多了
    - 对话的名字部分也可以先用类似变量的东西存着,毕竟每句都要把主角姓名打一遍很是麻烦

    总之就是减少重复性的内容啦。你可以先参考一下各大引擎的脚本语法,提炼出不足,然后集中改正。


    以上只是我自己的建议,请不要太介意 ><
    Technetiumer
        36
    Technetiumer  
       2017-01-29 19:03:30 +08:00   ❤️ 1
    我瞎写的。。。。

    资源
    一堆图片、音频,可被模板 / 页面复用。

    模板
    一个界面状态,比如“显示人物 xxx 在旁边的对话框,有两个选项”,界面上的按钮、嵌套关系等等都用 XML 描述,可被复用。

    页面
    继承一个模板,然后添加详细内容,比如“对话框的内容,选项 1 是肛,选项 2 是不肛”,唯一 ID 就是文件名,被流程树调用。

    流程树
    主体逻辑,显示页面,接收页面的返回值,判断、处理等等,显示下一个页面。
    比如
    ptest_result = ShowPage("page_test")

    if(ptest_result = “ gang ”)
    {
    ShowPage("page_gang")
    }
    else{
    ShowPage("page_bugang")
    }

    直接写 JS 多好

    用户写好后把模板、页面、流程树, zip 压缩上传,服务端编译,打包成 zip ,用户下载解压,放入没上传的资源文件夹,打开 index.html 即可玩。
    或者做一个游戏平台,全部上传,产生一个唯一链接,全部托管到服务器。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3369 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:59 · PVG 18:59 · LAX 02:59 · JFK 05:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.