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

Project1

 找回密码
 注册会员
搜索
查看: 2222|回复: 4
打印 上一主题 下一主题

[RMXP发布] 数组方法新增 & 战斗胜利时的窗口美化

[复制链接]

Lv1.梦旅人

矿工

梦石
0
星屑
134
在线时间
898 小时
注册时间
2012-10-5
帖子
1535
跳转到指定楼层
1
发表于 2013-12-20 23:11:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 876加几 于 2013-12-20 23:51 编辑

我为了将[7, 7, 7, 7, 6]这类的数组消灭掉全部相同的,费了我很大的功夫。
于是,我好不容易才写好了Array方法新增,从此消灭重复单元不再费劲了。
脚本:
RUBY 代码复制
  1. =begin
  2. ===============================================================================
  3.   ■ 使用方法:
  4. -------------------------------------------------------------------------------
  5.   ● number 则返回某个单元名称重复的数量。
  6.     例:[7, 7, 7, 7, 6, 6, 5].number(7)      => 4
  7.   ● aftftn 也是返回重复的数量,但与 number 有所不同。
  8.     例:[7, 7, 7, 7, 6, 6, 5].aftftn(4)      => 2
  9.     也就是说就是数组第几个单元的名称重复的数量。
  10.   ● delete_same 则删除单元里指定名称重复的部分,具有破坏性。
  11.     例:a = [7, 7, 7, 7, 6, 6, 5]
  12.         a.delete_same(7)
  13.         p a                                  => [7, 6, 6, 5]
  14.   ● same? 则返回是否是重复的单元。
  15.     例:a = [7, 7, 7, 7, 6, 6, 5]
  16.         p a.same?(4)                         => false
  17.         p a.same?(3)                         => true
  18.   ● das 和 das! 都是删除数组中所有重复的单元,但是 das 只会返回删除后的数组,das!
  19.      具有破坏性。
  20.     例:a = [7, 7, 7, 7, 6, 6, 5]
  21.         p a.das                              => [7, 6, 5]
  22.         p a                                  => [7, 7, 7, 7, 6, 6, 5]   # 没有变化
  23.         a.das!
  24.         p a                                  => [7, 6, 5]
  25.         # 之后没法再消了,总是返回原来的数组。
  26.   ● aftft 和 index 都是寻找第一个出现的单元,但有所不同。
  27.     例:a = [7, 7, 7, 7, 6, 6, 5]
  28.         p a.aftft(2)                         => 0
  29.     等同于
  30.         p a.index(a[2])                      => 0
  31.   ● dasn 和 dasn! 都是先删除重复的单元再计算出重复单元的数量,但是 dasn 只会返
  32.      回改变后的数组,dasn! 具有破坏性!
  33.     例:a = [7, 7, 7, 7, 6, 6, 5]
  34.         p a.dasn                             => [4, 2, 1]
  35.         p a                                  => [7, 7, 7, 7, 6, 6, 5]   # 没有变化
  36.         a.dasn!
  37.         p a                                  => [4, 2, 1]
  38.         a.dasn!
  39.         p a                                  => [1, 1, 1]
  40.         a.dasn!
  41.         p a                                  => [3]
  42.         a.dasn!
  43.         p a                                  => [1]
  44.         # 之后永远就会出现 [1] 了。
  45.   ● size 可以自行更改了,请看例子:
  46.     例:a = [7, 7, 7, 7, 6, 6, 5]
  47.         p a.size                             => 7
  48.         a.size = 4
  49.         p a                                  => [7, 7, 7, 7]
  50.         p a.size                             => 4
  51.         a.size **= 2
  52.         p a                                  => [7, 7, 7, 7, nil, nil, nil, nil,
  53.                                                  nil, nil, nil, nil, nil, nil,
  54.                                                  nil, nil]
  55.         # size 可以做任何运算。
  56.   ● fill 就是规定长度往后面 push 相应的字串,具有破坏性。
  57.     例:a = [7, 7, 7, 7, 6, 6, 5]
  58.         a.fill(3)
  59.         p a                                  => [7, 7, 7, 7, 6, 6, 5, nil, nil,
  60.                                                  nil]
  61.         a.fill(2, "我们")                    => [7, 7, 7, 7, 6, 6, 5, nil, nil,
  62.                                                  nil, "我们", "我们"]
  63. ===============================================================================
  64. =end
  65. class Array
  66.   def number(nth_name)
  67.     if self.index(nth_name) == nil
  68.       return 0
  69.     end
  70.     num = 1
  71.     for i in 0...self.size
  72.       if self[i] == nth_name and self.index(nth_name) != i
  73.         num += 1
  74.       end
  75.     end
  76.     return num
  77.   end
  78.   def aftftn(index)
  79.     num = 1
  80.     aftft = 0
  81.     for i in 0...self.size
  82.       if self[i] == self[index]
  83.         aftft = i
  84.         break
  85.       end
  86.     end
  87.     for j in 0...self.size
  88.       if self[j] == self[aftft] and aftft != j
  89.         num += 1
  90.       end
  91.     end
  92.     return num
  93.   end
  94.   def delete_same(name)
  95.     if self.number(name) == 0
  96.       return self
  97.     end
  98.     for i in 1..self.number(name)
  99.       for d in 0...self.size
  100.         if self[d] == name and self.index(name) != d
  101.           self.delete_at(d)
  102.           break
  103.         end
  104.       end
  105.     end
  106.     return self
  107.   end
  108.   def same?(index)
  109.     return (self.aftft(index) != index)
  110.   end
  111.   def das # (delete_all_same)
  112.     ary = self.dup
  113.     for j in 0...self.size
  114.       ary.delete_same(self[j])
  115.     end
  116.     return ary
  117.   end
  118.   def das!
  119.     ary = self.dup
  120.     for j in 0...ary.size
  121.       self.delete_same(ary[j])
  122.     end
  123.     return self
  124.   end
  125.   def aftft(index)
  126.     num = nil
  127.     for j in 0...self.size
  128.       if self[index] == self[j]
  129.         num = j
  130.         break
  131.       end
  132.     end
  133.     return num
  134.   end
  135.   def dasn # (delete_all_same_number)
  136.     pushing = []
  137.     ary = self.dup
  138.     a = self.das
  139.     for i in 0...a.size
  140.       pushing[i] = ary.number(a[i])
  141.     end
  142.     return pushing
  143.   end
  144.   def dasn!
  145.     ary = self.dup
  146.     a = self.das
  147.     self.clear
  148.     for i in 0...a.size
  149.       self[i] = ary.number(a[i])
  150.     end
  151.     return self
  152.   end
  153.   def size=(size)
  154.     if self.size == size
  155.       return
  156.     end
  157.     if self.size > size
  158.       s = self.size
  159.       for i in 0..self.size-size
  160.         self.delete_at(s-i)
  161.       end
  162.       return
  163.     end
  164.     for i in self.size...size
  165.       self[i] = nil
  166.     end
  167.   end
  168.   def fill(size, text = nil)
  169.     size.times do
  170.       self.push(text)
  171.     end
  172.   end
  173. end
