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

Project1

 找回密码
 注册会员
搜索
楼主: miantouchi
打印 上一主题 下一主题

[已经解决] [已解决]RGSS脚本运行顺序一些问题?

[复制链接]

Lv5.捕梦者

梦石
0
星屑
37844
在线时间
5422 小时
注册时间
2006-11-10
帖子
6549
1
发表于 2019-3-14 21:27:00 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-3-14 22:25 编辑

首先告诉你一个真相!! MAIN上面的脚本全部都是"定义方法" ,游戏里真正运行的脚本, 就只有这个"Main"

所以, 你的第2个问题解释很简单,  就是RGSS脚本规则:  重复定义的方法, 以后面的为准,  重复定义的类里的相同方法, 当然也一样

然后, 脚本如何运行的呢?

  $scene = Scene_Title.new
  # $scene 为有效的情况下调用 main 过程
  while $scene != nil
    $scene.main
  end


这里, 可以看到, 它是一直在循环着用$scene这个全局变量调用 scene类的main这个方法(这里先纠正下你的概念, 不是"跳转" 而是"调用"哦, 它并没有移动位置的XD)

试试, 运行下这个代码 :  $scene = nil

可以发现, 运行这个代码就退出游戏了(等于终止了上面的循环)

然后, 再去看看scene类, 和其他的类有什么不同?  没错,就是scene类都有这个main方法,  它就是用来让 $scene.main 调用的, 而其他的类都只有"方法的定义", 没有"实际的运行"

最后, 全局搜索下 $scene,  可以发现, 它就是在到处调用各种"场景实例", 通常都是在"退出"的地方可以看到这句, $scene = Scene_XXXXX.new

从这里可以知道了吧,  小的场景,像只有一个窗口的 end 啦, 大的场景, 像一堆call的map啦,  复杂的场景, 像分成四份的battle啦, 都是通过 替换 $scene 所赋值的实例来显示出来的

scene类的main里面都有一个loop do的循环, 在循环中调用上面那堆脚本定义的各种方法, 就这样形成了游戏过程。当 $scene != self 的时候, 就是$scene被重新赋于新的实例(也就是各种打开,各种退出),  那这个场景就中断循环, 释放掉它调用的窗口和精灵, 结束工作, 由新的场景接班, 这个时候, 画面就由地图,切换成菜单, 战斗等, 脚本就是这样工作的。



思考:  经常可以碰到"我为什么不能在战斗中打开装备" 这样的问题,  具体的原因是什么呢?
     

评分

参与人数 1星屑 +250 +1 收起 理由
RyanBern + 250 + 1 耐心讲解好评

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37844
在线时间
5422 小时
注册时间
2006-11-10
帖子
6549
2
发表于 2019-3-15 10:05:13 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-3-15 10:36 编辑

你说的没错, 跳转就是运行到某一步骤, 出现跳转就意味着, 运行位置出现变动,  你可以用事件: 标签 和 标签跳转 来实际体验下



这个就是运行的指令出现跳转的情况, 你可以发现,当开关1号打开的时候, 永远不会运行 显示文章:第三句, 系统会一直跳转到第一行开始, 依次显示 第一句, 第二句,然后循环

而调用, 是指令并不会出现变动, 它调用该目标的方法结束后 ,会继续执行接下来的指令, 注意, 被调用的目标可以同时被复数对象调用



你之前学的是"重复赋值的话, 下面的会被上面的覆盖" 对吧

试试在游戏里建个NPC, 执行上面的那些脚本, 看看和你理解的有啥不同(可以写在同一个脚本指令框里,我是懒得重新打直接复制的XD,估计又会被某人说不够优雅了 )

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37844
在线时间
5422 小时
注册时间
2006-11-10
帖子
6549
3
发表于 2019-3-15 15:22:24 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-3-15 15:36 编辑

