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

Project1

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

[已经解决] 請問如何用全局變量給腳本設定一個開關

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
461 小时
注册时间
2008-11-19
帖子
607
跳转到指定楼层
1
发表于 2012-4-16 18:09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 eve592370698 于 2012-4-18 11:33 编辑

版主eve说:脚本初学者一定要看一下此贴特别是后面各位在回复中对脚本知识的讲解:在实际操作中非常受用!

我想設定一個全局變量作為遊戲中決定要不要使用"角色跟隨角本"的開關 來該關整個腳本
(不是要讓跟隨的腳色變透明喔 要讓整個腳本停止運作 不然在用ZTBS進入戰鬥MAP的時候會衝突)
請問要怎麼實現?

我胡亂想到的方法是(高手們請噴)....將整個"角色跟隨角本"包在一個字定義的module內....(例如 module 角色跟隨)
然後再另建一個空白腳本裡面設製一個用來當開關的全局變量(例如$角色跟隨角本開關)
在空白腳本裡面寫(用代碼框會發出空白帖...所以直接寫了)

版主eve说,这种直接在类下面弄条件分歧等非赋值是错误的。

  1. class 角色跟隨角本開關
  2.   case $角色跟隨角本開關
  3.   when true #設定$角色跟隨角本開關=0時 執行module 角色跟隨
  4.     角色跟隨   
  5.   else
  6.                #這邊我不會了 = = 要怎麼樣設定才能取消when true的設置阿?
  7.   end
  8.   
  9. end
复制代码
也不知道思路對不對...或是完全錯誤

点评

说真的,本问题也是我在研究FUKI对话框时困扰我好久的问题,是避免在RGSS优化脚本特别是按条件判定参数的时候必不可少的一项知识!  发表于 2012-4-18 11:29
能够问这个问题已经到达非常高的境界了,说真的我已经比不上你了……  发表于 2012-4-17 18:28
回复错了…抱歉。  发表于 2012-4-16 23:26

评分

参与人数 2星屑 +36 收起 理由
hys111111 + 24 能够问这个问题已经到达非常高的境界了,说.
eve592370698 + 12 肯于出来探索,鼓励一下。

查看全部评分

Lv1.梦旅人

梦石
0
星屑
50
在线时间
112 小时
注册时间
2011-10-6
帖子
182
来自 2楼
发表于 2012-4-17 20:05:01 | 只看该作者
sai90306 发表于 2012-4-17 17:15
請問為什麼我在
腳本中插入在事件中插入腳本對話後
會出現"unidentified method 'hello' for Eve59237069 ...

定义在这里作为动词使用
来分析这段代码

  1. def a; p 5; end
  2. if $abc==true
  3. def a; p 21; end
  4. end
  5. $abc=true
  6. a
复制代码

结果是多少呢?
5!

def这个是下定义。

接下来分析运行顺序
第一行下了a的定义、显示5。接着下一行。
第二行判断$abc,但是这个时候还没有$abc所以跳过到第五行了。第三行的定义实际上没有执行。
第五行才设置$abc。
第六行调用a,根据下的定义于是显示5。这里并不会返回去判断。因为ruby不管在不在类中代码都是按顺序执行的。于是程序结束。

因此正确的方法是在定义内判断,而不是在下定义的时候判断。因为只要后者只会执行一次,相当于下了定义之后就和abc再也没有关系。

正确的代码
  1. def a
  2. if $abc==true
  3. p 21
  4. else
  5. p 5
  6. end
  7. end

  8. $abc=true
  9. a
复制代码


点评

感謝明久君的詳細解說!這個部分我理解了!  发表于 2012-4-17 21:13
前排时果然是在卖萌...  发表于 2012-4-17 20:12

评分

参与人数 1梦石 +2 +2 收起 理由
eve592370698 + 2 + 2 对于脚本初学者来说,至关重要!.

查看全部评分

回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
461 小时
注册时间
2008-11-19
帖子
607
3
 楼主| 发表于 2012-4-16 21:52:13 | 只看该作者
本帖最后由 sai90306 于 2012-4-16 21:53 编辑

感謝鼓勵

以下是我參考後做的修改
角色跟隨腳本的修改...

module RUNTA
"角色跟隨腳本"的內容
end

空白腳本寫入
  1. class runTA
  2.   def initialize
  3.   case $RUNTA_Switch
  4.   when 1
  5.     RUNTA   
  6.   else
  7.   end
  8.   
  9. end
  10. end
