设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5089|回复: 18
打印 上一主题 下一主题

[讨论] MV的代码解析【持续更新】

[复制链接]

Lv3.寻梦者

唯一的信徒

梦石
0
星屑
1665
在线时间
1357 小时
注册时间
2013-1-29
帖子
1637
跳转到指定楼层
1
发表于 2015-10-1 14:32:11 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 LBQ 于 2015-10-3 10:27 编辑

10月3日:
有了TextManager你说我们要不要i18n
binary json可以试试
10月2日:
没有预想的那么恶心233
COFFEESCRIPT 代码复制
  1. class Scene_Crafting extends Scene_MenuBase
  2.   initialize: ->
  3.     super()
  4.   create: ->
  5.     super()
  6.     this.createBackground()
  7.     this.createWindowLayer()
  8.     this.createGoldWindow()
  9.   start: ->
  10.     super()
  11.   createGoldWindow: ->
  12.     @goldWindow = new Window_Gold(0,0)
  13.     this.addWindow(@goldWindow)


我没法用Plugin更改plugin manager
我选择死亡

pixi.js用的v2感觉很不爽,应该移植到v3的


其实重点是pixi.js啊
想想看这些可能性啊





Google closure compiler的advance编译别想了,mv代码没有预先准备最终产物没法运行
UglifyJs之类的还是可以用
Desktop版本会用Nw.js作为Js后端,可以直接开node
binary json估计是可以用


原网页:http://preorder.rpgmakerweb.com/rpg-maker-mv/



毕竟有游戏了所以解析一下吧:

1:Yanfly下手好快,现在就有脚本了是怎么回事,黑幕吗
2:渲染用的Pixi.js,我很开心

继续读代码中,游戏不知道为何玩不了只能读代码了

3:没有用npm或者commonjs之类的,直接采用的html引用脚本,这个到时候得修一下
4:主题代码被minify或者obfuscate了,不好读

5:core.js:https://www.refheap.com/110141
6:managers.js:https://www.refheap.com/110142

很明显数据库用的json
好评

7:objects.js:https://www.refheap.com/110143,太长了,refheap不知道为何不行。
objects.7z (36.89 KB, 下载次数: 60)
8:scenes.js:https://www.refheap.com/110144
9:sprites.js : https://www.refheap.com/110145
Window.prototype.initialize是什么鬼

看得出来代码是中规中矩的ruby式js....?

本来Js比Ruby更加Functional一些的,但是为了保持惯例继续用Ruby的法则...?
10:window.js:https://www.refheap.com/110146

感觉有点像用Js写Ruby代码233
还是猴子补丁,一堆猴子补丁

JAVASCRIPT 代码复制
  1. Window_BattleLog.prototype.callNextMethod = function() {
  2.     if (this._methods.length > 0) {
  3.         var method = this._methods.shift();
  4.         if (method.name && this[method.name]) {
  5.             this[method.name].apply(this, method.params)
  6.         } else {
  7.             throw new Error('Method not found: ' + method.name)
  8.         }
  9.     }
  10. };


这段代码真心诡异

全部代码打包:
mv-core-src.7z (103.88 KB, 下载次数: 78)

Scene与Scene之间切换都没有什么鬼

数据库json文件打包: data.zip (19.89 KB, 下载次数: 86)

这行走图和脸图让我蛋疼的不行

Sprite的代码:
JAVASCRIPT 代码复制
  1. Sprite.prototype._renderWebGL = function(renderSession) {
  2.     if (this.visible && this.alpha > 0) {
  3.         var spriteBatch = renderSession.spriteBatch;
  4.         if (this._filters) {
  5.             spriteBatch.flush();
  6.             renderSession.filterManager.pushFilter(this._filterBlock);
  7.             if (this.opaque) {
  8.                 renderSession.gl.clearColor(0, 0, 0, 1);
  9.                 renderSession.gl.clear(renderSession.gl.COLOR_BUFFER_BIT)
  10.             }
  11.         }
  12.         if (this._mask) {
  13.             spriteBatch.stop();
  14.             renderSession.maskManager.pushMask(this.mask, renderSession);
  15.             spriteBatch.start()
  16.         }
  17.         spriteBatch.render(this);
  18.         for (var i = 0, j = this.children.length; i < j; i++) {
  19.             this.children[i]._renderWebGL(renderSession)
  20.         }
  21.         if (this._mask) {
  22.             spriteBatch.stop();
  23.             renderSession.maskManager.popMask(this._mask, renderSession);
  24.             spriteBatch.start()
  25.         }
  26.         if (this._filters) {
  27.             spriteBatch.stop();
  28.             renderSession.filterManager.popFilter();
  29.             spriteBatch.start()
  30.         }
  31.     }
  32. };


