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

Project1

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

[已经解决] 有没有人知道内置脚本的的循环是怎样进行的

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
42 小时
注册时间
2017-6-8
帖子
36
跳转到指定楼层
1
发表于 2017-7-7 14:16:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 kys2016 于 2017-7-8 01:32 编辑

内置脚本里很多代码都是每帧执行一次,但是为什么从头到尾都找不到跟循环有关的语句

Lv1.梦旅人

梦石
0
星屑
50
在线时间
42 小时
注册时间
2017-6-8
帖子
36
2
 楼主| 发表于 2017-7-7 14:23:23 | 只看该作者
本帖最后由 kys2016 于 2017-7-8 01:28 编辑

已解决,循环的根源在7楼。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1239
在线时间
898 小时
注册时间
2014-12-4
帖子
379
3
发表于 2017-7-7 16:39:46 | 只看该作者

  1. /** Loop 循环*/
  2. Game_Interpreter.prototype.command112 = function () {
  3.     //返回 true
  4.     return true;
  5. };

  6. /** Repeat Above 重复上述*/
  7. Game_Interpreter.prototype.command413 = function () {
  8.     //运行{
  9.     do {
  10.         //索引--
  11.         this._index--;
  12.         //当 (当前命令 缩进 !== 缩进)
  13.     } while (this.currentCommand().indent !== this._indent);
  14.     //返回 true
  15.     return true;
  16. };

  17. /** Break Loop 断开循环*/
  18. Game_Interpreter.prototype.command113 = function () {
  19.     //当(索引 < 列表 长度 - 1 )
  20.     while (this._index < this._list.length - 1) {
  21.         //索引++
  22.         this._index++;
  23.         //命令 = 当前命令()
  24.         var command = this.currentCommand();
  25.         //如果 (命令 编码 === 413 并且 命令 缩进 < 缩进 )
  26.         if (command.code === 413 && command.indent < this._indent) {
  27.             //中断
  28.             break;
  29.         }
  30.     }
  31.     //返回 true
  32.     return true;
  33. };
复制代码

MV自带的插件是这样  不知道你要实现什么  有啥问题的话可以到群277713429里 大家一起讨论

点评

写一个帧循环的插件  发表于 2017-7-7 17:00
不是插件,我说的是内置脚本的循环,看楼下  发表于 2017-7-7 16:52
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
42 小时
注册时间
2017-6-8
帖子
36
4
 楼主| 发表于 2017-7-7 16:50:34 | 只看该作者
@翻滚牛宝宝 举个简单的例子,rpg_objects.js下的Game_Timer类的update函数,这个函数就是让this._frame每帧减一,但是在这里只能看到让this._frame减一的代码,那么让它每帧执行一次的代码在哪里呢?
  1. Game_Timer.prototype.update = function(sceneActive) {
  2.     if (sceneActive && this._working && this._frames > 0) {
  3.         this._frames--;
  4.         if (this._frames === 0) {
  5.             this.onExpire();
  6.         }
  7.     }
  8. };
复制代码

点评

不知道你要实现什么  发表于 2017-7-7 16:54
MV的机制就是 每一帧 他都把所有的脚本 从头到尾 执行一次 ,每一代都是这样好像  发表于 2017-7-7 16:53
所有的代码,每一帧都执行了一次  发表于 2017-7-7 16:52
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
42 小时
注册时间
2017-6-8
帖子
36
5
 楼主| 发表于 2017-7-7 16:57:16 | 只看该作者
本帖最后由 kys2016 于 2017-7-7 17:09 编辑

我觉得在内置脚本中应该有一个地方是控制这个循环的。

点评

这个循环控制了做啥,要是停了,整个游戏都停了  发表于 2017-7-7 17:19
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
196 小时
注册时间
2014-8-7
帖子
58
6
发表于 2017-7-7 21:58:02 | 只看该作者
写在update里就是一秒执行60次,所以你发的计时就是1秒60帧,明白没,你F8打开测试一个一直update的你就看出来了

点评

问题是在js文件中没看到有让它一秒执行60次的的代码啊,这部分代码在哪里?  发表于 2017-7-7 22:04
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
370 小时
注册时间
2016-1-7
帖子
81
7
发表于 2017-7-7 22:06:08 | 只看该作者

点评

就是这里,多谢大佬指点。  发表于 2017-7-8 01:33
把这段黑掉看看还会不会循环运行update  发表于 2017-7-7 22:19
就是这个requestAnimationFrame()带动了整个游戏的循环吗?  发表于 2017-7-7 22:07
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3404
在线时间
461 小时
注册时间
2013-12-7
帖子
333
8
发表于 2017-7-8 04:37:05 | 只看该作者
本帖最后由 ekmomo 于 2017-7-8 04:43 编辑

“内置脚本里很多代码都是每帧执行一次” 这个观点本身就是错误的

简单的说:所有代码都是调用才执行(运行)。
对于MV来说,只有写在function以外代码会被执行及DOM Event会响应执行。他们的实质是window对象的一次运行
游戏开始时仅仅是执行了一次 Onload(Main.js)来调用SceneManager和Scene_Boot。

window.onload = function() {
    SceneManager.run(Scene_Boot);
}

如果你把SceneManager.run(Scene_Boot)改成alert('Hello RPGMaker')的话游戏内的任何代码都不会执行。                              最直观的例子就是如果你在插件中改了分辨率而不去调用SceneManager的话分辨率是不会有任何变化的。

当然,以上仅仅是简单的说。事实上,JS的结构相当有趣。

代码总是被截……我就不举例子了……

点评

window.onload 实际上是浏览器的响应执行,在onload的时候执行一次。  发表于 2017-7-17 17:44
那为什么SceneManager.run(Scene_Boot)是写在function里面的还是被执行了,为什么不把它直接写在外面,像Main.js的第一行PluginManager.setup($plugins)。  发表于 2017-7-8 12:47
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-7 16:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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