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

Project1

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

[已经解决] 求教夏娜大人的"在游戏运行中制作事件"腳本的事件指定方法

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
461 小时
注册时间
2008-11-19
帖子
607
跳转到指定楼层
1
发表于 2012-5-15 20:13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sai90306 于 2012-5-16 00:40 编辑

接續http://rpg.blue/thread-232181-1-1.html的問題

夏娜大人的"在游戏运行中制作事件"腳本
裡面創造的事件能不能指定為某地圖上的一個已經做好的事件?

例如e = RPG::Event.new(x,y)改為...類似e = 地圖編號.地圖事件ID 這樣@@

附上hys111111大大調整後的在游戏运行中制作事件腳本:
    # 脚本说明:
    # ● 在游戏运行中制作事件
    # By:灼眼的夏娜
    class Game_Map
    attr_reader   :map
    end
    class Game_Character
    attr_accessor :character_name
    end
    class Scene_Map
    def conjure(map_id,x,y,name,character_name)
       @map = Game_Map.new.setup(map_id)
       @map.events[$game_map.events.size+1] = Game_Event.new(map_id,produce_event(x,y,name,character_name))
       @map.map.events[$game_map.events.size] = produce_event(x,y,name,character_name)
       @spriteset.dispose
       @spriteset = Spriteset_Map.new
    end
    def produce_event(map_id,x,y,name,character_name)
       e = RPG::Event.new(x,y)
       e.id = @map.events.size
       e.name = name
       e.pages = [RPG::Event::Page.new]   
       e.pages[0].graphic = RPG::Event::Page::Graphic.new
       e.pages[0].graphic.character_name = character_name   
       e.pages[0].step_anime = true
       e.pages[0].through = true
       #
       # 事件的一些其他属性大家可以自行设置
       #
       return e
    end
    end


具體是想將def produce_event(map_id,x,y,name,character_name)的部分
改為讀取地圖數據然後指定該地圖事件ID...一類的功能

点评

謝謝Isu姊支持!真不好意思><  发表于 2012-5-16 00:20
刚晚自习回来,发现了这个问题……话说这个得研究Interpreter才行  发表于 2012-5-15 21:11
所以想說如果可以在地圖上編輯然後調用他 也許會方便一些  发表于 2012-5-15 20:27
此問題的最佳答案者> 追加 450 的獎勵!!!   发表于 2012-5-15 20:19
但是這個要製作的事件如果要用腳本寫...很辛苦的@@  发表于 2012-5-15 20:17

Lv3.寻梦者

双子人

梦石
0
星屑
3190
在线时间
3618 小时
注册时间
2009-4-4
帖子
4154

开拓者

2
发表于 2012-5-15 21:27:14 | 只看该作者
本帖最后由 hys111111 于 2012-5-15 21:29 编辑

Interpreter是很恐怖的东西,
可以这样子添加:
  1. e.pages[0].list[0].code = 101
  2. e.pages[0].list[0].parameters = ["文章"]#像显示文章就填数值得了,这个是数组来到的
复制代码
补充解释:
pages[0]#事件第0页
list[0]#第一个执行的
list[1]#第二个执行的



附加说明:
各事件指令中都分配有如下表那样代码。Interpreter 类根据这些代码来辨别事件指令,并调用各自进行处理的方法。