有了这个,还可以美化一下战斗结束提示窗口。
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_BattleResult
  3. #------------------------------------------------------------------------------
  4. #  战斗结束时、显示获得的 EXP 及金钱的窗口。
  5. #==============================================================================
  6.  
  7. class Window_BattleResult < Window_Base
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #     exp       : EXP
  11.   #     gold      : 金钱
  12.   #     treasures : 宝物
  13.   #--------------------------------------------------------------------------
  14.   def initialize(exp, gold, treasures)
  15.     [url=home.php?mod=space&uid=13302]@exp[/url] = exp
  16.     [url=home.php?mod=space&uid=236945]@gold[/url] = gold
  17.     @treasures = treasures.das
  18.     @treasures_num = treasures.dasn
  19.     super(160, 0, 320, @treasures.size * 32 + 64)
  20.     self.contents = Bitmap.new(width - 32, height - 32)
  21.     self.y = 160 - height / 2
  22.     self.back_opacity = 160
  23.     self.visible = false
  24.     refresh
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 刷新
  28.   #--------------------------------------------------------------------------
  29.   def refresh
  30.     self.contents.clear
  31.     x = 4
  32.     self.contents.font.color = normal_color
  33.     cx = contents.text_size(@exp.to_s).width
  34.     self.contents.draw_text(x, 0, cx, 32, @exp.to_s)
  35.     x += cx + 4
  36.     self.contents.font.color = system_color
  37.     cx = contents.text_size("EXP").width
  38.     self.contents.draw_text(x, 0, 64, 32, "EXP")
  39.     x += cx + 16
  40.     self.contents.font.color = normal_color
  41.     cx = contents.text_size(@gold.to_s).width
  42.     self.contents.draw_text(x, 0, cx, 32, @gold.to_s)
  43.     x += cx + 4
  44.     self.contents.font.color = system_color
  45.     self.contents.draw_text(x, 0, 128, 32, $data_system.words.gold)
  46.     y = 32
  47.     for i in 0...@treasures.size
  48.       item = @treasures[i]
  49.       draw_item_name(item, 4, y)
  50.       self.contents.draw_text(320 - 32 - 48, y, 48, 32, @treasures_num[i].to_s, 2)
  51.       self.contents.draw_text(320 - 32 - 96, y, 48, 32, "×", 1)
  52.       y += 32
  53.     end
  54.   end
  55. end

