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

Project1

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

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

11
发表于 2015-7-18 13:32:23 | 只看该作者
RyanBern 发表于 2015-3-18 22:22
更新技巧6、7,自顶。
技巧6是二周目的制作思路,虽然少用但是值得借鉴一下。

多周目也同技巧6吧
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
705 小时
注册时间
2007-12-23
帖子
874
12
发表于 2015-9-15 08:15:13 | 只看该作者
关于技巧10:记录事件位置

我先前没有忘了这个帖子里有这个内容,搜了半天也没有搜到,只好自己写了一个。现在回来看看这个部分,对比了以下各种实现细节,发现这样实现好像还是有点问题的,就是如果一个事件【固定朝向】了之后turn_left、turn_right等方法会失效,导致事件的朝向不能被记录下来。

点评

看看我的新帖吧http://rm.66rpg.com/thread-383466-1-1.html  发表于 2015-9-15 09:12
没想到也会出这这样的一个小BUG。  发表于 2015-9-15 08:30
我以前曾经发过一个比这里的这个简洁一些的脚本,当时那个脚本直接clone了$game_map对象,但是这个脚本我为了省一些资源所以就仅保存了位置  发表于 2015-9-15 08:28
这个问题当时确实没有考虑到,不过刚才稍微想了一下没想到什么比较好的解决办法。  发表于 2015-9-15 08:24
买了正版RMMV的同学进来看一下,谢谢~
https://rpg.blue/thread-393237-1-1.html
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21815
在线时间
9435 小时
注册时间
2012-6-19
帖子
7120

开拓者短篇九导演组冠军

13
发表于 2015-9-15 14:02:26 | 只看该作者
技巧11 另类alias 在RMVA的Ruby1.9中能用吗?

点评

不能 superclass mismatch  发表于 2015-9-15 16:08
没有进行测试,仅仅在1.8里面试过。  发表于 2015-9-15 14:11
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

14
发表于 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 插件的话,这种技术的实际应用真的很少……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
80
在线时间
216 小时
注册时间
2011-9-17
帖子
151
15
发表于 2016-5-26 23:48:58 | 只看该作者
求不算挖坟。
技巧5的事件和脚本结合——给地图事件做个计时器解释效果是我想实现的
于是我重新开一个工程,把脚本放到Main之上
再这样做事件,发现没有效果啊

1.png (78.13 KB, 下载次数: 25)

1.png

2.png (82.42 KB, 下载次数: 28)

2.png

3.png (78.6 KB, 下载次数: 25)

3.png
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
596
在线时间
797 小时
注册时间
2014-7-1
帖子
578

开拓者

16
发表于 2016-7-15 14:07:09 | 只看该作者
技巧3 能够做到一个图片原地旋转的效果吗?{:2_249:}
学习使我疲劳,打工使我疲惫,恋爱使我伤身,吸烟伤我肺腑,饮酒损我形象,旅游使我破费,月底不见铜板,只有在论坛里面看看各种大佬才能使我进去
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

17
 楼主| 发表于 2016-7-16 13:22:17 | 只看该作者
jiushiainilip19 发表于 2016-7-15 14:07
技巧3 能够做到一个图片原地旋转的效果吗?

当然可以,需要你定义一个rotate_effect,这个旋转效果是指定一个速度然后永远旋转下去,如果想要改成旋转一个固定角度则和前面的move_effect类似。
RUBY 代码复制
  1. def rotate_effect(speed)
  2.   @rotate_speed = speed
  3.   if @rotate_speed == 0
  4.     @rotate_effect = false
  5.     return
  6.   end
  7.   @rotate_effect = true
  8. end
  9. def rotating?
  10.   return @rotate_effect
  11. end

然后你需要自己定义update
RUBY 代码复制
  1. def update
  2.   if self.rotating?
  3.     self.angle += @rotate_speed
  4.   end
  5. end

代码未测试,可能有BUG,遇到笔误等问题请自行修改。

点评

3Q 3Q!  发表于 2016-7-17 07:28
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
106
在线时间
470 小时
注册时间
2015-4-26
帖子
92
18
发表于 2016-8-1 11:46:52 | 只看该作者
关于技巧8:椭圆形状的blt
我还在学习脚本,对此有一些困难
能否发一个范例供学习
谢谢
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
51 小时
注册时间
2016-5-31
帖子
59
19
发表于 2017-8-25 15:06:42 | 只看该作者

关于技巧12:数据突破
是复制在什么地方  是复制在自己新建的地方吗? 不知道怎么用 我是小白 求大神详细
回复 支持 0 反对 1

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

20
 楼主| 发表于 2017-8-25 23:47:58 | 只看该作者
本帖最后由 RyanBern 于 2017-8-25 23:49 编辑
lcr 发表于 2017-8-25 15:06
关于技巧12:数据突破
是复制在什么地方  是复制在自己新建的地方吗? 不知道怎么用 我是小白 求大神详细 ...


第一步:复制第一段脚本到脚本编辑器的任何地方。
第二步:新建一个事件,在事件指令中选择【脚本】,然后里面命令写入
RUBY 代码复制
  1. set_item_max("CommonEvent", 1200)

即可修改公共事件的最大值为 1200。如果是别的数字请改动第二个参数。
第三步:启动游戏,并执行这个事件(执行的时候没有任何外在的效果,只要确认触发这个事件就行)
第四步:关闭游戏,关闭工程,重新载入工程即可看到效果。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-22 09:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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