楼主: david_ng223

[結帖]我開始學腳本啦~~求大神們指點~~

[复制链接]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-1 16:35:13 | 显示全部楼层
余烬之中 发表于 2014-2-1 15:27
点评累死了……

你的错误在这里

我的意思是你的表达式无法匹配 [pkdh 8]

/\[pkdh\s*(\d+(?:\.\d+)?)\]/ 没有任何问题,问号是必要的,$1引用的是整个数(可以是整数、可以是小数)

点评

虽然复制的是/\[pkdh\s*(\d+(?:\.\d+)?)\]/ 但我脑补成了/\[pkdh\s*(\d+)(?:\.\d+)?\]/ 这样的话$1匹配99而$2不匹配98  发表于 2014-2-1 16:43
不好意思,pokedex_height,pokedex_weight全部都是小數的 例如 7.5kg, 80.0kg, 0.5m, 13.0m 等等  发表于 2014-2-1 16:40
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-1 16:49:21 | 显示全部楼层
本帖最后由 taroxd 于 2014-2-1 17:00 编辑

To LZ

连贴这么多不好意思,但是点评实在不舒服,而且写不下

/\[pkdh\s*(\d+(?:\.\d+)?)\]/ 你写小数(比如13.0)当然也是没问题的,效果和写13一样。最后 $1.to_f 终究是转成浮点数。
这样的话备注 [pkdh 13] 和 [pkdh 13.0] 是相同的效果,用这样的正则表达式具有更好的兼容性。
?: 倒是可有可无的,但是写上可以禁止后位引用,防止数错括号以及提高性能。

至于原因,请你自己解读一下这个正则表达式,我相信你可以解读出来的。
不懂或者忘了,可以参考F1文档,是有正则表达式的字典的

重要:请努力学习基本的ruby语法。 论坛里找本教程吧,应该不少呢。a ? b : c 和 =~ 算是很基本的符号的说。

To 余烬之中

说实话我不喜欢把 \d 写成 . ,并且喜欢在不出错的时候尽可能具有兼容性。所以我自己写的时候通常是大小写不敏感,如果要转成浮点数的话是小数与整数皆可读取的。
而且我自己写的时候不喜欢用[]、比较喜欢用<>,这样就不用斜杠转义了,这里就按照LZ的符号用了
这个是代码风格问题,请不要在意

点评

我一般也是\d 只是浮点数那么长就干脆用.了 兼容性是我的疏忽(揉脸) i是必须加的 另外我一般也是用<> 原因是……HTML标签习惯  发表于 2014-2-1 17:03
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-1 17:16:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-1 17:21:15 | 显示全部楼层
david_ng223 发表于 2014-2-1 17:16
斜杠转义即是/\/的紅色符号??

是的話,那麼可以改成\么??

/\[pkdh\s*(\d+(?:\.\d+)?)\]/

[pre lang="ruby" line="1"]/<pkdh\s*(\d+(?:\.\d+)?)>/i[/pre]

/regexp/ 是表示两根斜杠中间是正则表达式

点评

我很少用%r 一般都是通过\/跳脱的  发表于 2014-2-1 17:24
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-1 18:15:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-1 19:24:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-1 20:22:33 | 显示全部楼层
本帖最后由 taroxd 于 2014-2-1 20:43 编辑
david_ng223 发表于 2014-2-1 19:24
@余烬之中 @taroxd
我剛吃完晚飯了,你們吃完沒XD


[建议]
36~38行可改为
[pre lang="ruby" line="1"]
def pokedex_type_pokemon?
  @note =~ /<pkdtpkm>/i # 三目运算符是多余的。
  # 如果一定要返回true或false,可改为 /<pkdtpkm>/i === @note 或 !!(@note =~ /<pkdtpkm>/i) 或 !(@note !~ /<pkdtpkm>/i)
end
[/pre]

[错误]
41行的正则表达式中没有后位引用,$1一定为nil

[建议]
注意 module Zero 的缩进。 RPG::Actor的缩进是正确的。

[建议]
注释方法可参考RGSS默认脚本,不建议用 #a #b ... 的方式。用上面定义常量的那种方式注释也可以。

[建议]
有弹出错误窗口的话请自己根据错误信息调试。
如果不跳错误窗口,但是达不到满意的效果的话,可以使用方法 p 或 msgbox 追踪,看看哪里没有得到预期的值

点评

