Project1

标题: 好难的脚本啊,看不懂… 求指教~~~~ [打印本页]

作者: dabojun    时间: 2012-5-14 11:26
标题: 好难的脚本啊,看不懂… 求指教~~~~
本帖最后由 dabojun 于 2012-5-14 20:34 编辑

def passable?(x, y, d)
71.            return bigevent_passable?(x, y, d) if @bigevent.length == 0        
72.         
73.            return @bigevent.map { |i|                                                # 这一段到这儿就完全不懂该怎么翻译了呵… “| |”这个符号又是啥意思呢…??{:2_277:}
74.              bigevent_passable?(x + i[0], y + i[1], d)
75.            }.all? && bigevent_passable?(x, y, d)
76.          end
77.         
78.          def areas(x = nil, y = nil)                                                      #还可以这样用啊?好神奇…{:2_272:}
79.            x ||= self.x
80.            y ||= self.y
81.            return @bigevent.map { |i|                                                #这边又是如何push呢?{:2_270:}
82.              [x + i[0], y + i[1]]
83.            }.push([x, y])
84.          end
85.        end
        

# 能否给这段加上中文注释??dsu_plus_rewardpost_czw
作者: 灵魂の补给    时间: 2012-5-14 12:40
||集合处理
push 数组加入元素
作者: dabojun    时间: 2012-5-14 13:53
本帖最后由 dabojun 于 2012-5-14 14:39 编辑

能否帮我翻译一下上面那段脚本的内容呢? {:2_249:}

那个集合处理能否举例说明怎么用啊?集合处理和迭代器有关吗?{:2_283:}

用了push会产生什么结果呢?
return @bigevent.map { |i|                                             
             [x + i[0], y + i[1]]
            }.push([x, y])
这个写出来是什么样子呢?{:2_253:}

作者: 飞3a    时间: 2012-5-14 15:43

这个是栈的用法,一般电脑里的硬件都是这么存,欲知详情请看《数据结构》
作者: dabojun    时间: 2012-5-14 16:39
这个“栈”是指……push?好像越来越复杂了,

能否帮我翻译一下上面那段脚本的内容呢?  {:2_269:}

那个集合处理能否举例说明怎么用啊?集合处理和迭代器有关吗?{:2_264:}
作者: dbshy    时间: 2012-5-14 17:04
本帖最后由 dbshy 于 2012-5-14 17:06 编辑

一个PUSH都能扯到栈 牛人多啊

纯引帮助
push(obj1[, obj2 ...])
依次将 obj1、obj2 ... 添加到数组结尾
这不就很好理解 另外你提的都可以在帮助中找到

LZ问的都可以在帮助和参考手册上找到 自己耐心点去找吧
编程 尤其是数据结构 不要被对方的专业术语所吓住 看起来很NB的词其实很简单 关键是自己上机动手实践



作者: dabojun    时间: 2012-5-14 17:17
请细心的看一下我的问题在回答啊~~~!
我知道push是推到结尾的意思,帮助里我也看过,我想问的是在这句编程里加入….push([x,y])是会变成[x+i[0],y+i[1],[x,y]]这样吗?
return @bigevent.map { |i|                                               
           [x + i[0], y + i[1]]
            }.push([x, y])
能否完整的回答一下问题呀~~~?
作者: orzfly    时间: 2012-5-14 17:21
楼主你首先把完整脚本发出来吧,虽然据说是我写的。
作者: dabojun    时间: 2012-5-14 17:27
嗯,对,你写的。各种想弄明白啥意思

