楼主: RyanBern

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

[复制链接]
梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 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
回复

使用道具 举报

梦石
0
星屑
60
在线时间
705 小时
注册时间
2007-12-23
回帖
809
发表于 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
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 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
回复

使用道具 举报

…あたしは天

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

开拓者贵宾

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

在较新版本的 Ruby 中:

[pre lang="ruby"]
C = Class.new

class C < C.clone # 这里是打开 C 而不是覆盖常量 C,而 C.clone 不是原来 C 的父类 Object,因此会报错
end

# superclass mismatch for class C (TypeError)
[/pre]

所以,要用这种方式的话,应该是这样的代码
[pre lang="ruby"]
class C
  def c
    1
  end
end

class C < Object.send :remove_const, :C
  def c
    super + 1
  end
end

[/pre]

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

[pre lang="ruby"]class Game_BattlerBase
  # 默认脚本
end

class Game_Battler < Game_BattlerBase
  # 默认脚本
end

# 若这一行是
# class Game_BattlerBase < Object.send :remove_const, :Game_BattlerBase
# 也一样会导致问题
class Game_Battler < Object.send :remove_const, :Game_Battler
  # A 的插件脚本
end

class Game_Battler < Game_BattlerBase
  # B 的插件脚本
end

# superclass mismatch for class Game_Battler (TypeError)[/pre]

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

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

[pre lang="ruby"]
class C
  def c
    1
  end
end

class C
  original_c = instance_method :c
  define_method :c do
    original_c.bind(self).call + 1
  end
end[/pre]

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

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

[pre lang="ruby"]class C
  def c
    1
  end
end

module MyPatchToC
  def c
    super + 1
  end
end

C.prepend MyPatchToC[/pre]

[pre lang="ruby"]

# 在我自己的脚本里,我就直接把 id 猴补到 Fixnum 里面了。
# 为了在某些场合既能传物品(装备、角色等等)id作为参数,也能传入物品的实例作为参数
# 其实我挺希望能这样用 refine 的
module MyPatchToFixnum
  refine Fixnum do
    alias_method :id, :to_int
  end
end

class AnotherClass
  using MyPatchToFixnum

  def self.show(item_or_item_id)
    puts item_or_item_id.id
  end
end

# assume that $data_items exists
AnotherClass.show($data_items[1]) # 1
AnotherClass.show(1)              # 1

1.id # undefined method `id' for 1:Fixnum (NoMethodError)
[/pre]
以及,如果不是做 RM 插件的话,这种技术的实际应用真的很少……
回复

使用道具 举报

梦石
0
星屑
80
在线时间
216 小时
注册时间
2011-9-17
回帖
125
发表于 2016-5-26 23:48:58 | 显示全部楼层
求不算挖坟。
技巧5的事件和脚本结合——给地图事件做个计时器解释效果是我想实现的
于是我重新开一个工程,把脚本放到Main之上
再这样做事件,发现没有效果啊
1.png
2.png
3.png
回复

使用道具 举报

梦石
0
星屑
606
在线时间
797 小时
注册时间
2014-7-1
回帖
501

开拓者

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

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

 楼主| 发表于 2016-7-16 13:22:17 | 显示全部楼层
jiushiainilip19 发表于 2016-7-15 14:07
技巧3 能够做到一个图片原地旋转的效果吗?

当然可以,需要你定义一个rotate_effect,这个旋转效果是指定一个速度然后永远旋转下去,如果想要改成旋转一个固定角度则和前面的move_effect类似。
[pre lang="Ruby"]def rotate_effect(speed)
  @rotate_speed = speed
  if @rotate_speed == 0
    @rotate_effect = false
    return
  end
  @rotate_effect = true
end
def rotating?
  return @rotate_effect
end[/pre]
然后你需要自己定义update
[pre lang="Ruby"]def update
  if self.rotating?
    self.angle += @rotate_speed
  end
end[/pre]
代码未测试,可能有BUG,遇到笔误等问题请自行修改。

点评

3Q 3Q!  发表于 2016-7-17 07:28
回复

使用道具 举报

梦石
0
星屑
106
在线时间
470 小时
注册时间
2015-4-26
回帖
71
发表于 2016-8-1 11:46:52 | 显示全部楼层
关于技巧8:椭圆形状的blt
我还在学习脚本,对此有一些困难
能否发一个范例供学习
谢谢
回复

使用道具 举报

梦石
0
星屑
50
在线时间
51 小时
注册时间
2016-5-31
回帖
54
发表于 2017-8-25 15:06:42 | 显示全部楼层

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

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

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


第一步:复制第一段脚本到脚本编辑器的任何地方。
第二步:新建一个事件,在事件指令中选择【脚本】,然后里面命令写入
[pre lang="Ruby"]
set_item_max("CommonEvent", 1200)
[/pre]
即可修改公共事件的最大值为 1200。如果是别的数字请改动第二个参数。
第三步:启动游戏,并执行这个事件(执行的时候没有任何外在的效果,只要确认触发这个事件就行)
第四步:关闭游戏,关闭工程,重新载入工程即可看到效果。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部