Project1

标题: 請問如何用全局變量給腳本設定一個開關 [打印本页]

作者: sai90306    时间: 2012-4-16 18:09
标题: 請問如何用全局變量給腳本設定一個開關
本帖最后由 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
复制代码
也不知道思路對不對...或是完全錯誤 dsu_plus_rewardpost_czw
作者: sai90306    时间: 2012-4-16 21:52
本帖最后由 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還是無法變回跟隨呢?

作者: orzfly    时间: 2012-4-16 22:34
本帖最后由 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
复制代码

作者: 晴兰    时间: 2012-4-16 23:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: 吉井明久    时间: 2012-4-16 23:18
本帖最后由 吉井明久 于 2012-4-16 23:24 编辑

@eve592370698

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

⊙ω⊙
作者: 晴兰    时间: 2012-4-16 23:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: fux2    时间: 2012-4-17 00:42
通常这种脚本加开关得在刷新的地方加。
作者: eve592370698    时间: 2012-4-17 07:09
本帖最后由 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
复制代码
’’
作者: orzfly    时间: 2012-4-17 08:26
eve592370698 发表于 2012-4-17 07:09
不好意思,出现这个错误是我缺乏相关理论知识,这怨我。
在自由Ruby语言里头,这么做绝对是没问题的,但 ...

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

接下来的话顺便给楼主。

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

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

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

正确的思路是fux2的
作者: zhangbanxian    时间: 2012-4-17 08:39
你这样写语法上也没错,而且没有必要放到class里,直接放顶层就行了...不过这个语句只是编译阶段执行而已,主要用作调试之类的,你要游戏中随时控制的话必须读懂脚本才行,有些脚本一旦定义完毕就会生效,你要找到恰当的位置给它加上个开关...真要方便控制脚本的话可以把各个脚本放到不同module里,然后重定义scene在每次新建时按需加载module,不过这也得懂脚本- -b...
作者: yangff    时间: 2012-4-17 14:37
膜拜神脚本特么这个判个开关有这么累么= =·
class Foo
  def update
    if $yangff.is_a?(SB)
      开启脚本内容
    end
  end
end
。。。有多累?
作者: 凌童鞋    时间: 2012-4-17 15:07
标题: RE: 請問如何用全局變量給腳本設定一個開關
本帖最后由 凌童鞋 于 2012-4-17 15:19 编辑
yangff 发表于 2012-4-17 14:37
膜拜神脚本特么这个判个开关有这么累么= =·
class Foo
  def update


同意,只要屏蔽updata就好了..不updata脚本就近乎没作用...
不过如果是挂在其它功能上面那种呢...
大概这样可以吧...
class Ling
def hello
   p 'hello'
  end
end if $game_switches[1]
然后记得eval来加载,否则无效
s = load_data('Data/Script.rxdata')

然后想办法找到这页脚本Zlib解压..
手机回这种帖真累挺!这是思路,有错误别吐槽..
据说Main下的东西不加载,反正我的思路就是开始时不加载然后手工eval就对了..
作者: sai90306    时间: 2012-4-17 17:15
本帖最后由 sai90306 于 2012-4-17 17:18 编辑
eve592370698 发表于 2012-4-17 07:09
不好意思,出现这个错误是我缺乏相关理论知识,这怨我。
在自由Ruby语言里头,这么做绝对是没问题的,但 ...


請問為什麼我在
腳本中插入
  1.     class Eve592370698
  2.       if $abc == true
  3.         p "谁说我跳不出来?"
  4.         def hello
  5.           p "嘿嘿"
  6.         end
  7.       else
  8.         p "就是错误的"
  9.       end
  10.     end
复制代码
在事件中插入腳本
  1. $abc = false
  2. Eve592370698.new.hello
复制代码
對話後
會出現"unidentified method 'hello' for Eve592370698" ?

作者: 吉井明久    时间: 2012-4-17 20:05
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
复制代码







欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1