1,其实就是覆盖的, 最后操作 a.y = 64 ; a.opacity = 128, 会发现只有最后一个窗口有变化, 因为这个时候a的指针只是最后一个金钱窗口实例

那其他的为什么会还在? 因为"曾经调用过", 但是没有"释放", 所以画面会留在屏幕上, 但是它们只是"投影", 没有任何功能, 失去指针的它们会被系统自己刷新掉, 如果你到处走走, 会看到窗口自己消失了

为什么最后一个窗口也会消失? 它不是a么?  因为 a是局部变量, 脚本一结束, 它就失效了, 所以第四个窗口等同于"无指针", 如果, 你把a换成@a(实变量), 那第四个窗口就不会消失了



试试, 这样写, 每次和NPC对话, 都会在不同的位置出现一个金钱窗口(而且每次出现都会反应你的金钱变化,但是不会实时刷新)

这个就是"调用", 每次调用金钱窗口实例,但是并没有完全按它原本的方法来, 每次调用都改变了X的值, 而这个改变只是针对调用的对象, 没有对原本的窗口脚本有影响, 所以说,它不是"跳转"

2, 因为默认的1号开关是关闭的咯, 所以没有达成跳转条件, 自然就是三句显示了, 你前面增加一个打开1号开关, 就满足了跳转条件了(左边那个出现条件是多余的), 你可以按我原来的写法, 用F9打开1号开关后再和NPC对话试试

PS: 从这里可以看出, 你事件运用还不熟, 建议先熟悉事件运用, 熟悉下系统的基本逻辑, 再来研究脚本,比较有效率~  事件和脚本是同样的,区别是事件是有加上"预防措施",避免"违规操作",而脚本是要靠"自觉"就是了  就算会用脚本了, 如果你的目的是"做游戏", 某些时候, 使用事件可是会更便利的哦

3,  答案是 : 因为打开装备使用的是 Scene_Equip, 而战斗调用的是 Scene_Battle,  $scene只能一次调用一个scene实例, 所以自然没办法在战斗中打开装备菜单, 非要这么做的话, 战斗会强制终止($scene != Scene_Battle 了) , 想战斗中打开装备菜单, 就要把Scene_Equip引用到的窗口实例,塞到Scene_Battle里, 并在合适的时候刷新它们, 不刷新的话, 就像前面的金钱窗口, 只是显示出来, 不会随着金钱变化而变化咯

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37844
在线时间
5422 小时
注册时间
2006-11-10
帖子
6549
4
发表于 2019-3-16 00:57:47 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-3-16 01:08 编辑

其实如果你事件都不熟悉, 建议还是先从"制作游戏"开始, 比如你之前做的那个复刻游戏, 制作的过程中, 就会诞生: 想做出和原来一样的窗口啦, 原来一样的系统啦, 原来一样的技能啦, 就像我另一个帖子说的, 当自己改造成功的时候, 经验值和成就感都会是MAX哦, 这样有目的的针对"想要实现的效果" 来学习, 会更效率也更有动力~  毕竟, 我们想学脚本, 最终目的也是为了"制作自己想做的游戏"( 只不过踏上脚本不归路的人, 离原本动机越来越远的非常多就是了XD)

1, 测试游戏中, 按F9可以打开 作弊窗口, 这里可以直接操作"变量和开关"

2, 你把所有a都换成 @a , 就可以看到只有最后一个窗口不会自己消失, 因为前面的那几个@a,调用完window_gold的实例后, 就被后面的覆盖掉了, 所以这些实例失去了指针, 就会被系统自然消除掉

你在下一个a = xxxx 之前加的命令, 当然就是操作当前的实例咯, 这个时候又没被重复赋值而覆盖, 证明指令是从上往下执行,并没有出现跳转

3, 不即时刷新, 那是因为这样调用金钱窗口, 没有上面说的中间那个"刷新步骤", 只有1和3, 所以你只能看到窗口生成和窗口释放消失

