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

Project1

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

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14106
在线时间
2141 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2019-3-14 19:33:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 miantouchi 于 2019-3-19 11:49 编辑

#==============================================================================
# ■ Main
#------------------------------------------------------------------------------
#  各定义结束后、从这里开始实际处理。
#==============================================================================

begin
  # 准备过渡
  # 设置系统默认字体
  Font.default_name = (["黑体"])
  Graphics.freeze
  # 生成场景对像 (标题画面)
  $scene = Scene_Title.new
  # $scene 为有效的情况下调用 main 过程
  while $scene != nil
    $scene.main
  end
  # 淡入淡出
  Graphics.transition(20)
rescue Errno::ENOENT
  # 补充 Errno::ENOENT 以外错误
  # 无法打开文件的情况下、显示信息后结束
  filename = $!.message.sub("No such file or directory - ", "")
  print("找不到文件 #{filename}。 ")
end
1.脚本是不是先运行上面这段代码到 $scene = Scene_Title.new运行这块,就跳转到Scene_Title这个类里面。
2.我看某侠教程在里面最下面自己复制了一份Scene_Menu,和Scene_ItemSort后,系统直接用下面的自己修改的Scene_Menu这个界面了,
上面的Scene_Menu直接废了吧,就出现灵药,这些自己定义的界面。
3.Scene_ItemSort自己定义了main方法,他影响之前脚本运行顺序吗?表达不太明白,总之我想知道这些类的运行顺序
谢谢,大家能解答下。

1.png (323.39 KB, 下载次数: 19)

1.png

2.png (429.85 KB, 下载次数: 17)

2.png

3.png (57.17 KB, 下载次数: 14)

3.png

Lv5.捕梦者

梦石
0
星屑
37794
在线时间
5400 小时
注册时间
2006-11-10
帖子
6546
2
发表于 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被重新赋于新的实例(也就是各种打开,各种退出),  那这个场景就中断循环, 释放掉它调用的窗口和精灵, 结束工作, 由新的场景接班, 这个时候, 画面就由地图,切换成菜单, 战斗等, 脚本就是这样工作的。



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

点评

game battler 这个类是定义战斗者, 不是战斗场景, 战斗场景在下面 分成4部分, scene_battle 1- 4  发表于 2019-3-15 09:51
跳转就是运行的每一步都到哪里去了,是一步步的。  发表于 2019-3-15 07:33
感谢,我基本明白了运行机制了,但是你说跳转和调用怎么理解区分呢? 调用是不是就是要结果我调用这个类给我返回什么?  发表于 2019-3-15 07:32
战斗是Game_Battler这个类吧,这里面没有$Scene场景变量,没有main方法,是这个原因吗?没有$Scene的改变就没法调用场景变换main方法。  发表于 2019-3-15 07:31

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37794
在线时间
5400 小时
注册时间
2006-11-10
帖子
6546
3
发表于 2019-3-15 10:05:13 | 只看该作者
本帖最后由 灯笼菜刀王 于 2019-3-15 10:36 编辑

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



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

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



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

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

点评

我在楼下发了下,帮我看下,谢谢  发表于 2019-3-15 13:55
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14106
在线时间
2141 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

4
 楼主| 发表于 2019-3-15 13:53:30 | 只看该作者
1.我测试了脚本这个并没有覆盖啊,哈哈,啥原因?

2.另外你的第一个标签脚本,我原样打上的会循环前三句,我自己网上加了条件,才能显示、第一句、第二句反复?

3.思考:  经常可以碰到"我为什么不能在战斗中打开装备" 这样的问题,  具体的原因是什么呢?
Scene_Battle1                                # 处理战斗画面的类。
        Window_Command               # 生成命令窗口
        Window_PartyCommand       # 生成其它窗口
        Window_Help                        # 生成帮助窗口
        Window_BattleStatus         
        Window_Message                  # 生成信息窗口
              
Scene_Battle 2
        Window_BattleResult          # 生成战斗结果窗口
Scene_Battle 3
        Window_Skill                      # 生成特技窗口
        Window_Item                     # 生成物品窗口

我看了下没有以下装备的窗口,只有上面这些窗口,我回答的对不对?
Window_Help          # 生成窗口
        Window_EquipLeft     
        Window_EquipRight
        Window_EquipItem

1.jpg (279.15 KB, 下载次数: 22)

1.jpg

2.jpg (98.21 KB, 下载次数: 12)

2.jpg
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37794
在线时间
5400 小时
注册时间
2006-11-10
帖子
6546
5
发表于 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里, 并在合适的时候刷新它们, 不刷新的话, 就像前面的金钱窗口, 只是显示出来, 不会随着金钱变化而变化咯

点评

哈哈,我还有问题,帮我看看  发表于 2019-3-15 22:03
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14106
在线时间
2141 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

6
 楼主| 发表于 2019-3-15 21:31:05 | 只看该作者