101: 显示文章
102: 显示选择项
103: 数值输入的处理
104: 更改文章选项
105: 按钮输入的处理
106: 等待
108: 注释
111: 条件分歧
112: 循环
113: 中断循环
115: 中断事件处理
116: 暂时消除事件
117: 公共事件
118: 标签
119: 标签跳转
121: 开关操作
122: 变量操作
123: 独立开关操作
124: 计时器操作
125: 增减金钱
126: 增减物品
127: 增减武器
128: 增减防具
129: 替换队员
131: 更改窗口外观
132: 更改战斗 BGM
133: 更改战斗结束 ME
134: 更改禁止存档
135: 更改禁止菜单
136: 更改禁止遇敌
201: 场所移动
202: 设置事件位置
203: 画面卷动
204: 更改地图设置
205: 更改雾的色调
206: 更改雾的不透明度
207: 显示动画
208: 更改透明状态
209: 设置移动路线
210: 等待移动结束
221: 准备渐变
222: 执行渐变
223: 更改画面色调
224: 画面闪烁
225: 画面震动
231: 显示图片
232: 移动图片
233: 旋转图片
234: 更改图片色调
235: 图片消失
236: 天气设置
241: 演奏 BGM
242: 淡出 BGM
245: 演奏 BGS
246: 淡出 BGS
247: 记忆 BGM / BGS
248: 还原 BGM / BGS
249: 演奏 ME
250: 演奏 SE
251: 停止 SE
301: 战斗处理
302: 商店处理
303: 名称输入处理
311: 增减 HP
312: 增减 SP
313: 更改状态
314: 完全回复
315: 增减 EXP
316: 增减等级
317: 增减能力值
318: 增减特技
319: 变更装备
320: 更改角色姓名
321: 更改角色职业
322: 更改角色图形
331: 增减敌人 HP
332: 增减敌人 SP
333: 更改敌人状态
334: 敌人出现
335: 敌人变身
336: 敌人完全回复
337: 显示动画
338: 伤害处理
339: 强制行动
340: 战斗中断
351: 呼叫菜单画面
352: 呼叫存档画面
353: 游戏结束
354: 返回标题画面
355: 脚本


事件代码就是上述这些,但也不是全部,比如「显示文章」指令下面的第二行分配的是 401 代码,这些存在特殊的情况。但是,事件指令的处理本身因为在预置的 Interpreter 类中完成,所以没必要在意这样的内部代码。只要事先记住这些就 OK 了。

点评

http://bbs.66rpg.com/forum.php?mod=viewthread&tid=50278&highlight=%E5%9B%9B%E5%A4%84%E7%95%99%E6%83%85  发表于 2012-5-15 21:31
所以我才想能不彭不要碰這個Interpreter@@ 能不能向美獸大人那樣調用 透過地圖事件編輯好的事件  发表于 2012-5-15 21:30

评分

参与人数 1星屑 +100 收起 理由
lsu666666 + 100 補上最後50分!~

查看全部评分

回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
461 小时
注册时间
2008-11-19
帖子
607
3
 楼主| 发表于 2012-5-15 21:36:11 | 只看该作者
本帖最后由 sai90306 于 2012-5-16 00:42 编辑
hys111111 发表于 2012-5-15 21:27
Interpreter是很恐怖的东西,
可以这样子添加:补充解释:
pages[0]#事件第0页


美獸大人的腳本中有調用事件的方法 只是我看不太明白
  1.   def self.make_events(map_id,event_id,item_x,item_y,save=false)
  2.       return unless self.is_map?        
  3.       map = self.map_data_load(map_id)      
  4.       temp = Marshal.load(Marshal.dump(map))      
  5.       if !$game_system.map_events_number
  6.          $game_system.map_events_number = {}
  7.       end  
  8.       sum = $game_system.map_events_number      
  9.       m_id = $game_map.map_id      
  10.       sum[m_id] == nil ? sum[m_id] = 2000 : sum[m_id] += 1
  11.       new_event_id = sum[m_id]      
  12.       temp.events[event_id].id = new_event_id      
  13.       temp.events[event_id].x,temp.events[event_id].y = item_x,item_y      
  14.       $game_map.events[new_event_id] = Game_Event.new(m_id,temp.events[event_id])
  15.       if save
  16.          now_map = self.map_data_load(m_id)
  17.          now_map.events[new_event_id] = temp.events[event_id]
  18.          self.map_data_save(m_id,now_map)
  19.       end  
  20.       refresh_map   
  21.   end
复制代码
我試著改了
def self.make_events(map_id,event_id,item_x,item_y,save=false)
為 def self.make_events(map_id,event_id, target_map, item_x,item_y,save=false)
然後改
m_id = $game_map.map_id  
為 m_id = target_map


然後事件調用指令:
Drop_Item.make_events(1,1,2,0,0,true)
也就是將1號地圖的1號事件複製到2號地圖的0,0位置
然後去2號地圖看確實實現了!
不過囧的是...原本發動這個指令的1號地圖也在相同的位置0,0產生了1號事件的複製品...

点评

e.pages[0].list = @item_map.events[item_id].pages[0].list 这行就是复制它的解释器(28行)  发表于 2012-5-16 18:53
我想能不能在夏娜大人的腳本中調用類似的提取功能  发表于 2012-5-15 21:43
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
3 小时
注册时间
2012-5-12
帖子
29
4
发表于 2012-5-15 23:20:36 | 只看该作者
路过!!!
不发表意见……