Pixi.js的同样的方法
JAVASCRIPT 代码复制
  1. PIXI.Sprite.prototype._renderWebGL = function(renderSession)
  2. {
  3.     // if the sprite is not visible or the alpha is 0 then no need to render this element
  4.     if(!this.visible || this.alpha <= 0)return;
  5.  
  6.     var i,j;
  7.  
  8.     // do a quick check to see if this element has a mask or a filter.
  9.     if(this._mask || this._filters)
  10.     {
  11.         var spriteBatch =  renderSession.spriteBatch;
  12.  
  13.         // push filter first as we need to ensure the stencil buffer is correct for any masking
  14.         if(this._filters)
  15.         {
  16.             spriteBatch.flush();
  17.             renderSession.filterManager.pushFilter(this._filterBlock);
  18.         }
  19.  
  20.         if(this._mask)
  21.         {
  22.             spriteBatch.stop();
  23.             renderSession.maskManager.pushMask(this.mask, renderSession);
  24.             spriteBatch.start();
  25.         }
  26.  
  27.         // add this sprite to the batch
  28.         spriteBatch.render(this);
  29.  
  30.         // now loop through the children and make sure they get rendered
  31.         for(i=0,j=this.children.length; i<j; i++)
  32.         {
  33.             this.children[i]._renderWebGL(renderSession);
  34.         }
  35.  
  36.         // time to stop the sprite batch as either a mask element or a filter draw will happen next
  37.         spriteBatch.stop();
  38.  
  39.         if(this._mask)renderSession.maskManager.popMask(this._mask, renderSession);
  40.         if(this._filters)renderSession.filterManager.popFilter();
  41.  
  42.         spriteBatch.start();
  43.     }
  44.     else
  45.     {
  46.         renderSession.spriteBatch.render(this);
  47.  
  48.         // simple render children!
  49.         for(i=0,j=this.children.length; i<j; i++)
  50.         {
  51.             this.children[i]._renderWebGL(renderSession);
  52.         }
  53.  
  54.     }
  55. };


MV这个代码真的可以去死了,


现在我才意识到Scene是Stage的一种,EB你去死吧

Pixi用的v2,应该无大碍,先这样OTL

评分

参与人数 1星屑 +45 收起 理由
Tink + 45

查看全部评分

『我只是一个正在潜心修炼的渣乐师罢了』
Dear Time\(^o^)/~


假如上面的图片挂了的话麻烦各位去发个帖 @ 一下 orzFly 让他修复 deartime

Lv3.寻梦者

梦石
0
星屑
1185
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

19
发表于 2015-10-19 22:55:09 | 只看该作者
好奇是不是拿 Opal 直接编译出来的。

点评