这次试试调用个大的,  先塞几个道具进去, 然后调用背包窗口,



你会发现, 虽然窗口显示了, 但是操作不了光标~  一直按住上,  会发现, 背包打开的时候,角色还可以到处乱跑

这个就是因为, 没有对这个窗口刷新,所以操作不了光标

然后,让我们做个小动作 ,到 scene_map  这个脚本里, 添加一句



然后, 拿这个 $a 来代替之前的 @a



这个时候试试看会发生什么事



回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37844
在线时间
5422 小时
注册时间
2006-11-10
帖子
6549
5
发表于 2019-3-16 10:00:11 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-3-16 10:24 编辑
miantouchi 发表于 2019-3-16 09:17
不瞒你说,我学习脚本就是为了复刻游戏的,里面有很多界面都需要改,例如战斗界面是纵版的(不同于系统默认 ...


  脚本道, 那是越学越觉得广袤深邃的(茶), 想"学完脚本"再来做游戏,那是不可能的, 很多人就是这样越走越远, 坑越弃越多的, 笑

看完脚本基础入门, 能参考F1看得懂一半的默认脚本内容, 就可以动手啦, 实际动手起来就会发现, 有些东西和你理解的完全就是两回事(笑), 纸上得来终觉浅 绝知此事要躬行。

脚本里有跳转的地方么?

当然有, 每一个if就是一次跳转, 当条件不满足的时候,系统就会直接跳过里面的执行命令, 跳到下一段去了, 被跳过的段是真正的没有被执行, 所以可以称为"跳转", 事件里的标签跳转,是体现在"循环"上

@a是实例变量,$a是全局变量,@a的范围应该是指在那个你写的脚本范围里面能用,$a在所有类里面都能用,是这个原因吗?

你理解的没错, @a是无法直接塞到 Scene_map里去UPDATE的, 因为这里的@a是事件解释器类, 也就是Interpreter

另外Scene_Map它负责的画图范围是哪里,是不是就是负责刷新弹出来的消息框。

Scene_Map负责刷新的东西可不少哦, 它刷新的东西在它的 def update 这段里, 找到后缀是.update 的就是啦,  这里可以初步接触Sprite类, 看看脚本里的Sprite类, 除了两个battle是战斗场景调用的外, 其他都是它调用的哦, Sprite类很麻烦, 这里不提, 以后你再去慢慢和它交流

如果只是说窗口的话, 默认的scene map确实是只负责刷新"对话窗口"(Window_Message), 然而这个窗口就是老大级的啦, 它的复杂程度可不是其他窗口能比的, 笑
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37844
在线时间
5422 小时
注册时间
2006-11-10
帖子
6549
6
发表于 2019-3-16 10:47:00 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-3-16 11:19 编辑

"跳转" 不是只有循环和条件分歧, 同样, "调用"也不是只有赋值和生成实例哦, 你知道脚本的运行顺序就可以了, 会用就行了, 不用去纠结这些, 等你开始写脚本,使用它们就会像你呼吸一样自然了, 你不会整天去纠结你现在是要呼还是要吸对吧?

现在你知道脚本怎么运行了吧

双击游戏图标, WINDOWS窗口出现, 脚本开始工作, 先从上到下过一遍,没有写法错误一直顺利来到Main, $scene 赋予 Scene_Title 实例, 然后开始调用 Scene_Title的main,  生成各种酷炫吊拽靓的精灵和窗口(当然, 默认就一张图片一个窗口=.=), 然后循环刷新它们, 直到玩家操作选项, 然后$scene 重新赋予 scene map 或者 scene load 的实例(或者退出=.=), 释放掉scene title的酷炫吊拽靓的精灵和窗口,  生成其他main的酷炫吊拽靓的精灵和窗口,然后循环刷新它们......

点评

哈哈,差不多明白了,还好有你们的热心帮助。  发表于 2019-3-16 11:08
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-3 18:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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