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

Project1

 找回密码
 注册会员
搜索
楼主: RyanBern
打印 上一主题 下一主题

[原创发布] 【教程】【不定期更新】实用型XP脚本编写小技巧#13

[复制链接]

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

1
发表于 2015-1-17 13:10:02 | 显示全部楼层
本帖最后由 taroxd 于 2015-1-17 15:03 编辑

<del>以下内容均为卖萌扯淡</del>

没记错的话 XP 修改内部脚本的话是需要 F12 guard 的吧

所以不管怎么说,我现在连 alias 关键字都完全不用了

RUBY 代码复制
  1. class Module
  2.  
  3.   new_name = :alias_method_without_F12_guard
  4.   old_name = :alias_method
  5.  
  6.   unless method_defined? new_name
  7.     alias_method new_name, old_name
  8.   end
  9.  
  10.   def alias_method(new_name, old_name)
  11.     unless method_defined? new_name
  12.       alias_method_without_F12_guard new_name, old_name
  13.     end
  14.   end
  15. end


---

看到 merge_party 好亲切~ 咳咳

https://rpg.blue/thread-367044-1-1.html

你的代码里也是考虑到了存档里不存在的情况(@reserved_parties ||= {}),不过这个东西实在是不需要每次都写啊- -
甚至根本不需要重定义 initialize。可以直接定义一个(可以私有)的方法 reserved_parties。

class Game_System
  private
  def reserved_parties
    @reserved_parties ||= {}
  end
end

这样之后每次访问都调用 reserved_parties 方法就可以了

点评

如果这样的话initialize确实是多余的。不过||=在一个方法里面执行一次就够了,定义成私有方法的话每次引用都要执行一次(虽然效率影响不大)  发表于 2015-1-17 15:08
其实我是通过AC的回帖找到你这个帖子的,当时想都没想果断用这个当方法名  发表于 2015-1-17 14:25
后面的代码也没必要判断。Game_Party 也不是内部类啦  发表于 2015-1-17 14:18
method_defined? 是接受*符号*参数的方法,不是 alias 那样的关键字啦……(因为是方法所以才更灵活)  发表于 2015-1-17 14:16
第一个已经修改,不过后面的代码为了省事就不再判断了,留给写脚本的人自己控制好了  发表于 2015-1-17 14:14

评分

参与人数 1星屑 +60 收起 理由
RyanBern + 60 来吃糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2015-1-18 19:50:04 | 显示全部楼层
本帖最后由 taroxd 于 2015-1-18 19:59 编辑

关于窗口精灵的运动,@余烬之中 写过一个更加通用的:
https://github.com/ShadowMomo/Sm ... ter/Smomo%20Core.rb 中的 transition 方法

我也写过一个不那么通用的(没有上面那个通用,需要手工 update):
https://rpg.blue/thread-365971-1-1.html 中的 Taroxd::Transition 类。

总之,这个变化的模式不应该局限于 X 坐标和 Y 坐标。

---
另外,我记得坐标是不需要变成整数的。就算赋值为整数似乎也会在内部转成浮点数的。

点评

实践是jQuery的easing和其他类似的,既然你提到了推广到通用所以我就更推广一下  发表于 2015-1-19 17:52
嗯,有想过,但是毕竟没怎么用到,所以没有付诸实践  发表于 2015-1-19 17:17
更通用的是移动的tween方式写成公式,和update分离  发表于 2015-1-19 01:10
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

3
发表于 2015-2-8 21:45:13 | 显示全部楼层
本帖最后由 taroxd 于 2015-2-9 07:46 编辑

第四个,其实 VA 的 skill_learn? 并没有考虑附加的技能。
这里有我稍稍做的改动(让怪物也有技能):http://taroxd.github.io/rgss/Tar ... AE%BE%E7%BD%AE.html

第五个,我会更倾向于这么做(删去了并行事件,效率更高,事件页更简洁美观):
RUBY 代码复制
  1. # 事件脚本的调用方式:this_event.set_timer(3600, 'B')
  2. # this_event 容易实现,因此不再赘述
  3. # 其实我本来想用这种更优雅的方式:
  4. #     this_event.set_timer(3600) do
  5. #       self_switch.b = true
  6. #     end
  7. # 但考虑到 block 不便存档,于是还是算了。
  8.  
  9. class Game_Event
  10.  
  11.   # *args: 帧数, 独立开关对应的字母
  12.   def set_timer(*args)
  13.     self_switch['timer'] = args # self_switch 对象很容易实现,见 [url]http://taroxd.github.io/rgss/%E4%BA%8B%E4%BB%B6%E8%84%9A%E6%9C%AC%E6%89%A9%E5%B1%95.html[/url]
  14.   end
  15.  
  16.   alias_method :timer_update, :update
  17.   def update
  18.     timer_update
  19.     args = self_switch['timer']
  20.     return unless args
  21.     if args[0] > 0
  22.       args[0] -= 1
  23.     else
  24.       self_switch[args[1]] = true
  25.       self_switch['timer'] = nil
  26.     end
  27.   end
  28. end