LBQ
没有引用opal的库肯定不是啊  发表于 2015-10-20 17:52
QAQ终于见到deathKing大大了  发表于 2015-10-20 01:27
应该不是……高估 Eb 了 = =b  发表于 2015-10-19 22:56

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
48
在线时间
784 小时
注册时间
2013-1-4
帖子
1102
18
发表于 2015-10-15 01:24:34 | 只看该作者
求更啊 在不更就要被上边的持续更新打脸了233
之前没好好看,今天变读代码边试着写了些东西。场景window什么的
那个window还是一如既往的恶心啊
既然MV是js版的ruby那么看着Bitmap之类的是不是可以反推出RGSS里的那些玩意233
还有我比较好奇接下来是JGSSQAQ好诡异的名字
话说大体代码有扫一遍不过还是有一大堆完全不知道
脑袋炸咧
一想起three.js就激动啊 虽然直接做3D什么的不现实,不过要是封装一些比较好玩的组件什么的也很不错啊
还有粒子系统 骨骼动画什么的也有希望啊(国产的白鹭貌似有个开放的骨骼动画编辑器和库 貌似也能拿来用的样子
不过写js代码简直恶心到死啊啊啊啊啊啊
一大堆简直什么鬼的玩意
class A < B
  def initialize
     super
     .....
硬是被拖成:
function A() {
    this.initialize.apply(this, arguments)
}
A.prototype = Object.create(B.prototype);
A.prototype.constructor =A;
A.prototype.initialize = function() {
    B.prototype.initialize.call(this);

感觉以后打代码都能打废ORZ

最后,求大触带 求大腿抱

点评

不然以Java Script這種動態語法來說用鴨子模式判斷就夠了  发表于 2015-10-16 19:18
那是MV為了要把Ruby給Java Script化(包括繼承什麼的)才搞那麼詭異的寫法  发表于 2015-10-16 19:17
LBQ
那是MV尿性,不是js问题  发表于 2015-10-15 18:37
RM-GUI延期。。。最近被黑心老板压迫T_T
二次元少女的shitake,长着长脸,身高165,蓝色卷双马尾,FCUP,瞳色黑色,病气和御宅属性,是天才少女。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
45
在线时间
47 小时
注册时间
2009-6-1
帖子
127
17
发表于 2015-10-14 14:31:46 | 只看该作者
看了一下代碼解析後,發現MV的儲存系統是分成兩種,一個是使用Local Storage,另一個是使用node.js的fs模組,用變數判斷是不是在客戶端來決定使用哪個
所以我猜EXE應該是用node.js的EXE框架包起來,其他的平台就使用Cordova/Phonegap框架,使用localStorage儲存(所以這次的存檔應該也是使用JSON格式)

点评

LBQ
不过存档方式倒是没研究过OTL,无论如何很多还是挺明显的  发表于 2015-10-14 19:48
LBQ
明显nw.js啊,代码里面都写着有nw.js。存档不用json也没有其他自带的方式了,这些都挺明显的。  发表于 2015-10-14 19:34
我还以为以eb的尿性本地打包会折腾出什么加密数据格式的呢  发表于 2015-10-14 15:12
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1347
在线时间
676 小时
注册时间
2009-11-11
帖子
2790
16
发表于 2015-10-13 14:06:50 | 只看该作者
一看到this就知道是java了,俺还是喜欢原来的ruby

点评

就我所知C#、Java、Java Script都會運用到this關鍵字  发表于 2015-10-14 14:26
LBQ
很遗憾的不是java而是javascript,并且this不是java的也挺多  发表于 2015-10-13 20:04

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
106 小时
注册时间
2013-10-16
帖子
6
15
发表于 2015-10-10 10:20:07 | 只看该作者
代码什么的完全不懂,听说MV换了JS+HTML5,正好就不用学rgss了,刚刚下了JS入门教学啃起来
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
45
在线时间
47 小时
注册时间
2009-6-1
帖子
127
14
发表于 2015-10-9 23:37:17 | 只看该作者
現在公開的這個範例遊戲在本地端執行的話會有問題,因為一些瀏覽器會鎖權限不讓HTML讀取本地端檔案
(我方才測試的結果只有Firefox成功,Edge/IE/Chrome都會卡死或者是跳出「沒有讀取本地端檔案權限」的錯誤)

不過畢竟是HTML5,搭配Cordova/Phonegap功能應該會多很多,像是Geolocation/Compass/Sensor等功能應該都是可以加入的
日本那邊甚至有人已經做出課金道具系統了
(另外我是有點好奇RMMV到底是怎麼存檔的,是透過HTML5新增的Local Storage功能還是怎樣呢)

至於單機遊戲會是怎樣的格式,我個人猜應該是和Cordova/Phonegap原理一樣用EXE內包一個Browser進去,Android/iOS應該就是直接用Cordova那一套,
但因為有Cordova框架,所以就沒有直接執行HTML時會有的本地端存讀權限被鎖的問題。

点评

LBQ
是的,因为本身是要用服务器来做的。最后的确是打包,可能性的确很多  发表于 2015-10-10 18:40
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
帖子
590
13
发表于 2015-10-2 19:49:22 | 只看该作者
taroxd 发表于 2015-10-2 08:03
数据库在服务器端,你怎么改

当然你可以把包抓下来黑了

请问下什么是服务端啊

这游戏  数据库也就是以前的 Data 文件夹 是放在服务器上的?

也就是玩这个软件做的单机游戏必须联网?

点评

我不知道是在线提取的啊,看到有Data.zip 就下载了,然后发现用txt打开能直接改数据,所以有了7楼的提问。  发表于 2015-10-2 22:27
1.你回帖里哪个字提到数据格式了?2.这个帖子中的脚本内容就是从官方放在服务器在线游戏范例里提取的  发表于 2015-10-2 22:15
然而我问的是单机时候的数据格式,为什么你们会这么受橙○的影响,会直接想到数据是在服务器上的,下下来可单机玩。  发表于 2015-10-2 22:13
所以我后半句不是说了吗:你把游戏下载下来的话不联网单机可以玩  发表于 2015-10-2 21:53
我的意思就是单机时候的数据格式啊,一般都会先想到单机的吧?  发表于 2015-10-2 21:30
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
10061
在线时间
4430 小时
注册时间
2005-10-22
帖子
6955

开拓者贵宾

12
发表于 2015-10-2 15:22:28 | 只看该作者

准备开MV开荒团。
大家填好人物卡,注意职业平衡,记得带好骰子(大雾)
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1759
在线时间
2524 小时
注册时间
2010-10-12
帖子
1454

开拓者

11
发表于 2015-10-2 10:34:29 | 只看该作者
这猎奇的语法,虽然学过java但是感觉还是亚历山大。

不过在此想请教些问题, 是不是MV用js编程后效率会大大提高?

点评

LBQ
本质变化的确不大...的确翻译起来还算好,但是希望别太大  发表于 2015-10-2 11:29
听上面某楼说MV的脚本几乎是ACE的js版,如果本质上没有太大变化是不是大多ACE脚本可以直接翻译城js用  发表于 2015-10-2 11:17
LBQ
代码效率会大大提高,写代码效率估计有折扣  发表于 2015-10-2 10:58

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-19 19:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表