评分

参与人数 1星屑 -100 收起 理由
zhixin1997 -100 一天连续多次恶意打酱油,恭喜获得精美礼品.

查看全部评分

回复

使用道具 举报

Lv3.寻梦者

双子人

梦石
0
星屑
3190
在线时间
3618 小时
注册时间
2009-4-4
帖子
4154

开拓者

5
发表于 2012-5-16 12:42:24 | 只看该作者
本帖最后由 hys111111 于 2012-5-16 19:00 编辑

哦,需要这样了……
  1.   def self.make_events(map_id,event_id,item_x,item_y,save=false)
  2.       return unless self.is_map?        
  3.       map = self.map_data_load(map_id)      
  4.       temp = Marshal.load(Marshal.dump(map))      
  5.       if !$game_system.map_events_number
  6.          $game_system.map_events_number = {}
  7.       end  
  8.       sum = $game_system.map_events_number      
  9.       m_id = $game_map.map_id      
  10.       sum[m_id] == nil ? sum[m_id] = 2000 : sum[m_id] += 1
  11.       new_event_id = sum[m_id]      
  12.       temp.events[event_id].id = new_event_id      
  13.       temp.events[event_id].x,temp.events[event_id].y = item_x,item_y      
  14.       $game_map.events[new_event_id] = Game_Event.new(m_id,temp.events[event_id])
  15.       $game_map.events[new_event_id].page = temp.events[event_id].page#添加部分
  16.       if save
  17.          now_map = self.map_data_load(m_id)
  18.          now_map.events[new_event_id] = temp.events[event_id]
  19.          self.map_data_save(m_id,now_map)
  20.       end  
  21.       refresh_map   
  22.   end
复制代码

点评

調用這個腳本的方法是Scene_Map.conjure(map_id,x,y,name,character_name,item_map,item_id)嗎?  发表于 2012-5-16 18:58
是成功複製了 不過複製了兩份...指定的地圖一個(這是正確的) 不過主角所再地圖也有一份了...  发表于 2012-5-16 18:55
用提取放置物的self.make_events(map_id,event_id,item_x,item_y,save=false)裡的方式替代...  发表于 2012-5-16 18:53
我想到的複製方式就是如上...將produce_event(map_id,x,y,name,character_name,item_id)的內容  发表于 2012-5-16 18:52
.list 就是事件的解释器列表,28行那行如下。就是复制那个的。另,def conjure我又加了两项  发表于 2012-5-16 18:52

评分

参与人数 1星屑 +300 收起 理由
lsu666666 + 300 另外50分 明日補上@__@

查看全部评分

回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
461 小时
注册时间
2008-11-19
帖子
607
6
 楼主| 发表于 2012-5-16 19:10:36 | 只看该作者
本帖最后由 sai90306 于 2012-5-16 19:26 编辑
hys111111 发表于 2012-5-16 12:42
哦,需要这样了……