复制代码
確實角色不跟隨了
但為什麼在遊戲中用事件讓$RUNTA_Switch=1還是無法變回跟隨呢?
回复

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

4
发表于 2012-4-16 22:34:56 手机端发表。 | 只看该作者
本帖最后由 orzfly 于 2012-4-16 23:03 编辑

@eve592370698反驳。

  1. $DEBUG=true
  2. class Eve592370698
  3.   if $DEBUG
  4.     p "谁说我跳不出来?"
  5.     def hello
  6.       p "嘿嘿"
  7.     end
  8.   end
  9. end
  10. Eve592370698.new.hello
  11.   
复制代码
@eve592370698

请再解释这个
  1. p (class F2; (class << self; self; end).methods.each {|i| self.send(:define_method, :"hi#{i}"){i} }; self; end).new.hinew
复制代码

评分

参与人数 1星屑 +40 收起 理由
zhixin1997 + 40 指正错误

查看全部评分

回复

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

5
发表于 2012-4-16 23:07:31 | 只看该作者
本帖最后由 晴兰 于 2012-4-16 23:37 编辑

用Kernel#trace_var就可以跟踪全局变量通过赋值进行的改变了
RUBY 代码复制
  1. class RunTA
  2.     def notify(xx)
  3.        case xx
  4.          when 1
  5.             RUNTA
  6.        end
  7.     end
  8.     trace_var(:$runtaswitch){|v|
  9.        ObjectSpace.each_object(self){|x|
  10.            x.notify(v)
  11.        }
  12.     }
  13. end
  14.  
  15. $__traceobj = RunTA.new


然后
在某处进行了$runtaswitch 的赋值操作:
RUBY 代码复制
  1. $runtaswitch = 1
���������

点评

似乎是when else无处理  发表于 2012-4-16 23:38
你需要自己再创建一个对象,比方说$__traceobj=RunTA.new; 或者看我后面回复的那个帖子  发表于 2012-4-16 23:38
我这里用的变量名是$runtaswitch可能和你的有一些不一样, 这个连trace_var后面的部分也要改掉,然后如果你不需要创建对象,我再回复一个帖子  发表于 2012-4-16 23:36
我照個修改了 不過效果好像還是跟原來一樣 不知道是不是哪裡出錯了  发表于 2012-4-16 23:34
|x| |v|用||围起来的部分,相当于一个参数列表。正常你可能会写def a(x,y)等等,这里使用就会写成{|x,y| ...}  发表于 2012-4-16 23:31

评分

参与人数 1星屑 +40 收起 理由
zhixin1997 + 40 补发

查看全部评分

签名被屏蔽
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
112 小时
注册时间
2011-10-6
帖子
182
6
发表于 2012-4-16 23:18:42 手机端发表。 | 只看该作者
本帖最后由 吉井明久 于 2012-4-16 23:24 编辑

@eve592370698

您说的这是什么语言呢好吃么?
是VB还是C#呢?
噢不,好像有人说这里是JS区。难道是传说中好吃的JS么?
那可没有class的概念而只有prototype嘛。

⊙ω⊙

点评

这里是Ruby语言。别的语言我一点都不懂。而且我也不是用规范的《Ruby For Windows》这个软件而是RMXP的RGSS。  发表于 2012-4-17 07:26
請問我該再module unRUMTA裡面些什麼才好呢?  发表于 2012-4-16 23:50
明久君...亂入了?  发表于 2012-4-16 23:23

评分

参与人数 1星屑 -40 收起 理由
zhixin1997 -40

查看全部评分

回复

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

7
发表于 2012-4-16 23:37:03 | 只看该作者
本帖最后由 晴兰 于 2012-4-16 23:45 编辑

其实如果你不用创建对象,可以用单例的写法,有很多写法,比方说下面的class换成module。

RUBY 代码复制
  1. class RunTA
  2.     def self.notify(xx)
  3.        case xx
  4.          when 1
  5.             RUNTA
  6.        end
  7.     end
  8.     trace_var(:$runtaswitch){|v|
  9.          self.notify(v)
  10.     }
  11. end


用法
RUBY 代码复制
  1. $runtaswitch = 1


点评

