查看: 3000|回复: 4

[已经解决] gsub!怎么匹配负数

[复制链接]
梦石
0
星屑
2270
在线时间
125 小时
注册时间
2015-8-14
回帖
17
发表于 2021-2-7 13:23:31 | 显示全部楼层 |阅读模式

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

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

×
我想用代码做一个改变画面色调的脚本
大概就是通过在地图名称中加入 <r:***>  <g:***> <b:***>
在Game_Map刷新的时候能直接应用到地图中。而不需要通过事件改变画面色调。
这个样子大概已经可以实现了。。
但是map_name.gsub!(/<r:([0-9]+)>/) { "" } 居然不能够匹配负数!!!!!
搞成两行又特别不舒服,所以要怎么做呢??

[pre lang="ruby"]def map_name
    return if @mapinfo[@map_id].nil?
    name = @mapinfo[@map_id].name
    name.gsub!(/<r:([0-9]+)>/) { "" }
    name.gsub!(/<g:([0-9]+)>/) { "" }
    name.gsub!(/<b:([0-9]+)>/) { "" }
    name.gsub!(/<gray:([0-9]+)>/) { "" }
    return name
  end
  alias setup_rgss1 setup
  def setup(map_id)
    @mapinfo = load_data("Data/MapInfos.rxdata") if @mapinfo.nil?#兼容旧存档防错
    if @mapinfo[map_id]
      map_name = @mapinfo[map_id].name
      map_name.gsub!(/<r:(-[0-9]+)>/) { "" }
      red = $1.nil? ? 0 : $1.to_i
      map_name.gsub!(/<r:([0-9]+)>/) { "" }
      red = $1.nil? ? 0 : $1.to_i if red == 0
      map_name.gsub!(/<g:(-[0-9]+)>/) { "" }
      green = $1.nil? ? 0 : $1.to_i
      map_name.gsub!(/<g:([0-9]+)>/) { "" }
      green = $1.nil? ? 0 : $1.to_i if green == 0
      map_name.gsub!(/<b:(-[0-9]+)>/) { "" }
      blue = $1.nil? ? 0 : $1.to_i
      map_name.gsub!(/<b:([0-9]+)>/) { "" }
      blue = $1.nil? ? 0 : $1.to_i if blue == 0
      map_name.gsub!(/<gray:(-[0-9]+)>/) { "" }
      gray = $1.nil? ? 0 : $1.to_i
      map_name.gsub!(/<gray:([0-9]+)>/) { "" }
      gray = $1.nil? ? 0 : $1.to_i if gray == 0
      if red.abs + green.abs + blue.abs + gray.abs != 0
        tone = Tone.new(red,green,blue,gray)
        $game_screen.start_tone_change(tone, 0)
      end
    end
    setup_rgss1(map_id)
  end[/pre]
梦石
0
星屑
8003
在线时间
1184 小时
注册时间
2007-7-29
回帖
2014
发表于 2021-2-7 14:02:41 | 显示全部楼层
  1. (-*[0-9]+)
复制代码

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
Hello``Bubble + 1 我很赞同

查看全部评分

回复 1 0

使用道具 举报

梦石
2
星屑
6767
在线时间
501 小时
注册时间
2018-3-23
回帖
487

R考场第七期银奖

发表于 2021-2-7 14:13:26 | 显示全部楼层
仅供参考,来源:https://c.runoob.com/front-end/854
20210207.png

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
Hello``Bubble + 1 我很赞同

查看全部评分

祝好。
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45694
在线时间
7948 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2021-2-7 15:40:09 | 显示全部楼层
  1. "-50"[/(\-?\d+)/]
复制代码

一般情况下也不需要太复杂

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
Hello``Bubble + 1 我很赞同

查看全部评分

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

使用道具 举报

梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2021-2-7 21:05:06 | 显示全部楼层
本帖最后由 KB.Driver 于 2021-2-7 21:07 编辑

正则的规则其实很简单……掌握基本规则就能搞定一些简单的判断。
不过正式应用场合因为需要测试的缘故,直接找现成稳定的代码也是一种选择。

从已有的部分来看,楼主已经有了正则的基础,接下来就是经验的问题了。

工程实践方面,不推荐对原数据做破坏性修改。
也就是说,不要修改@name变量,但是你可以对name方法复制一份并进行修改,例如不读取井号以后的部分
[pre lang="ruby"]
alias ordinary_name name
def name
  @processed_name ||= ((n = ordinary_name.index("#")) ? ordinary_name[0, n] : ordinary_name)
end
[/pre]

然后,既然一次要读3个数,可以压缩数据,提高数据浓度。
例如使用<tone:xx,xx,xx,xx>,当然最后一个数可以省略

这个可以这样读
[pre lang="ruby"]
map_name = @mapinfo[map_id].ordinary_name
if map_name =~ /<tone:(-?\d+),(-?\d+),(-?\d+),?(-?\d+)?>/i
  r, g, b, a = Regexp.last_match.captures # a指代ash,勉强也算“灰”
  a ||= 0 # 灰度默认为0
  # 色调操作
end
[/pre]

测试
QQ截图20210207205655.jpg

评分

参与人数 3星屑 +50 赞 +2 收起 理由
MCCF + 1 日历NB
RyanBern + 50 认可答案
Hello``Bubble + 1 精品文章

查看全部评分

用头画头像,用脚写脚本
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部