我內個...用很蠢的方法好像做出效果了...hys大要不要試試看效果@@?
主要加了一個tmap_id的輸入值
效果是出來了...不過完全脫夏娜大人的腳本了已經完全是美獸大人腳本了
然後就是80行那個刪除總覺得的先做出來再把多餘的刪除不是很好的做法 感覺太浪費資源...不過以我的水平只能做到這樣了
  1. #=begin
  2. #==============================================================================
  3. # ☆★☆ 提取放置物腳本(強化) ☆★☆
  4. #------------------------------------------------------------------------------
  5. # - 美獸
  6. # - 2007.4.12
  7. #------------------------------------------------------------------------------
  8. #  愛護環境,人人有責,現實中切勿亂丟垃圾。
  9. #------------------------------------------------------------------------------
  10. #------------------------------------------------------------------------------
  11. #  腳本原理:
  12. #  是從倉庫地圖中提取事件,將其拷貝放入指定的位置,
  13. #  依此達成隨時隨地生成新事件的功能,如此可節省大量用RGSS編寫事件所消耗的體力,很多地方寫的
  14. #  很保守,盡量減少衝突幾率。。
  15. #  此為強化版,可實現新事件的保存,但代價是衝突的隨之增大,若只想單純實現ARPG
  16. #  一類的物品掉落,場所移動後便清除,請使用簡潔版。
  17. #------------------------------------------------------------------------------
  18. =begin
  19.                                 Note:

  20. 一:生成物品主方法:
  21.     Drop_Item.make_events(map_id,event_id,item_x,item_y,save=false)
  22.     map_id : 倉庫地圖的ID。
  23.     event_id : 倉庫中對應事件的ID。
  24.     item_x、item_y :新事件的X與Y坐標
  25.     save : 是否存儲標誌;
  26.            默認為false,即不存儲,場所移動等轉換場景後事件會消失;
  27.            true 為存儲,取檔、關機、登火星,返回後事件仍存在。

  28. 二:刪除事件方法:
  29.     事件名若包含"delete"字段,則執行完畢會立即自我清除;
  30.     註:任何事件皆如此。

  31. 三:必掌握語句:
  32.     $game_map.events[@event_id]
  33.     $game_player
  34.     事件的腳本使用,表示「本事件」和「角色」,主要為取得事件的坐標,
  35.     取得「本事件」X與Y坐標:$game_map.events[@event_id].event.x
  36.                             $game_map.events[@event_id].event.y
  37.     取得「角色」X與Y坐標:$game_player.x
  38.                           $game_player.y
  39.     例如,在某事件左側生成2號地圖的2號事件並永久存儲,寫法如下。
  40.     x = $game_map.events[@event_id].event.x
  41.     y = $game_map.events[@event_id].event.y  
  42.     Drop_Item.make_events(2,2,x-1,y,true)
  43.     或
  44.     x = $game_map.events[@event_id].x
  45.     y = $game_map.events[@event_id].y  
  46.     Drop_Item.make_events(2,2,x-1,y,true)

  47. 四:備註:
  48.     此腳本用法十分靈活,種植、建設、捨棄、掉寶等功能都可用以達成。

  49. =end
  50. #==============================================================================


  51. module Drop_Item

  52.   def self.make_events(map_id,event_id,tmap_id,item_x,item_y,save=false)
  53.       return unless self.is_map?
  54.       map = self.map_data_load(map_id)
  55.       temp = Marshal.load(Marshal.dump(map))
  56.       if !$game_system.map_events_number
  57.          $game_system.map_events_number = {}
  58.       end
  59.       sum = $game_system.map_events_number
  60.       $drop_item_target_map_id = tmap_id
  61.       m_id = $drop_item_target_map_id
  62.       sum[m_id] == nil ? sum[m_id] = 2000 : sum[m_id] += 1
  63.       new_event_id = sum[m_id]
  64.       temp.events[event_id].id = new_event_id
  65.       temp.events[event_id].x,temp.events[event_id].y = item_x,item_y
  66.       $game_map.events[new_event_id] = Game_Event.new(m_id,temp.events[event_id])
  67.       if save
  68.          now_map = self.map_data_load(m_id)
  69.          now_map.events[new_event_id] = temp.events[event_id]
  70.          self.map_data_save(m_id,now_map)
  71.       end
  72.       $game_map.events.delete(new_event_id)
  73.       refresh_map
  74.   end

  75.   def self.map_data_init
  76.       for i in 1..999
  77.          begin
  78.            map = load_data(sprintf("Data/Map%03d.rxdata", i))
  79.          rescue Errno::ENOENT
  80.            next
  81.          end
  82.          $game_system.map_data[i] = Marshal.load(Marshal.dump(map))
  83.       end
  84.   end

  85.   def self.map_data_save(map_id,event)
  86.       $game_system.map_data[$drop_item_target_map_id] = event
  87.   end

  88.   def self.map_data_load(map_id)
  89.       if !$game_system.map_data
  90.          $game_system.map_data = {}
  91.          self.map_data_init
  92.       end
  93.       return $game_system.map_data[map_id]
  94.   end

  95.   def self.delete_events(event_id)
  96.       return unless self.is_map?
  97.       $game_map.events.delete(event_id)
  98.       self.refresh_map
  99.   end

  100.   def self.refresh_map
  101.       return unless self.is_map?
  102.       $scene.spriteset.dispose
  103.       $scene.spriteset = Spriteset_Map.new
  104.   end

  105.   def self.is_map?
  106.       (return true) if $scene.is_a?(Scene_Map)
  107.       return false
  108.   end

  109. end

  110. class Game_Map

  111.   def setup(map_id)
  112.       @map_id = map_id
  113.       #@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  114.       @map = Drop_Item.map_data_load(@map_id)
  115.       tileset = $data_tilesets[@map.tileset_id]
  116.       @tileset_name = tileset.tileset_name
  117.       @autotile_names = tileset.autotile_names
  118.       @panorama_name = tileset.panorama_name
  119.       @panorama_hue = tileset.panorama_hue
  120.       @fog_name = tileset.fog_name
  121.       @fog_hue = tileset.fog_hue
  122.       @fog_opacity = tileset.fog_opacity
  123.       @fog_blend_type = tileset.fog_blend_type
  124.       @fog_zoom = tileset.fog_zoom
  125.       @fog_sx = tileset.fog_sx
  126.       @fog_sy = tileset.fog_sy
  127.       @battleback_name = tileset.battleback_name
  128.       @passages = tileset.passages
  129.       @priorities = tileset.priorities
  130.       @terrain_tags = tileset.terrain_tags
  131.       @display_x = 0
  132.       @display_y = 0
  133.       @need_refresh = false
  134.       @events = {}
  135.       for i in @map.events.keys
  136.         @events[i] = Game_Event.new(@map_id, @map.events[i])
  137.       end
  138.       @common_events = {}
  139.       for i in 1...$data_common_events.size
  140.         @common_events[i] = Game_CommonEvent.new(i)
  141.       end
  142.       @fog_ox = 0
  143.       @fog_oy = 0
  144.       @fog_tone = Tone.new(0, 0, 0, 0)
  145.       @fog_tone_target = Tone.new(0, 0, 0, 0)
  146.       @fog_tone_duration = 0
  147.       @fog_opacity_duration = 0
  148.       @fog_opacity_target = 0
  149.       @scroll_direction = 2
  150.       @scroll_rest = 0
  151.       @scroll_speed = 4
  152.   end

  153. end

  154. class Interpreter

  155.   def command_end
  156.       @list = nil
  157.       if @main and @event_id > 0
  158.          if $game_map.events[@event_id].event.name[/delete/].nil?
  159.             $game_map.events[@event_id].unlock
  160.          else
  161.             if $scene.is_a?(Scene_Map)
  162.                Drop_Item.delete_events(@event_id)
  163.                now_map = Drop_Item.map_data_load($drop_item_target_map_id)
  164.                now_map.events.delete(@event_id)
  165.                Drop_Item.map_data_save($drop_item_target_map_id,now_map)
  166.             end
  167.          end
  168.       end
  169.   end

  170. end

  171. class Game_System

  172.   attr_accessor :map_events_number
  173.   attr_accessor :map_data

  174. end

  175. class Scene_Map

  176.   attr_accessor :spriteset

  177. end
  178. #=end