1.        # 巨大事件占地面积的处理
2.        # author: Yeechan Lu a.k.a. orzFly
3.         
4.        class Game_Character
5.          alias bigevent_initialize initialize   
6.          def initialize
7.            @bigevent = []
8.            bigevent_initialize
9.          end
10.         
11.          def bigevent_passable?(x, y, d)  
12.            # 求得新的坐标
13.            new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
14.            new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
15.            # 坐标在地图以外的情况
16.            unless $game_map.valid?(new_x, new_y)  
17.              # 不能通行
18.              return false
19.            end
20.            # 穿透是 ON 的情况下
21.            if @through      
22.              # 可以通行
23.              return true
24.            end
25.            # 移动者的元件无法来到指定方向的情况下
26.            unless $game_map.passable?(x, y, d, self)  
27.              # 通行不可
28.              return false
29.            end
30.            # 从指定方向不能进入到移动处的元件的情况下
31.            unless $game_map.passable?(new_x, new_y, 10 - d)
32.              # 不能通行
33.              return false
34.            end
35.            new_point = [new_x, new_y]
36.            # 循环全部事件
37.            for event in $game_map.events.values
38.              # 事件坐标于移动目标坐标一致的情况下
39.              if event.areas.include?(new_point) and self != event
40.                # 穿透为 ON
41.                unless event.through
42.                  # 自己就是事件的情况下
43.                  if self != $game_player
44.                    # 不能通行
45.                    return false
46.                  end
47.                  # 自己是主角、对方的图形是角色的情况下
48.                  if event.character_name != ""
49.                    # 不能通行
50.                    return false
51.                  end
52.                end
53.              end
54.            end
55.            # 主角的坐标与移动目标坐标一致的情况下
56.            if $game_player.areas.include?(new_point)
57.              # 穿透为 ON
58.              unless $game_player.through
59.                # 自己的图形是角色的情况下
60.                if @character_name != ""
61.                  # 不能通行
62.                  return false
63.                end
64.              end
65.            end
66.            # 可以通行
67.            return true
68.          end
69.         
70.          def passable?(x, y, d)
71.            return bigevent_passable?(x, y, d) if @bigevent.length == 0        
72.         
73.            return @bigevent.map { |i|
74.              bigevent_passable?(x + i[0], y + i[1], d)
75.            }.all? && bigevent_passable?(x, y, d)
76.          end
77.         
78.          def areas(x = nil, y = nil)
79.            x ||= self.x
80.            y ||= self.y
81.            return @bigevent.map { |i|
82.              [x + i[0], y + i[1]]
83.            }.push([x, y])
84.          end
85.        end
86.        class Game_Player
87.          #--------------------------------------------------------------------------
88.          # ● 正面事件的启动判定
89.          #--------------------------------------------------------------------------
90.          def check_event_trigger_there(triggers)
91.            result = false
92.            # 事件执行中的情况下
93.            if $game_system.map_interpreter.running?
94.              return result
95.            end
96.            # 计算正面坐标
97.            new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
98.            new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
99.            new_point = [new_x, new_y]
100.            # 全部事件的循环
101.            for event in $game_map.events.values
102.              # 事件坐标与目标一致的情况下
103.              if event.areas.include?(new_point) and
104.                 triggers.include?(event.trigger)
105.                # 跳跃中以外的情况下、启动判定是正面的事件
106.                if not event.jumping? and not event.over_trigger?
107.                  event.start
108.                  result = true
109.                end
110.              end
111.            end
112.            # 找不到符合条件的事件的情况下
113.            if result == false
114.              # 正面的元件是计数器的情况下
115.              if $game_map.counter?(new_x, new_y)
116.                # 计算 1 元件里侧的坐标
117.                new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
118.                new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
119.                new_point = [new_x, new_y]
120.                # 全事件的循环
121.                for event in $game_map.events.values
122.                  # 事件坐标与目标一致的情况下
123.                  if event.areas.include?(new_point) and
124.                     triggers.include?(event.trigger)
125.                    # 跳跃中以外的情况下、启动判定是正面的事件
126.                    if not event.jumping? and not event.over_trigger?
127.                      event.start
128.                      result = true
129.                    end
130.                  end
131.                end
132.              end
133.            end
134.            return result
135.          end
136.          #--------------------------------------------------------------------------
137.          # ● 接触事件启动判定
138.          #--------------------------------------------------------------------------
139.          def check_event_trigger_touch(x, y)
140.            result = false
141.            # 事件执行中的情况下
142.            if $game_system.map_interpreter.running?
143.              return result
144.            end
145.            # 全事件的循环
146.            for event in $game_map.events.values
147.              # 事件坐标与目标一致的情况下
148.              if event.areas.include?([x, y]) and [1,2].include?(event.trigger)
149.                # 跳跃中以外的情况下、启动判定是正面的事件
150.                if not event.jumping? and not event.over_trigger?
151.                  event.start
152.                  result = true
153.                end
154.              end
155.            end
156.            return result
157.          end
158.        end
每张有这种要设置占地面积的事件的地图上,放一个自动执行的事件。
内容:
脚本:
RUBY 代码复制代码
1.        $game_map.events[1].instance_variable_set \
2.        :@bigevent, \
3.        [
4.          [-1, 0],
5.          [1, 0],
6.          [0, 1],
7.          [0, -1],
8.        ]

