赞 | 0 |
VIP | 64 |
好人卡 | 11 |
积分 | 39 |
经验 | 56645 |
最后登录 | 2022-1-16 |
在线时间 | 2260 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 3884
- 在线时间
- 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. ]
|
评分
-
查看全部评分
|