点评

即使 Game_SelfSwitches 没有自带刷新,这个刷新也可以包装在 SelfSwitch 对象里面。总之这种细节不是这个脚本的事情  发表于 2015-2-9 09:25
VA 里的 Game_SelfSwitches#[] 自带刷新  发表于 2015-2-9 09:23
去掉并行事件是个关键的想法,放在脚本里面刷新不错。貌似XP还要在独立开关打开后加一句$game_map.need_refresh = true  发表于 2015-2-9 09:09

评分

参与人数 1星屑 +60 收起 理由
RyanBern + 60 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

4
发表于 2015-2-18 11:44:46 | 显示全部楼层
技巧6里面,自己测试游戏的时候保存一下游戏就没有了吧……还不如保存在另一个文件里呢。

点评

不会没有啊,而且实际测试的时候,二周目信息已经转成开关或者变量了。测试二周目可以调开关啊。  发表于 2015-2-18 11:50
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

5
发表于 2015-9-15 16:09:10 | 显示全部楼层
本帖最后由 taroxd 于 2015-9-15 16:29 编辑

在较新版本的 Ruby 中:

RUBY 代码复制
  1. C = Class.new
  2.  
  3. class C < C.clone # 这里是打开 C 而不是覆盖常量 C,而 C.clone 不是原来 C 的父类 Object,因此会报错
  4. end
  5.  
  6. # superclass mismatch for class C (TypeError)


所以,要用这种方式的话,应该是这样的代码
RUBY 代码复制
  1. class C
  2.   def c
  3.     1
  4.   end
  5. end
  6.  
  7. class C < Object.send :remove_const, :C
  8.   def c
  9.     super + 1
  10.   end
  11. end


然而这种方式不仅会让继承链变得很难看,而且很容易导致问题。

RUBY 代码复制
  1. class Game_BattlerBase
  2.   # 默认脚本
  3. end
  4.  
  5. class Game_Battler < Game_BattlerBase
  6.   # 默认脚本
  7. end
  8.  
  9. # 若这一行是
  10. # class Game_BattlerBase < Object.send :remove_const, :Game_BattlerBase
  11. # 也一样会导致问题
  12. class Game_Battler < Object.send :remove_const, :Game_Battler
  13.   # A 的插件脚本
  14. end
  15.  
  16. class Game_Battler < Game_BattlerBase
  17.   # B 的插件脚本
  18. end
  19.  
  20. # superclass mismatch for class Game_Battler (TypeError)


很明显,这个脚本冲突就是 A 的锅

不想发生命名冲突的话,应该是这样的方式比较好

RUBY 代码复制
  1. class C
  2.   def c
  3.     1
  4.   end
  5. end
  6.  
  7. class C
  8.   original_c = instance_method :c
  9.   define_method :c do
  10.     original_c.bind(self).call + 1
  11.   end
  12. end


接着推销一下这个:http://taroxd.github.io/rgss/Tar ... AE%BE%E7%BD%AE.html

当然,还是更高版本 Ruby 中的 prepend 和 refine 最舒服。

RUBY 代码复制
  1. class C
  2.   def c
  3.     1
  4.   end
  5. end
  6.  
  7. module MyPatchToC
  8.   def c
  9.     super + 1
  10.   end
  11. end
  12.  
  13. C.prepend MyPatchToC


RUBY 代码复制
  1. # 在我自己的脚本里,我就直接把 id 猴补到 Fixnum 里面了。
  2. # 为了在某些场合既能传物品(装备、角色等等)id作为参数,也能传入物品的实例作为参数
  3. # 其实我挺希望能这样用 refine 的
  4. module MyPatchToFixnum
  5.   refine Fixnum do
  6.     alias_method :id, :to_int
  7.   end
  8. end
  9.  
  10. class AnotherClass
  11.   using MyPatchToFixnum
  12.  
  13.   def self.show(item_or_item_id)
  14.     puts item_or_item_id.id
  15.   end
  16. end
  17.  
  18. # assume that $data_items exists
  19. AnotherClass.show($data_items[1]) # 1
  20. AnotherClass.show(1)              # 1
  21.  
  22. 1.id # undefined method `id' for 1:Fixnum (NoMethodError)

以及,如果不是做 RM 插件的话,这种技术的实际应用真的很少……
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-5 13:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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