作者: 灵魂の补给    时间: 2012-5-14 18:51
push尾部
shift 最前面添加
作者: orzfly    时间: 2012-5-14 19:37
纯贴地址
http://hi.baidu.com/code4fun/blog/item/c608b60eadf1eaec36d12205.html
http://blog.csdn.net/classwang/article/details/4692856
http://guides.ruby.tw/ruby/iterators.html

另外
a=[1, 2, 3]
b=a.push(4)
之后a=b=[1, 2, 3, 4]
作者: LOVE丶莫颜    时间: 2012-5-14 21:36
建议你可以去看一下新手的脚本入门,可能对你会有所帮助。
作者: 飞3a    时间: 2012-5-14 21:47
本帖最后由 飞3a 于 2012-5-14 21:50 编辑

某飞尝试的写了一个,希望有所帮助,也希望获得各位高手的指点(自己也弄不清楚的东西已经写在注释里)
这个脚本的功能是巨大事件占地面积的处理。如果你写的事件不超出窗口范围,当中不跳转或者不出什么岔子是可以正常执行它的功能的。

   # 巨大事件占地面积的处理
2.        # author: Yeechan Lu a.k.a. orzFly
3.         
4.        class Game_Character
5.          alias bigevent_initialize initialize   
6.          def initialize#定义实例
7.            @bigevent = []   #创建(对象)变量bigevent(一个空的数组)
8.            bigevent_initialize#创建(局部)变量bigevent_initialize
9.          end
10.         
11.          def bigevent_passable?(x, y, d)  
12.            # 求得新的坐标
13.            new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)#new_x是x+括号里的一堆
对于括号里的解释:如果d是6,则new_x是x+1
如果d是4,则new_x是x+(-1),如果都不是,则new-x是x+0
(猜测:2,4,6,8是方向。。。)
14.            new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)#这个和上述一个意思,只是换个名字类推
格式:a?x:y的意思是,如果满足a条件,则转x分支,不满足转y分支
15.            # 坐标在地图以外的情况
16.            unless $game_map.valid?(new_x, new_y)   
17.              # 不能通行
18.              return false   #返回false
19.            end
20.            # 穿透是 ON 的情况下
21.            if @through      
22.              # 可以通行
23.              return true    #返回true
24.            end
25.            # 移动者的元件无法来到指定方向的情况下
26.            unless $game_map.passable?(x, y, d, self)  
27.              # 通行不可
28.              return false
29.            end
30.            # 从指定方向不能进入到移动处的元件的情况下
31.            unless $game_map.passable?(new_x, new_y, 10 - d)
32.              # 不能通行
33.              return false
34.            end
#即:无法通行(超出窗口的范围,无法来到指定的方向)的情况返回false,可以通行的情况返回true
35.            new_point = [new_x, new_y]
36.            # 循环全部事件
37.            for event in $game_map.events.values
38.              # 事件坐标于移动目标坐标一致的情况下
39.              if event.areas.include?(new_point) and self != event
40.                # 穿透为 ON
41.                unless event.through
42.                  # 自己就是事件的情况下
43.                  if self != $game_player
44.                    # 不能通行
45.                    return false
46.                  end
47.                  # 自己是主角、对方的图形是角色的情况下
48.                  if event.character_name != ""
49.                    # 不能通行
50.                    return false
51.                  end
52.                end
53.              end
54.            end
55.            # 主角的坐标与移动目标坐标一致的情况下
56.            if $game_player.areas.include?(new_point)
57.              # 穿透为 ON
58.              unless $game_player.through
59.                # 自己的图形是角色的情况下
60.                if @character_name != ""
61.                  # 不能通行
62.                  return false
63.                end
64.              end
65.            end
66.            # 可以通行
67.            return true
68.          end
69.         
70.          def passable?(x, y, d)#定义 passable?(x, y, d)
71.            return bigevent_passable?(x, y, d) if @bigevent.length == 0        
72.         #如果bigevent数组的长度是0则返回值
73.            return @bigevent.map { |i|
74.              bigevent_passable?(x + i[0], y + i[1], d)
75.            }.all? && bigevent_passable?(x, y, d)
76.          end#否则把(x + i[0], y + i[1], d)放到bigevent_passable最后一个(即压栈,把数值存进去)再把值返回(我承认这个是猜的,没弄清楚是存进去还是把原来的数字给换了)
77.         
78.          def areas(x = nil, y = nil)#定义区域(x,y)
79.            x ||= self.x
80.            y ||= self.y#把x,y赋值(self.XX表示当前类方法(有时同名的变量多会搞混))
81.            return @bigevent.map { |i|
82.              [x + i[0], y + i[1]]
83.            }.push([x, y])#返回@bigevent.map的值([x + i[0], y + i[1]])
84.          end
85.        end
86.        class Game_Player
87.          #--------------------------------------------------------------------------
88.          # ● 正面事件的启动判定
89.          #--------------------------------------------------------------------------
90.          def check_event_trigger_there(triggers)
91.            result = false
92.            # 事件执行中的情况下
93.            if $game_system.map_interpreter.running?
94.              return result
95.            end
96.            # 计算正面坐标
97.            new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
98.            new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
99.            new_point = [new_x, new_y]
100.            # 全部事件的循环
101.            for event in $game_map.events.values
102.              # 事件坐标与目标一致的情况下
103.              if event.areas.include?(new_point) and
104.                 triggers.include?(event.trigger)
105.                # 跳跃中以外的情况下、启动判定是正面的事件
106.                if not event.jumping? and not event.over_trigger?#如果事件不跳转(跳到别的事件或者不过度触发(过度触发是什么orz))
107.                  event.start#事件开启
108.                  result = true#返回true
109.                end
110.              end
111.            end
112.            # 找不到符合条件的事件的情况下
113.            if result == false
114.              # 正面的元件是计数器的情况下
115.              if $game_map.counter?(new_x, new_y)
116.                # 计算 1 元件里侧的坐标
117.                new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
118.                new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
119.                new_point = [new_x, new_y]
120.                # 全事件的循环
121.                for event in $game_map.events.values
122.                  # 事件坐标与目标一致的情况下
123.                  if event.areas.include?(new_point) and
124.                     triggers.include?(event.trigger)
125.                    # 跳跃中以外的情况下、启动判定是正面的事件
126.                    if not event.jumping? and not event.over_trigger?
127.                      event.start
128.                      result = true
129.                    end
130.                  end
131.                end
132.              end
133.            end
134.            return result
135.          end
136.          #--------------------------------------------------------------------------
137.          # ● 接触事件启动判定
138.          #--------------------------------------------------------------------------
139.          def check_event_trigger_touch(x, y)#定义check_event_trigger_touch
140.            result = false
141.            # 事件执行中的情况下
142.            if $game_system.map_interpreter.running?#(地图的编译器运行中)
143.              return result
144.            end
145.            # 全事件的循环
146.            for event in $game_map.events.values
147.              # 事件坐标与目标一致的情况下
148.              if event.areas.include?([x, y]) and [1,2].include?(event.trigger)
149.                # 跳跃中以外的情况下、启动判定是正面的事件
150.                if not event.jumping? and not event.over_trigger?
151.                  event.start
152.                  result = true
153.                end
154.              end
155.            end
156.            return result
157.          end
158.        end
每张有这种要设置占地面积的事件的地图上,放一个自动执行的事件。
内容:
脚本:
RUBY 代码复制代码
1.        $game_map.events[1].instance_variable_set \
2.        :@bigevent, \
3.        [
4.          [-1, 0],
5.          [1, 0],
6.          [0, 1],
7.          [0, -1],
8.        ]

