| 赞 | 0  | 
 
| VIP | 64 | 
 
| 好人卡 | 11 | 
 
| 积分 | 45 | 
 
| 经验 | 56645 | 
 
| 最后登录 | 2022-1-16 | 
 
| 在线时间 | 2260 小时 | 
 
 
 
 
 
Lv3.寻梦者 
	- 梦石
 - 0 
 
        - 星屑
 - 4539 
 
        - 在线时间
 - 2260 小时
 
        - 注册时间
 - 2008-1-28
 
        - 帖子
 - 3193
 
 
  
 
 | 
	
 本帖最后由 飞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.        ] 
 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |