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

Project1

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

[已经解决] “巨大事件通行判定”脚本如何实现局部“互动效果”呢?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
45
在线时间
282 小时
注册时间
2012-2-18
帖子
161
跳转到指定楼层
1
发表于 2012-5-17 15:24:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dabojun 于 2012-5-29 21:38 编辑

我想以主视角射击的角度看待“巨大事件”,也就是说:主角是射击的光标(无论鼠标操控|键盘都可)“巨大事件”是由多部分组成的“事件”(可以设定成任何形象)。到此为止是和“巨大事件的通行判定”思路统一的。
不同在于,光标点重“巨大事件”的“部分”时,“部分”会产生互动效果~~
举例为:“巨大事件”=>敌人为多部分组成的“机器人”,射击四肢,或心脏或头部多次会损毁或产生致命伤害等等…

又要伸手了呵……,

先发回巨大事件通行判定的脚本吧:

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.        ]
1.       
这个脚本有多少个要设置占地面积的事件就放多少个。
events[1]这里的1代表事件ID。下面的[-1, 0]代表相对于那个事件左边一格,[0, 1]代表相对于那个事件下面一格。这里可以有多个格子。
比如上面那一段就是让那个事件占地面积变成 左右上下各一格加上本来的那一格 总共5格的十字形。  
        RUBY 代码 复制代码
1.        $game_map.events[1].instance_variable_set \
2.        :@bigevent, \
3.        [
4.          [-1, -1], [0, -1], [1, -1],
5.          [-1, 0],          [1, 0],
6.          [-1, 1], [0, 1], [1, 1],
7.        ]
2.       
这样就是把1号事件设置成了一个3x3的矩形。也就是说他占地面积是9格 = =b

在事件最后加上 暂时消除事件 而不是用独立开关的方法以确保每次来到这张地图这段脚本都可以运行一次。

于是事件的可通行区域和触发都得到了修正。
      

点评

这个……不是肥婆脚本吗?!  发表于 2012-5-17 17:52
真实的我不是这样子的~@

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

2
发表于 2012-5-17 22:53:05 | 只看该作者
107.                  event.start
上面加上
$game_variables[34] = new_x - event.x
$game_variables[35] = new_y - event.y

这样事件触发之后,34,35号坐标里就保存了触发这个事件时 坐标与事件原点的偏移……即与bigevent属性一致……


即如果对于一个bigevent设置成了
4.          [-1, -1], [0, -1], [1, -1],
5.          [-1, 0],          [1, 0],
6.          [-1, 1], [0, 1], [1, 1],
的,
如果在那个事件左上角触发了,那么,34 = -1, 35 = -1
如果在左下角触发了,那么 v34 = -1, v35 = 1
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
45
在线时间
282 小时
注册时间
2012-2-18
帖子
161
3
 楼主| 发表于 2012-5-18 12:04:02 | 只看该作者
本帖最后由 dabojun 于 2012-5-18 12:05 编辑
orzfly 发表于 2012-5-17 22:53
107.                  event.start
上面加上
$game_variables[34] = new_x - event.x


首先,你的意思是这样吧?

107. event.start
$game_variables[34] = new_x - event.x
$game_variables[35] = new_y - event.y
108.                  result = true

加上变量操作?其他的不变对吧?

之前的“巨大事件”脚本不需要在“原事件”周围加事件,可是这次我要加的。
如同“原事件”为机器人“胸部”,周围事件分别组成他的“头部”、“四肢”一样。
我尝试了下,“周边事件”没跟“原事件”一起动…
不知哪里出了问题??
真实的我不是这样子的~@
回复

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

4
发表于 2012-5-18 12:22:23 | 只看该作者

$game_variables[34] = new_x - event.x

$game_variables[35] = new_y - event.y

107. event.start

108.                  result = true

把周边部分合并成一个整的……
之后你根据变量的值不就能知道是哪一部分了么……
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
45
在线时间
282 小时
注册时间
2012-2-18
帖子
161
5
 楼主| 发表于 2012-5-18 14:47:50 | 只看该作者
orzfly 发表于 2012-5-18 12:22
$game_variables[34] = new_x - event.x

$game_variables[35] = new_y - event.y

我能否把工程发给你,帮我看一下? 实在是理解力有限了,苦手,苦手…
真实的我不是这样子的~@
回复

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

6
发表于 2012-5-18 14:51:58 | 只看该作者
dabojun 发表于 2012-5-18 14:47
我能否把工程发给你,帮我看一下? 实在是理解力有限了,苦手,苦手…

发到 orzfly在qq.com
那个汉字自己改成@

我这几天抽空看看吧……
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
45
在线时间
282 小时
注册时间
2012-2-18
帖子
161
7
 楼主| 发表于 2012-5-18 14:57:50 | 只看该作者
本帖最后由 dabojun 于 2012-5-18 15:27 编辑
orzfly 发表于 2012-5-18 14:51
发到 orzfly在qq.com
那个汉字自己改成@


不压力,多谢了~
发出了,收到没~?
真实的我不是这样子的~@
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-24 20:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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