作者: dabojun    时间: 2012-5-15 18:20
感谢飞3a 的耐心解答,收益颇多~~
作者: orzfly    时间: 2012-5-15 19:39
飞3a 发表于 2012-5-14 21:47
某飞尝试的写了一个,希望有所帮助,也希望获得各位高手的指点(自己也弄不清楚的东西已经写在注释里)
这 ...

看一看 http://sitoto.iteye.com/blog/1488557

a=[1, 2, 3]
b=a.map { |x| x * 5 }
那么 b = [5, 10, 15]

对于
tf = [true, false]
ff = [false, false]
tt = [true, true]

ff.all?, ft.all?, tt.all? 结果分别是 false, false, true

还有
x ||= y
意思是
x = x || y

unless x
  x = y
end
即如果 x 是 nil, y 才会被赋值给 x


作者: 飞3a    时间: 2012-5-15 20:03
本帖最后由 飞3a 于 2012-5-15 20:12 编辑
orzfly 发表于 2012-5-15 19:39
看一看 http://sitoto.iteye.com/blog/1488557

a=[1, 2, 3]


已阅,谢谢,弱弱的问一句,|x|这个是什么- -。。。。虽然我记得以前学过,可是又忘了。。
还有在这个帖子里面http://rpg.blue/forum.php?mod=viewthread&tid=226024
第二题。。。。。不是b数组已经每个元素i+=1了么,但是机器运出来:
irb(main):005:0> a=[6,6,1,2,3]
=> [6, 6, 1, 2, 3]
irb(main):007:0> b.each{|i| i+=1}
=> [6, 6, 1, 2, 3]#还是原来的那a数组的值没有变化
求解。。。

