Project1

标题: 请教对话框里一段脚本的意思 [打印本页]

作者: naibo456    时间: 2011-8-14 22:05
标题: 请教对话框里一段脚本的意思
本帖最后由 「旅」 于 2011-8-16 09:00 编辑

请教脚本:   
begin
        last_text = @now_text.clone
        @now_text.gsub!(/\\[Vv]\[([IiWwAaSs]?)([0-9]+)\]/) { convart_value($1, $2.to_i) }
      end until @now_text == last_text
      @now_text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
      $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
    end

其中  @now_text.gsub!(/\\[Vv]\[([IiWwAaSs]?)([0-9]+)\]/) { convart_value($1, $2.to_i) }什么意思?
望大虾们相助~dsu_plus_rewardpost_czw
作者: orzfly    时间: 2011-8-14 22:39
那句东西是进行正则表达式识别……
碰到左边这种就替换成右边的结果
  1. V[I0]  => convart_value("I", 0)
  2. V[W3]  => convart_value("W", 3)
  3. V[A1]  => convart_value("A", 1)
  4. V[S33]  => convart_value("S", 33)
  5. V[32]  =>  convart_value("", 32)
复制代码
楼主请去看看正则表达式的介绍~
$1代表正则表达式中第一对()匹配的内容
$2以此类推


orzfly于2011-8-14 22:47补充以下内容:
  1. @now_text.gsub!(/\\[Nn]\[([0-9]+)\]/) do $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
复制代码
这里 do something 就相当于 {something}。
/\\[Nn]\[([0-9]+)\]/是正则表达式,开头和结尾的/就像字符串的引号一样。

\\是转义,匹配一个\
[Nn]匹配大小写任意的N
\[匹配一个[
(
[0-9]匹配一个数字
+重复上一行任意次,也就是说可以匹配很多位数字
)这对括号是第一个匹配组,等下再说
\]匹配一个]

当@now_text在字符串中成功匹配了之后,会将整个匹配的内容传给$0,第一个匹配组的内容传给$1,以此类推,然后计算后面的do something或{something}中的something,将匹配的内容替换成计算结果。

~其实就是个替换,不过每次替换的东西都不一样。
  1. p "I am BoY. YoU are a Girl.".gsub!(/[A-Z]([a-z])[A-Z]/) do $2+$1+$3
  2. # => "I am oBY. oYU are a Girl."
复制代码

作者: naibo456    时间: 2011-8-15 08:44
orzfly 发表于 2011-8-14 22:39
那句东西是进行正则表达式识别……
碰到左边这种就替换成右边的结果楼主请去看看正则表达式的介绍~
$1代表 ...

还是不太明白 ([IiWwAaSs]?)和([0-9]+)还有{ convart_value($1, $2.to_i) }
您能给单独解释下么?
作者: orzfly    时间: 2011-8-15 13:24
请去看正则表达式的介绍。http://deerchao.net/tutorials/regex/regex.htm
请看了之后再继续看。

你把def convart_value(这个东西发出来。

convart_value是一个函数,你那脚本里面定义的。

gsub就是根据正则表达式替换。
  1. "aAbBsdfsdfSFDG".gsub!(/([A-Z])[a-z]([a-z])/) { blabla($1, $2) }
复制代码
这句的执行过程,就是:
1. 扫描那个字符,找到第一个匹配Bsd,这时候$1="B", $2="d"。
2. 然后计算 blabla($1, $2),你这里就是convart_value,他的计算结果我不知道是什么,除非你发出来。
3. 用计算结果替换原来字符串里匹配的Bsd。假设计算结果是OHDEAR,那么这是字符串就变成"aAbOHDEARfsdfSFDG"了。
4. 然后循环1,直到再也找不到了……
作者: naibo456    时间: 2011-8-15 22:06
orzfly 发表于 2011-8-15 13:24
请去看正则表达式的介绍。http://deerchao.net/tutorials/regex/regex.htm
请看了之后再继续看。

def convart_value(option, index)
    option == nil ? option = "" : nil
    option.downcase!
    case option
      when "i"
        unless $data_items[index].name == nil
          r = sprintf("\030[%s]%s", $data_items[index].icon_name, $data_items[index].name)
        end
      when "w"
        unless $data_weapons[index].name == nil
          r = sprintf("\030[%s]%s", $data_weapons[index].icon_name, $data_weapons[index].name)
        end
      when "a"
        unless $data_armors[index].name == nil
          r = sprintf("\030[%s]%s", $data_armors[index].icon_name, $data_armors[index].name)
        end
      when "s"
        unless $data_skills[index].name == nil
          r = sprintf("\030[%s]%s", $data_skills[index].icon_name, $data_skills[index].name)
        end
      else
      r = $game_variables[index]
    end
    r == nil ? r = "" : nil
    return r
  end

你给看看什么意思
作者: darkscout3000    时间: 2011-8-16 02:43
orzfly 已经写的很清楚了⋯⋯
楼主对脚本的了解有多少?
  1. @now_text.gsub!(/\\[Vv]\[([IiWwAaSs]?)([0-9]+)\]/) { convart_value($1, $2.to_i) }
复制代码
我想楼主不明白的代码主要式那段正则表达式吧?所以楼主还是应该去读读正则表达式先⋯⋯

嘛,这段代码的含义其实是读取@now_text这个变量,寻找类似于
V[W0], V[I1] ... 这种样子以V开头,用方框括号[]括起来的文字⋯⋯

然后根据括号里头第一个字母判断,如果是w就是武器(weapon),i就是道具(item),a就是装备(armor),s就是技能(skill)
再读取后面的数字,这个数字就是ID,比如第100号武器就是V[W100],29号道具就是V[I29]⋯⋯
最后读取取得的相对应的那个东西的名称和它对应的图标名称⋯⋯
组合成这样"\030[图标名字]东西的名字"

我个人认为正则表达式是需要自己体会的,建议楼主写点简单的代码实验下它的功能
作者: naibo456    时间: 2011-8-16 11:21
正则表达式差不多明白了,谢谢了!




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