或是能夠在遊戲中調用出腳本編輯器的關閉腳本功能?  发表于 2012-4-17 00:13
這個腳本好像很強大!不過要怎麼使用呢?我安裝好了 按F7會顯示使用的腳本 但是這是不只適用於測試?  发表于 2012-4-17 00:13
某个脚本的功能,可以参考http://bbs.66rpg.com/thread-222566-1-1.html  发表于 2012-4-16 23:58
不不 我只是举例……似乎楼主的脚本也是这样举例的,若是呼叫module RUNTA的具体方法 也应该是RUNTA::方法名 参数,另外如果一般性而言要禁用或者启用  发表于 2012-4-16 23:58
我以為RUNTA就是呼叫 module RUNTA的意思...不對嗎?  发表于 2012-4-16 23:55
签名被屏蔽
回复

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42471
在线时间
7606 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

8
发表于 2012-4-17 00:42:05 | 只看该作者
通常这种脚本加开关得在刷新的地方加。

点评

您说得没错。我在VA变换窗体时遇到麻烦就是这个,后来是夏娜帮我解决的。  发表于 2012-4-17 07:11
看脚本如何啊  发表于 2012-4-17 01:12
我看過KGC大的腳本裡有用$imported[ ]來載入他自己寫的其他腳本...可是不懂詳細的設置方法  发表于 2012-4-17 01:08
可以請大大說明具體方法嗎? 感謝!!  发表于 2012-4-17 00:59

评分

参与人数 1星屑 +40 收起 理由
zhixin1997 + 40 补发

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
432
在线时间
4175 小时
注册时间
2010-6-26
帖子
6474
9
发表于 2012-4-17 07:09:48 | 只看该作者
本帖最后由 eve592370698 于 2012-4-17 07:44 编辑
orzfly 发表于 2012-4-16 22:34
@eve592370698反驳。@eve592370698

请再解释这个


不好意思,出现这个错误是我缺乏相关理论知识,这怨我。
在自由Ruby语言里头,这么做绝对是没问题的,但是在错综复杂的RGSS里面,这种方式就有点乱,特别是调用
$game_switches和$game_variables,您的这种方法是用print命令或者在rgss调用内部方法确实也可以,但是在条件分歧的判定上是一次性的:
  1. $abc = false
  2. class Eve592370698
  3.   if $abc == true
  4.     p "谁说我跳不出来?"
  5.     def hello
  6.       p "嘿嘿"
  7.     end
  8.   else
  9.     p "就是错误的"
  10.   end
  11. end
  12. $abc = true
  13. Eve592370698.new.hello
复制代码
似乎是把全局仅取用了它的第一个值。

顺便补充一个代码,这位先生测试一下。
‘‘──eve592370698于2012-4-17 07:43补充以下内容
  1. $abc = true
  2. class Eve592370698
  3.   if $abc
  4.     p "谁说我跳不出来?"
  5.     def hello
  6.       if $abc
  7.         p "嘿嘿"
  8.       else
  9.         p "cao"
  10.       end
  11.     end
  12.   else
  13.     p "就是错误的"
  14.   end
  15. end
  16. $abc = false
  17. Eve592370698.new.hello
复制代码
’’
潜水,专心忙活三次元工作了……
回复

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

10
发表于 2012-4-17 08:26:13 手机端发表。 | 只看该作者
eve592370698 发表于 2012-4-17 07:09
不好意思,出现这个错误是我缺乏相关理论知识,这怨我。
在自由Ruby语言里头,这么做绝对是没问题的,但 ...

当然是这样。只是你说不可以在class里出现其他语录。

接下来的话顺便给楼主。

ruby里一切都可以称为语录
像def xxx; end1,class Bbb; end
都可以

而对于类的定义 其实是打开了一个新的context(上下文) 然后执行里面的语录

因此直接写的判断立即判断了 定义了相关方法 而不是延迟判断。

正确的思路是fux2的
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
270 小时
注册时间
2010-2-4
帖子
1305
11
发表于 2012-4-17 08:39:33 | 只看该作者
你这样写语法上也没错,而且没有必要放到class里,直接放顶层就行了...不过这个语句只是编译阶段执行而已,主要用作调试之类的,你要游戏中随时控制的话必须读懂脚本才行,有些脚本一旦定义完毕就会生效,你要找到恰当的位置给它加上个开关...真要方便控制脚本的话可以把各个脚本放到不同module里,然后重定义scene在每次新建时按需加载module,不过这也得懂脚本- -b...

点评

是像...$scene =XXX::Scene_XXX.new 這樣嗎?  发表于 2012-4-17 19:21
請問scene的加載語法?  发表于 2012-4-17 16:24

评分

参与人数 1星屑 +132 收起 理由
eve592370698 + 132 综合指引,值得推荐。

查看全部评分

好歹当年也当过大魔王过,orz
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-1 10:59

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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