本帖最后由 miantouchi 于 2019-3-15 21:32 编辑

1.用F9打开1号开关后再和NPC对话试试,
    我按F9后是数据库,你的意思是用公共事件里面的开关吗?
2. 因为 a是局部变量, 脚本一结束, 它就失效了, 所以第四个窗口等同于"无指针", 如果, 你把a换成@a(实变量), 那第四个窗口就不会消失了。

我把a.y = 64 ; a.opacity = 128这句加在哪个窗口里面哪个窗口都是一样的,你是加在最后一个窗口,我加在其他三个也一样。
我这块还是没太明白,我把第三个窗口加上@a,行走后第三个窗口也没有消失,其他三个都消失了。是不是我把你的代码加错地方了。

3.每次调用都改变了X的值, 而这个改变只是针对调用的对象, 没有对原本的窗口脚本有影响, 所以说,它不是"跳转"

我测试了确实是每次调用直接刷新当前金币,如果这个时候我获得了多了金币窗口不会显示,只有再次调用才能显示出来。
那跳转就是时时刻刻能检测到金币数量,并且刷新到窗口里面吗?

确实事件那块没咋学完,就是开始看完了,va的迷样神君的视频教程跟了做了一遍,也没啥实战经验,就开始学脚本了。真的需要学的东西太多了现在。

1.png (76 KB, 下载次数: 16)

1.png

2.png (76.11 KB, 下载次数: 15)

2.png

3.png (44.09 KB, 下载次数: 14)

3.png

5.png (84.41 KB, 下载次数: 11)

5.png
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37794
在线时间
5400 小时
注册时间
2006-11-10
帖子
6546
7
发表于 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



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



点评

看看我理解的对不对  发表于 2019-3-16 09:18
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14106
在线时间
2141 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

8
 楼主| 发表于 2019-3-16 09:17:18 | 只看该作者
不瞒你说,我学习脚本就是为了复刻游戏的,里面有很多界面都需要改,例如战斗界面是纵版的(不同于系统默认的纵版),并且人物有攻击动画,双刀流、空手攻击动画,空手攻击有伤害,队伍跟随,菜单栏的修改等等,我这一看,单单靠事件和自身数据库的设置是打不到了,所以我就先从脚本入手了,就没着急直接做游戏,学习脚本,尝试着更改这些窗口。素材库人物行走图都基本弄完了。
第一个问题解决了。
第二个问题差不多明白了什么叫调用了,每次调用会覆盖前面的,顺序是从前往后,不会返回去。那你说,那能不能帮找一处脚本中,调用的地方和跳转的地方,脚本中有跳转的地方吗?
第三个问题$a 来代替之前的 @a,我测试了会刷新物品界面了,并且选择物品同时人物会行走。
@a是实例变量,$a是全局变量,@a的范围应该是指在那个你写的脚本范围里面能用,$a在所有类里面都能用,是这个原因吗?
另外Scene_Map它负责的画图范围是哪里,是不是就是负责刷新弹出来的消息框。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37794
在线时间
5400 小时
注册时间
2006-11-10
帖子
6546
9
发表于 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), 然而这个窗口就是老大级的啦, 它的复杂程度可不是其他窗口能比的, 笑

点评

那我现在怎么办?做其他游戏也没想做的。顺便帮我再看看下下面的。  发表于 2019-3-16 10:24
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14106
在线时间
2141 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

10
 楼主| 发表于 2019-3-16 10:22:56 | 只看该作者
好吧,我先动手制作,先用事件把游戏基本框架做下,然后再慢慢修改各个界面,这样也是行的吧,别游戏做了后来涉及改界面什么的费劲了。
,你看下我画的,
第一步:$scene = Scene_Title.new 生成$scene实例
第二步:调用$scene的main方法
第三步:main方法里面有if.....end,loop do......end这些循环方法,属于跳转命令

所以调用里面包含着跳转,调用是每次调用会覆盖前面的,顺序是从前往后,不会返回去。跳转是遇到指定条件跳到另外一个位置。

1.jpg (194.06 KB, 下载次数: 21)

1.jpg

2.jpg (274.65 KB, 下载次数: 17)

2.jpg

3.jpg (217.26 KB, 下载次数: 10)

3.jpg

点评

因为"下意识"的东西, 很难解释太多~, 比如你试试解释下怎么呼吸, 很多东西实际动手试一下就知道了  发表于 2019-3-16 10:55
好的,我现在对脚本还是陌生感觉,有些时候你们一句话解释的,我可能得解释10句才能明白  发表于 2019-3-16 10:43
所以才提出"调用"和"跳转"的差别  发表于 2019-3-16 10:29
不用纠结这个"跳转"还是"调用"啦, 当初我提到这个是因为你把 $scene = Scene_Title.new 当成"跳到Scene_Title脚本去, 所以无法理解下面的那些脚本怎么办   发表于 2019-3-16 10:28
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-26 07:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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