复制代码
���

点评

等一下,我好像发现一些问题了……  发表于 2012-5-17 12:49
调用方法好像弄错了…… Drop_Item::make_events(2,2,x-1,y,true)  发表于 2012-5-17 12:47
tmap_id請填要製作事件的地圖ID  发表于 2012-5-16 19:16
嗯恩 調用方法是Drop_Item.make_events(map_id,event_id,tmap_id,item_x,item_y,true)  发表于 2012-5-16 19:16
哦,我回来先再看吧,我准备去晚自习了……  发表于 2012-5-16 19:11
回复

使用道具 举报

Lv3.寻梦者

双子人

梦石
0
星屑
3190
在线时间
3618 小时
注册时间
2009-4-4
帖子
4154

开拓者

7
发表于 2012-5-17 13:01:09 | 只看该作者
本帖最后由 hys111111 于 2012-5-17 13:01 编辑
sai90306 发表于 2012-5-16 19:10
我內個...用很蠢的方法好像做出效果了...hys大要不要試試看效果@@?
主要加了一個tmap_id的輸入值
效果是 ...


80行不需要删除,避免出现两个重复的事件。
另外,这个脚本我看不出其他问题了……

点评

一直問你奇怪的問題 謝謝了!  发表于 2012-5-17 16:05

评分

参与人数 1星屑 +500 收起 理由
lsu666666 + 500

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-30 10:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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