点评

我想说的晴兰已经说了……  发表于 2013-12-22 11:49
@晴兰 RMXP没有此方法。  发表于 2013-12-21 08:22
消灭重复其实有uniq。。。  发表于 2013-12-21 01:25

评分

参与人数 1星屑 +275 收起 理由
怪蜀黍 + 275 部分有用

查看全部评分

呃,发糖贴好冷清呀!

Lv1.梦旅人

梦石
0
星屑
50
在线时间
466 小时
注册时间
2013-2-8
帖子
424
2
发表于 2013-12-21 00:15:42 手机端发表。 | 只看该作者
我好像记得本来就有压缩的方法吧
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2749
在线时间
2630 小时
注册时间
2013-1-16
帖子
5657

贵宾

3
发表于 2013-12-21 00:48:20 | 只看该作者
话说class Array里def number写成def amount 会更好…

点评

RMVA里面叫count。。不过这个也是因人而异的  发表于 2013-12-21 01:24
(Created by @喵kano)


施工现场:hotege.github.io
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
4
发表于 2013-12-22 09:56:02 | 只看该作者
本帖最后由 无脑之人 于 2013-12-22 13:37 编辑

骚年Array有uniq……就算RMXP没有用| []也是可以的
另外你怒黑fill方法,这个方法在Array里面可是有定义的哦


uniq
uniq!

    uniq会删除数组中的重复元素后生成新数组并返回它。剩下的元素会向前移动。uniq!具有破环性,若进行了删除则返回self,若没有删除则返回nil。

    使用Object#eql?来判定元素是否重复。

    例:

    p [1, 1, 1].uniq         #=> [1]
    p [1, 4, 1].uniq         #=> [1, 4]
    p [1, 3, 2, 2, 3].uniq   #=> [1, 3, 2]

fill(val)
fill(val, start[, length])
fill(val, start..end)
fill {|index| ... } ((<ruby 1.7 特性>))
fill(start[, length]) {|index| ... } ((<ruby 1.7 特性>))
fill(start..end) {|index| ... } ((<ruby 1.7 特性>))

    将val赋值给数组中被指定的范围内的所有元素。在第二种形式中,若省略length则意味着将指定范围扩大到数组尾部。若指定范围最终超出原数组的长度时,将自动加长原数组,并以val来对新增元素进行初始化。

    该方法并不是使用val的拷贝,而是用val本身进行赋值(trap::Array)。

    ruby 1.7 特性:

    若没有指定val,而是代之以块时,则以块的计算值进行赋值。对每个元素进行赋值时都会重新计算块,所以被赋值的元素都是某对象的拷贝。传给块的形参的值,是从start开始的索引。

    ary = []
    p ary.fill(1..2) {|i| i}        # => [nil, 1, 2]
    p ary.fill(0,3) {|i| i}         # => [0, 1, 2]
    p ary.fill { "foo" }            # => ["foo", "foo", "foo"]
    p ary.collect {|v| v.id }       # => [537770124, 537770112, 537770100]

    ruby 1.8 特性:在1.8.0版本中有bug,块的形参会出问题。

    ary = []
    p ary.fill(1..2) {|i| i}        # => [2, 4, 6]  <- bug
    p ary.fill(0,3) {|i| i}         # => [1, 3, 5]  <- bug
    p ary.fill { "foo" }            # => ["foo", "foo", "foo"]
    p ary.collect {|v| v.id }       # => [537770124, 537770112, 537770100]


参考文档:http://www.kuqin.com/rubycndocum ... s_object_array.html

点评

真的没有~~~  发表于 2013-12-22 13:03
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

梦石
0
星屑
1249
在线时间
1276 小时
注册时间
2013-1-22
帖子
2246

贵宾

5
发表于 2013-12-27 10:15:12 | 只看该作者
@876加几 @无脑之人 @晴兰
经过我的测试,uniq!是有效的,有图为证:

点评

请不要莫名其妙的@人- -  发表于 2013-12-27 14:03
当然有- -  发表于 2013-12-27 12:20

评分

参与人数 1星屑 +25 收起 理由
怪蜀黍 + 25 测试奖

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-4 02:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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