我只是说普遍情况 很多新手都被这个玩晕……我学的时候根本没管他是什么意思 后来写了几个脚本自己就懂了  发表于 2014-2-2 09:28
#a #b是用來表示我想要的效果,以後會刪除的  发表于 2014-2-1 20:42
我自己也被@到了……  发表于 2014-2-1 20:25
他还没运行 检测不出来 话说你这一回复把我@到了……  发表于 2014-2-1 20:24
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-1 21:49:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

发表于 2014-2-2 09:22:02 | 显示全部楼层
本帖最后由 余烬之中 于 2014-2-2 09:23 编辑
david_ng223 发表于 2014-2-1 21:49
@余烬之中 @taroxd

接著應該就是初始化了,


好吧 新手杀手alias 我还是举例子吧 先是super
一个父类[pre lang="ruby" line="1"]class Base
   def meet
      say "Hello!"
   end
   def say *args
      print *args
   end
end[/pre]
一个子类[pre lang="ruby" line="1"]class Derive < Base
   def meet
      super
      say "How are you going?"
   end
end[/pre]
父类的实例和子类的实例[pre lang="ruby" line="1"]b = Base.new
d = Derive.new

b.meet #=> Hello!
d.meet #=> Hello!How are you going?[/pre]
大概你已经能理解super了 现在是alias 既然上面有了一个Base类 我们就用它举例
分别考虑两种情况
===============================================不使用alias的情况
[pre lang="ruby" line="1"]class Base
   def say *args
      print "AAAAAAA"
   end
end

Base.new.meet #=> "AAAAAAA"[/pre]===============================================使用alias的情况
[pre lang="ruby" line="1"]class Base
   alias old_say say
   def say
      old_say
      print "AAAAAAA"
   end
end

Base.new.meet #=> "Hello!AAAAAAA"[/pre]===============================================
总结如下
1.已知方法a 如果之后再定义def a .... end 那么新的内容会覆盖旧的内容
2.alias可以保存某方法(不仅是方法)在某时刻的状态(理解用),相当于拍个照片,或者类比成保存一个副本
3.alias的语法为 【alias 副本名 原名】
4.之后可以在任何地方调用此副本 副本不随源的变化而变化
5.这种手段一般用于给方法新增内容 新的say其实已经覆盖了旧的say 但是old_say还在 可以被调用
6.新增内容时,优先采用alias追加定义
7.注意!如果出现了alias重名,常常出现“Stack Level Too Deep”错误,例子:[pre lang="ruby" line="1"]# 小A与小B都在写脚本 对已有的脚本进行修改
#已有脚本
class Player < Role
  def talk *args
     say *args
  end
  def say *args
    puts *args
  end
end

#小A的脚本
class  Player
  alias old_talk talk
  def talk *args
    old_talk
    puts "小A"
  end
end

#小B的脚本
class Player
  alias old_talk talk
  def talk *args
     old_talk
     puts "小B"
  end
end

#运行
p = Player.new
p.talk "Hello!"
# Stack Level Too Deep[/pre]
但这样就没有错误[pre lang="ruby" line="1"]#小A的脚本
class  Player
  alias old_talk_of_A talk
  def talk *args
    old_talk_of_A  
    puts "小A"
  end
end

#小B的脚本
class Player
  alias old_talk_of_B talk
  def talk *args
     old_talk_of_B
     puts "小B"
  end
end

#运行
p = Player.new
p.talk "Hello!"
#=> "Hello!小A小B"[/pre]
常见的alias(别名)方式有几种要特别注意 常常与别人重复
·old_原名(say=>old_say)
·old_原名开头几个字母(initialize=>old_init)
推荐的别名方式
·当前脚本名略缩_方法(或方法略缩)
·当前脚本名略缩_方法(或方法略缩)_当前年月日
·自己英文名略缩_当前脚本名略缩_方法(或方法略缩)
·自己英文名略缩_当前脚本名略缩_方法(或方法略缩)_当前年月日
比如我常常这样
update=>mo_vtpb_upt
【另外提一点 alias一般有两种写法:
1.alias old_a a
2.alias :old_a :a
在这里这没什么区别 喜好问题 以后遇到alias_method时只能用后者】

点评

同没管什么意思,自然就懂了  发表于 2014-2-2 09:29
我一点都不觉得alias是新手杀手啊,我比super还要早学会呢 而且我很喜欢alias,还编了几个alias的方法,你知道的  发表于 2014-2-2 09:26
又把自己@到了  发表于 2014-2-2 09:24
被@了……  发表于 2014-2-2 09:24
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-2 09:31:39 | 显示全部楼层
顺便打个广告

http://rpg.blue/thread-347871-1-1.html

要在原方法后追加可以用这个
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部