另外
ff.all?, ft.all?, tt.all?这个是什么功能额。。。。与运算么- -(我查了一下百度没找到,无奈伸手了)
作者: orzfly    时间: 2012-5-15 20:12
飞3a 发表于 2012-5-15 20:03
已阅,谢谢,弱弱的问一句,|x|这个是什么- -。。。。虽然我记得以前学过,可是有忘了。。
还有在这个帖 ...

http://blog.itpub.net/post/9983/56219 通读此文先
在块的定义内,参数列表出现在两个竖线之间。



后面那个问题要知道ruby中, Fixnum 属于即时值类型。
因此 each 迭代器传来的 Fixnum 并不是对数组里的那个的引用。
作者: dabojun    时间: 2012-5-15 20:16
orzfly 发表于 2012-5-15 19:39
看一看 http://sitoto.iteye.com/blog/1488557

a=[1, 2, 3]

写下恢复你就可以收到了吗? 好吧~  x ||= y 终于懂了 呵

作者: orzfly    时间: 2012-5-15 20:50
dabojun 发表于 2012-5-15 20:16
写下恢复你就可以收到了吗? 好吧~  x ||= y 终于懂了 呵

这个你要去查阅英文文档……没见过有翻译的目前……

Enumable 提供了 all?……
Array 包含了 Enumable

all? 的作用是判断是否所有元素都是真,即如果如果存在 false, nil 那么 all? 就一定为 false 了。
作者: xszhu123    时间: 2012-5-15 23:12
顶!!!!!!!!!!
作者: dabojun    时间: 2012-5-16 11:42
本帖最后由 dabojun 于 2012-5-17 10:55 编辑
orzfly 发表于 2012-5-15 20:50
这个你要去查阅英文文档……没见过有翻译的目前……

Enumable 提供了 all?……


嗯,all?的方法暂时看懂了,只是应用时层叠的方法摆在一起很容易混乱呵


‘‘──dabojun于2012-5-16 18:26补充以下内容

正在看迭代器的讲解,既http://blog.csdn.net/classwang/article/details/4692856
想知道里面的"/n"是什么意思呀??反复出现@

’’
还有着一段也不理解……~ 划红线的部分都不大理解的说呵…

20.4.4  sort_by方法
sort方法会在每次进行比较时判断元素。让我们来计算一下前面比较字符串长度的示例中,length方法到底被调用了几次。

ary = %w(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)

num = 0                  # 调用的次数

ary.sort {|a, b|

  num += 2               # 累加调用的次数

  a.length <=> b.length

}

p num                      #=> 54

这个示例可以知道有20个元素的时候,length方法要调用54次。按理说对每个字符串调用一次length方法再排序就可以了,所以这里做了很多次多余的调用动作。当数组很长,或者判断元素的运算很耗时的时候,这些多余的调用动作会对整体执行时间造成很大的影响。




‘‘──dabojun于2012-5-17 14:16补充以下内容

关于over_trigger是否可以这样解释?
# 跳跃中以外的情况下、启动判定是正面的事件
106.                if not event.jumping? and not event.over_trigger?
107.                  event.start
108.                  result = true
109.                end
110.              end
111.            end      # (“if not”用法)(over为:以上,以外,trigger为:触发,启动判定/触发条件:0,1,2,3,4)

’’


‘‘──dabojun于2012-5-17 14:33补充以下内容

还有这段也不知是何意? 和计数器有何关系呢?计数器是计步数,还是时间倒计时窗口呢?
# 找不到符合条件的事件的情况下
113.            if result == false
114.              # 正面的元件是计数器的情况下
115.              if $game_map.counter?(new_x, new_y)
116.                # 计算 1 元件里侧的坐标 (里侧的坐标又是何意?)
117.                new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
118.                new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
119.                new_point = [new_x, new_y]

’’


‘‘──dabojun于2012-5-17 14:51补充以下内容

一坑未平,一坑又起,请转移视线到新坑~
’’




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1