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

Project1

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

[已经解决] 事件行走图触发改变后离开地图怎么保持?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
190
在线时间
11 小时
注册时间
2020-6-21
帖子
19
跳转到指定楼层
1
发表于 2022-6-16 09:53:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
怎么又是我.jpg
大概想要如下效果:
事件原本为空白,在主角与该地点互动后放上去一个什么东西,随后事件变成这个东西的样子。即使主角离开去别的地图以后,回到这里仍是改变后的样子。
现在的问题是只要主角离开这个地图,回来以后这个东西就消失了。

打包游戏内情况:
装修小游戏,和NPC对话可领取“魔导书”或者“吊椅”。玩家可以且只可以在装修的这张地图使用这个家具,使用后自身行走图会变成这个家具 ,获得状态搬运家具中,搬运中的玩家不可离开这个地图。随后玩家到达想要放置家具的位置按下回车(目前是整个NPC以左的区域都可以放置。放进正式游戏的时候房间不会这么大),地点上原本空白的位置会变成该家具,人物变回原来的样子后退一步,算是放好了。
现在的问题是,只要我离开房间再回来,之前放置的家具就全部都无了,有没有什么办法保留下来呢?

装修系统试做.rar

235.67 KB, 下载次数: 20

Lv5.捕梦者

梦石
24
星屑
7017
在线时间
247 小时
注册时间
2020-12-4
帖子
306

极短24获奖极短23获奖极短22获奖

2
发表于 2022-6-16 10:33:02 | 只看该作者
本帖最后由 纯属小虫 于 2022-6-16 19:39 编辑

1.首先,根据RXP描绘地图的逻辑,想要刷新地图后,这个物品还在这个地图上,那么这个地图上就应该要有对应物品的事件;可以把它藏在看不见的地方,但一定要有!
2.其次,事件坐标的数据是临时数据,每次进入地图之后,或者是重开游戏之后,脚本会重新读取$data_map(这个数据是不会储存在存档里的,存档里的是$game_map,但是$game_map里没有记录事件的位置),因此,事件的位置都会回到最初点
3.想要让事件位置保留,用事件的方式可以如下:
       当确定了家具摆放的位置,按下确定键之后
       设置事件位置——与主角的位置相同
       开关操作:A事件(家具)已经放置 = ON
       变量操作:变量记录A事件坐标1 = A事件的x坐标
                       变量记录A事件坐标2 = A事件的y坐标
      
       然后这个地图里设置一个自动执行的事件

       if 开关(A事件已经放置)打开
             设置事件位置(A的X坐标=变量记录A事件坐标1,A的Y坐标=变量记录A事件坐标2)
      if 开关(B事件已经放置)打开
             设置事件位置
      ......依次
       暂时消除事件

4.其次,根据楼主的范例,建议不要把同一个用于放置家具事件复制那么多,因为这样的话如果修改起来非常麻烦
       建议做一个并行处理的事件
       if 按下空格
           if 主角的x坐标  —— 在 某某 范围
                if 主角的y坐标 —— 在 某某 范围            这两句应该可以直接用条件分支的脚本::if $game_player.x >= *****   and $game_player.y >=...
                     然后执行放家具的主事件

5.最后总结: 这样做的话,可以保证重新进入这个地图后,已经放置的家具会被定为到之前定好的位置上了
                   但是,没法解决重新进入游戏,地图数据重新读取的问题————因为这个时候,自动执行的事件已经被清除了,暂时清除事件不是临时变量,是会被记录在存档里的... 所以重新进入游戏还是会归位
                   如此一来,如果要解决重新进入游戏,家具还能保持原位,就只能从脚本里下手了~~

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
190
在线时间
11 小时
注册时间
2020-6-21
帖子
19
3
 楼主| 发表于 2022-6-16 10:53:44 | 只看该作者
纯属小虫 发表于 2022-6-16 10:33
1.首先,根据RXP描绘地图的逻辑,想要刷新地图后,这个物品还在这个地图上,那么这个地图上就应该要有对应 ...

是要从game_map里面更改吗?要怎么修改呢?

点评

如果脚本不熟练的话,建议直接用编号4的方法~ $game_map里是不储存事件坐标的,所以存档里也没有 另外,让小屋内禁止存档,可以避免重进游戏时刷新   发表于 2022-6-16 19:43
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4476
在线时间
380 小时
注册时间
2012-11-8
帖子
272
4
发表于 2022-6-16 13:54:37 | 只看该作者
用变量记录坐标,如果有多个地图,还要记录地图ID,修改game_map里设置地图事件部分
判断地图ID坐标是否有效,有效则新增事件
https://rpg.blue/thread-327759-1-2.html
这个是我复刻的一个游戏,里面也有类似的不过更简单的家具操作,你可以参考下。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

5
发表于 2022-6-16 15:58:05 | 只看该作者
2L说的非常正确,有个远古脚本,你可以看看它是怎么实现的:https://rpg.blue/thread-50278-1-1.html(我没看)

我做的时候会倾向于不使用事件,而是直接改图块,也就是$game_map.data,参见:https://rpg.blue/thread-481717-1-1.html,项目里的scripts/gxm_decoration.rb 写法就是在 setup 后调用了 Decoration.decorate! 方法修改 $game_map.data 实现每次进小房子装饰都不一样。你要做的就是在记下当前地图要怎么修改,可以放到全局变量里,或者定义一个数据结构,然后在 setup 之后更改 $game_map 的 events 或者 data 信息
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
6
发表于 2022-6-18 12:26:26 | 只看该作者
本帖最后由 RPGzh500223 于 2022-6-18 12:33 编辑

无论事件还是直接画地图,都很麻烦……
我顺着你的思路,简化了下,还是事件铺地,简化了状态,统一了对事件的设置

相关设置,脚本注释以及图片所示

单就标题的问题的话,可以在下面的脚本中搜索 “$game_self_switches.data[0x10000”,希望能帮到你

RUBY 代码复制
  1. module Furniture_Config
  2.  
  3.   MAP_ID = 1
  4.  
  5.   #编辑器状态中相关设置,只设置2个状态,如下所示
  6.   ADD_StateID = 18 #搬运中
  7.   SUB_StateID = 21 #移除家具
  8.  
  9.   #编辑器物品中家具的设置,另设置公共事件ID为Common_EventID 即可
  10.   #基本设置自定(名称,说明,图标……),但不能设为“有效使用物品”
  11.   Common_EventID = 4
  12.  
  13.   # 物品ID =>  "Graphics/Characters/"文件夹下的 文件名
  14.   ItemID_map_GraphicName = {
  15.     35 => "魔导书",
  16.     36 => "森林吊椅"
  17.     #其余依次添加即可  37 => "地毯",与编辑器中数据保持同步  
  18.   }
  19. end
  20.  
  21. class Game_Temp
  22.   attr_accessor :furniture_data
  23. end
  24.  
  25. class Game_SelfSwitches
  26.   attr_reader :data
  27. end
  28.  
  29. class Game_Event < Game_Character
  30.   alias ori_initialize initialize
  31.   def initialize(map_id, event)
  32.     ori_initialize(map_id, event)
  33.  
  34.     if map_id == Furniture_Config::MAP_ID
  35.       if $game_self_switches.data[0x10000 | event.id] != nil
  36.         @character_name = $game_self_switches.data[0x10000 | event.id]
  37.         @character_hue = 0
  38.       end
  39.     end
  40.   end
  41.  
  42.   def graphic_set(graphic_name, graphic_hue, direction = nil, pattern = nil)
  43.     @character_name = graphic_name
  44.     @character_hue = graphic_hue
  45.     @direction = direction if direction != nil
  46.     @pattern = pattern if pattern != nil
  47.   end
  48. end
  49.  
  50. class Game_Player < Game_Character
  51.   def store_graphic_data(new_character_name, new_character_hue)
  52.     @last_character_name = @character_name
  53.     @last_character_hue = @charcter_hue
  54.  
  55.     @character_name = new_character_name
  56.     @character_hue = new_character_hue
  57.   end
  58.  
  59.   def restore_graphic
  60.     if @last_character_name != nil
  61.       @character_name = @last_character_name
  62.       @last_character_name = nil
  63.     end
  64.  
  65.     if @last_charcter_hue != nil
  66.       @character_hue = @last_charcter_hue
  67.       @last_charcter_hue = nil
  68.     end
  69.   end
  70. end
  71.  
  72. class Scene_Item
  73.   def update_item
  74.     if Input.trigger?(Input::B)
  75.       $game_system.se_play($data_system.cancel_se)
  76.       $scene = Scene_Menu.new(0)
  77.       return
  78.     end   
  79.     if Input.trigger?(Input::C)
  80.       @item = @item_window.item
  81.       unless @item.is_a?(RPG::Item)
  82.         $game_system.se_play($data_system.buzzer_se)
  83.         return
  84.       end
  85.       unless $game_party.item_can_use?(@item.id)
  86.         $game_system.se_play($data_system.buzzer_se)
  87.         return
  88.       end
  89.       $game_system.se_play($data_system.decision_se)
  90.       if @item.scope >= 3
  91.         @item_window.active = false
  92.         @target_window.x = (@item_window.index + 1) % 2 * 304
  93.         @target_window.visible = true
  94.         @target_window.active = true
  95.         if @item.scope == 4 || @item.scope == 6
  96.           @target_window.index = -1
  97.         else
  98.           @target_window.index = 0
  99.         end
  100.       else
  101.  
  102.         #————————————————————
  103.         # 其余为RMXP原脚本
  104.         if @item.common_event_id == Furniture_Config::Common_EventID
  105.           actor = $game_party.actors[0]
  106.           if actor.states.include?(Furniture_Config::ADD_StateID) == true
  107.             $game_system.se_play($data_system.cancel_se)
  108.             return
  109.           else
  110.             if $game_map.map_id == Furniture_Config::MAP_ID
  111.               $game_temp.furniture_data = @item.id
  112.             else
  113.               $game_temp.message_proc = Proc.new { @message_waiting = false }
  114.               $game_temp.message_text = "此处不能使用家具。"
  115.               $scene = Scene_Map.new
  116.               return
  117.             end
  118.           end
  119.         end
  120.         #————————————————————
  121.  
  122.         if @item.common_event_id > 0
  123.           $game_temp.common_event_id = @item.common_event_id
  124.           $game_system.se_play(@item.menu_se)
  125.           if @item.consumable
  126.             $game_party.lose_item(@item.id, 1)
  127.             @item_window.draw_item(@item_window.index)
  128.           end
  129.           $scene = Scene_Map.new
  130.           return
  131.         end
  132.       end
  133.       return
  134.     end
  135.   end
  136. end
  137.  
  138.  
  139. class Interpreter
  140.   def furniture_turn_command
  141.     return unless $game_map.map_id == Furniture_Config::MAP_ID
  142.     effective = false
  143.  
  144.     if $game_party.actors[0].states.include?(Furniture_Config::SUB_StateID)
  145.       $game_temp.message_text = "是否移除次家具?\n\n\n"
  146.       effective = true
  147.       $game_temp.choice_proc = Proc.new do |n|
  148.         if n == 0
  149.           $game_map.events[@event_id].graphic_set("", 0)
  150.           $game_self_switches.data.delete(0x10000 | @event_id)
  151.           $game_party.actors[0].remove_state(Furniture_Config::SUB_StateID)
  152.         end
  153.       end
  154.  
  155.     elsif $game_party.actors[0].states.include?(Furniture_Config::ADD_StateID)
  156.  
  157.       $game_temp.message_text = "是否将家具放置在这里?\n\n\n"
  158.       effective = true
  159.       $game_temp.choice_proc = Proc.new do |n|
  160.         if n == 0
  161.           return if $game_temp.furniture_data == nil
  162.           graphic_name = $game_player.character_name
  163.  
  164.           $game_map.events[@event_id].graphic_set(graphic_name, 0, 2, 0)
  165.           $game_self_switches.data[0x10000 | @event_id] = graphic_name
  166.           @wait_count = 2
  167.  
  168.           $game_player.restore_graphic
  169.           $game_player.move_backward
  170.  
  171.           $game_party.actors[0].remove_state(Furniture_Config::ADD_StateID)
  172.  
  173.           $game_temp.furniture_data = nil
  174.         end
  175.       end
  176.     end
  177.  
  178.     if effective == true
  179.       @message_waiting = true
  180.       $game_temp.message_proc = Proc.new { @message_waiting = false }
  181.       $game_temp.choice_start = 1
  182.       $game_temp.choice_max = 2
  183.       $game_temp.choice_cancel_type = 0
  184.     end
  185.   end
  186.  
  187.   def furniture_use_command   
  188.     return if $game_temp.furniture_data == nil
  189.     $game_party.actors[0].add_state(Furniture_Config::ADD_StateID)
  190.     $game_player.store_graphic_data(
  191.       Furniture_Config::ItemID_map_GraphicName[$game_temp.furniture_data], 0)
  192.   end
  193. end


temp.jpg (102.72 KB, 下载次数: 0)

事件与公共事件的设置

事件与公共事件的设置

评分

参与人数 2星屑 +150 +2 收起 理由
RyanBern + 150 + 1 认可答案
纯属小虫 + 1 强大

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
7
发表于 2022-6-23 12:09:56 | 只看该作者
本帖最后由 RPGzh500223 于 2022-6-23 12:12 编辑

设置事件也挺麻烦,改为“伪事件”,顺带修复些小BUG。

RUBY 代码复制
  1. class << FileTest
  2.   # FileTest.exist? 无法判断含中文的文件路径……
  3.   def exist_ex?(filename)
  4.     return true if self.exist?(filename)
  5.     begin
  6.       IO.read(filename, 0)
  7.       return true
  8.     rescue
  9.       return false
  10.     end
  11.   end
  12. end
  13.  
  14.  
  15. module Key
  16.   # 主键盘的字母与数字键值的定义
  17.   10.times {|i| const_set("Num#{i}", 48 + i) }
  18.   65.upto(90) {|i| const_set(i.chr, i) }
  19.  
  20.   GetAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'I', 'I')
  21.  
  22.   def self.trigger?(nVK)
  23.     return GetAsyncKeyState.call(nVK) == -32767
  24.   end
  25. end
  26.  
  27.  
  28. module Furniture
  29.  
  30.   MAP_ID = 1
  31.  
  32.   ADD_StateID = 29 #搬运家具
  33.   SUB_StateID = 30 #移除家具
  34.  
  35.   Map_Key = Key::F
  36.  
  37.   # 设置个名字的空公共事件
  38.   Common_EventID = 10
  39.  
  40.   ItemID_map_GraphicName = {
  41.     38 => "$10_森林吊椅",
  42.     39 => "魔导书",
  43.     40 => "森林吊椅"
  44.   }
  45.  
  46.   Log_Name = "furniture_config_log.txt"  # 避免转码,英文文件名
  47.  
  48.   # 是否检查 ItemID_map_GraphicName
  49.   Check_Settings = true
  50.  
  51.   if Check_Settings == true
  52.     err = false
  53.  
  54.     log = File.open(Log_Name, "w+")
  55.     log.write("Furniture::ItemID_map_GraphicName检查:\n")
  56.     time = Time.new.strftime("%Y/%m/%d--%H:%M:%S")
  57.     log.write("  #{time}\n")
  58.  
  59.     path = "Graphics/Characters/"
  60.     items = load_data("Data/Items.rxdata")
  61.     ItemID_map_GraphicName.each do |id, name|
  62.       if items[id].common_event_id != Common_EventID
  63.         err = true
  64.         log.write("  【#{id}:#{items[id].name}】 非家具物品\n")
  65.       else
  66.         filename = "#{path}#{name}.png"
  67.         unless FileTest.exist_ex?(filename)
  68.           err = true
  69.           log.write("  【#{id}:#{items[id].name}】对应图形文件(\"#{filename}\")不存在\n")
  70.         end
  71.       end
  72.     end
  73.  
  74.     if err == true
  75.       log.close
  76.       system("start #{Log_Name}")
  77.     else
  78.       log.write("  家具物品对应图形文件设置正常。\n")
  79.       log.close
  80.     end
  81.   end
  82.  
  83.   module_function
  84.   def carrying?
  85.     return $game_party.actors[0].state?(ADD_StateID)
  86.   end
  87.  
  88.   def to_carry
  89.     $game_party.actors[0].add_state(ADD_StateID)
  90.   end
  91.  
  92.   def carryed
  93.     $game_party.actors[0].remove_state(ADD_StateID)
  94.   end
  95.  
  96.   def removing?
  97.     return $game_party.actors[0].state?(SUB_StateID)
  98.   end
  99.  
  100.   def to_remove
  101.     $game_party.actors[0].add_state(SUB_StateID)
  102.   end
  103.  
  104.   def removed
  105.     $game_party.actors[0].remove_state(SUB_StateID)
  106.   end
  107.  
  108.   def event_trigger?
  109.     return Key.trigger?(Map_Key)
  110.   end
  111. end
  112.  
  113.  
  114. class Game_SelfSwitches
  115.   attr_reader :data
  116. end
  117.  
  118.  
  119. class Game_Player < Game_Character
  120.  
  121.   attr_accessor :furniture_data
  122.  
  123.   def store_graphic_data(new_character_name, new_character_hue)
  124.     @last_character_name = @character_name
  125.     @last_character_hue = @charcter_hue
  126.  
  127.     @character_name = new_character_name
  128.     @character_hue = new_character_hue
  129.   end
  130.  
  131.   def restore_graphic
  132.     if @last_character_name != nil
  133.       @character_name = @last_character_name
  134.       @last_character_name = nil
  135.     end
  136.  
  137.     if @last_charcter_hue != nil
  138.       @character_hue = @last_charcter_hue
  139.       @last_charcter_hue = nil
  140.     end
  141.   end
  142. end
  143.  
  144.  
  145. class Scene_Item
  146.   def update_item
  147.     if Input.trigger?(Input::B)
  148.       $game_system.se_play($data_system.cancel_se)
  149.       $scene = Scene_Menu.new(0)
  150.       return
  151.     end   
  152.     if Input.trigger?(Input::C)
  153.       @item = @item_window.item
  154.       unless @item.is_a?(RPG::Item)
  155.         $game_system.se_play($data_system.buzzer_se)
  156.         return
  157.       end
  158.  
  159.  
  160.       #————————————————————
  161.       if @item.common_event_id == Furniture::Common_EventID
  162.         if Furniture.carrying?
  163.           $game_system.se_play($data_system.cancel_se)
  164.  
  165.         else
  166.           if $game_map.map_id == Furniture::MAP_ID
  167.             $game_system.se_play(@item.menu_se)
  168.  
  169.             if @item.consumable
  170.               $game_party.lose_item(@item.id, 1)
  171.               @item_window.draw_item(@item_window.index)
  172.             end
  173.  
  174.             $game_player.furniture_data = @item.id
  175.             Furniture.to_carry
  176.             $game_player.store_graphic_data(
  177.               Furniture::ItemID_map_GraphicName[@item.id], 0)
  178.  
  179.           else
  180.             $game_system.se_play($data_system.cancel_se)  
  181.             $game_temp.message_proc = Proc.new { @message_waiting = false }
  182.             $game_temp.message_text = "此处不能使用家具。"
  183.           end
  184.  
  185.           $scene = Scene_Map.new
  186.         end
  187.         return
  188.       end
  189.       #————————————————————
  190.  
  191.  
  192.       unless $game_party.item_can_use?(@item.id)
  193.         $game_system.se_play($data_system.buzzer_se)
  194.         return
  195.       end
  196.       $game_system.se_play($data_system.decision_se)
  197.       if @item.scope >= 3
  198.         @item_window.active = false
  199.         @target_window.x = (@item_window.index + 1) % 2 * 304
  200.         @target_window.visible = true
  201.         @target_window.active = true
  202.         if @item.scope == 4 || @item.scope == 6
  203.           @target_window.index = -1
  204.         else
  205.           @target_window.index = 0
  206.         end
  207.       else
  208.         if @item.common_event_id > 0
  209.           $game_temp.common_event_id = @item.common_event_id
  210.           $game_system.se_play(@item.menu_se)
  211.           if @item.consumable
  212.             $game_party.lose_item(@item.id, 1)
  213.             @item_window.draw_item(@item_window.index)
  214.           end
  215.           $scene = Scene_Map.new
  216.           return
  217.         end
  218.       end
  219.       return
  220.     end
  221.   end
  222. end
  223.  
  224.  
  225.  
  226. class Sprite_Furniture < Sprite
  227.  
  228.   # 图形是否“停止时动画”,以Graphic.frame_count为单位
  229.   # "$0_魔导书" 或 "魔导书"  =>  无动画
  230.   # "$10_魔导书"             =>  有动画
  231.   Anime_Reg = /^\$(\d+)_/   
  232.  
  233.   attr_reader :anime_count
  234.  
  235.   def initialize(viewport, map_x, map_y, direction, pattern, hue, filename)
  236.     super(viewport)
  237.     self.graphic_set(direction, pattern, hue, filename)
  238.     @real_x, @real_y = map_x * 128, map_y * 128
  239.   end
  240.  
  241.   def graphic_set(direction, pattern, hue, filename)
  242.     self.bitmap = RPG::Cache.character(filename, hue)
  243.     w, h = self.bitmap.width / 4, self.bitmap.height / 4
  244.     self.src_rect.set(pattern * w, (direction / 2 - 1) * h, w, h)
  245.     self.ox, self.oy = w / 2, h
  246.     @real_z = h > 32 ? 31 : 0
  247.  
  248.     if (Anime_Reg =~ filename) != nil
  249.       @anime_count = $1.to_i
  250.     else
  251.       @anime_count = 0
  252.     end
  253.   end
  254.  
  255.   def update_self
  256.     self.x = (@real_x - $game_map.display_x + 3) / 4 + 16
  257.     self.y = (@real_y - $game_map.display_y + 3) / 4 + 32
  258.     self.z = self.y + @real_z
  259.  
  260.     if @anime_count > 0
  261.       if Graphics.frame_count % @anime_count == 0
  262.         self.src_rect.x =
  263.           (self.src_rect.x + self.src_rect.width) % (self.src_rect.width * 4)
  264.       end
  265.     end
  266.   end
  267.  
  268. end
  269.  
  270.  
  271. class Spriteset_Map
  272.   #--------------------------------------------------------------------------
  273.   # ● 初始化对像
  274.   #--------------------------------------------------------------------------
  275.   def initialize
  276.     # 生成显示端口
  277.     @viewport1 = Viewport.new(0, 0, 640, 480)
  278.     @viewport2 = Viewport.new(0, 0, 640, 480)
  279.     @viewport3 = Viewport.new(0, 0, 640, 480)
  280.     @viewport2.z = 200
  281.     @viewport3.z = 5000
  282.     # 生成元件地图
  283.     @tilemap = Tilemap.new(@viewport1)
  284.     @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  285.     for i in 0..6
  286.       autotile_name = $game_map.autotile_names[i]
  287.       @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  288.     end
  289.     @tilemap.map_data = $game_map.data
  290.     @tilemap.priorities = $game_map.priorities
  291.     # 生成远景平面
  292.     @panorama = Plane.new(@viewport1)
  293.     @panorama.z = -1000
  294.     # 生成雾平面
  295.     @fog = Plane.new(@viewport1)
  296.     @fog.z = 3000
  297.     # 生成角色活动块
  298.     @character_sprites = []
  299.     for i in $game_map.events.keys.sort
  300.       sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  301.       @character_sprites.push(sprite)
  302.     end
  303.     @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  304.     # 生成天气
  305.     @weather = RPG::Weather.new(@viewport1)
  306.     # 生成图片
  307.     @picture_sprites = []
  308.     for i in 1..50
  309.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  310.         $game_screen.pictures[i]))
  311.     end
  312.     # 生成计时器块
  313.     @timer_sprite = Sprite_Timer.new
  314.  
  315.     #————————————————————
  316.     if $game_map.map_id == Furniture::MAP_ID
  317.       @data = ($game_self_switches.data[$game_map.map_id] ||= {})
  318.       @furniture_sprites = {}
  319.  
  320.       @data.each do |k, v|
  321.         @furniture_sprites[k & 0x3FFF] = Sprite_Furniture.new(@viewport1,
  322.           (k >> 9) & 0x1FF, k & 0x1FF, *v.unpack('C3A*'))
  323.       end
  324.     end
  325.     #————————————————————
  326.  
  327.     # 刷新画面
  328.     update
  329.   end
  330.  
  331.  
  332.   def add_furniture(dir, pattern, hue, name)
  333.     key = $game_player.x << 9 | $game_player.y
  334.     sprite = @furniture_sprites[key]
  335.     if sprite != nil
  336.       sprite.graphic_set(dir, pattern, hue, name)
  337.     else
  338.       @furniture_sprites[key] = Sprite_Furniture.new(@viewport1,
  339.         $game_player.x, $game_player.y, dir, pattern, hue, name)
  340.     end
  341.  
  342.     @data[key | $game_map.map_id<<18] = [dir, pattern, hue, name].pack('C3A*')
  343.   end
  344.  
  345.   def sub_furniture
  346.     key = $game_player.x << 9 | $game_player.y
  347.     @data.delete(key | $game_map.map_id << 18)
  348.     @furniture_sprites[key].dispose
  349.     @furniture_sprites.delete(key)
  350.   end
  351.  
  352.   def update_furniture
  353.     if Furniture.event_trigger?
  354.  
  355.       key = $game_map.map_id << 18 | $game_player.x << 9 | $game_player.y
  356.  
  357.       if Furniture.removing?
  358.         return unless @data.key?(key)
  359.  
  360.         $game_temp.message_text = "是否移除次家具?\n\n\n"
  361.         effective = true
  362.         $game_temp.choice_proc = Proc.new do |n|
  363.           if n == 0
  364.             self.sub_furniture
  365.             Furniture.removed
  366.           end
  367.         end
  368.  
  369.       elsif Furniture.carrying?
  370.  
  371.         return if $game_player.furniture_data == nil
  372.  
  373.         $game_temp.message_text = "是否将家具放置在这里?\n\n\n"
  374.         effective = true
  375.  
  376.         $game_temp.choice_proc = Proc.new do |n|
  377.           if n == 0
  378.             self.add_furniture(2, 0, 0, $game_player.character_name)
  379.  
  380.             $game_player.restore_graphic
  381.             $game_player.move_backward
  382.             Furniture.carryed
  383.             $game_player.furniture_data = nil
  384.           end
  385.         end
  386.  
  387.       end
  388.  
  389.       if effective == true
  390.         $game_temp.message_proc = Proc.new { @message_waiting = false }
  391.         $game_temp.choice_start = 1
  392.         $game_temp.choice_max = 2
  393.         $game_temp.choice_cancel_type = 0
  394.       end
  395.     end
  396.  
  397.     @furniture_sprites.each{|k, sprite| sprite.update_self }
  398.   end
  399.  
  400.   #--------------------------------------------------------------------------
  401.   # ● 刷新画面
  402.   #--------------------------------------------------------------------------
  403.   def update
  404.     # 远景与现在的情况有差异发生的情况下
  405.     if @panorama_name != $game_map.panorama_name or
  406.        @panorama_hue != $game_map.panorama_hue
  407.       @panorama_name = $game_map.panorama_name
  408.       @panorama_hue = $game_map.panorama_hue
  409.       if @panorama.bitmap != nil
  410.         @panorama.bitmap.dispose
  411.         @panorama.bitmap = nil
  412.       end
  413.       if @panorama_name != ""
  414.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  415.       end
  416.       Graphics.frame_reset
  417.     end
  418.     # 雾与现在的情况有差异的情况下
  419.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  420.       @fog_name = $game_map.fog_name
  421.       @fog_hue = $game_map.fog_hue
  422.       if @fog.bitmap != nil
  423.         @fog.bitmap.dispose
  424.         @fog.bitmap = nil
  425.       end
  426.       if @fog_name != ""
  427.         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  428.       end
  429.       Graphics.frame_reset
  430.     end
  431.     # 刷新元件地图
  432.     @tilemap.ox = $game_map.display_x / 4
  433.     @tilemap.oy = $game_map.display_y / 4
  434.     @tilemap.update
  435.     # 刷新远景平面
  436.     @panorama.ox = $game_map.display_x / 8
  437.     @panorama.oy = $game_map.display_y / 8
  438.     # 刷新雾平面
  439.     @fog.zoom_x = $game_map.fog_zoom / 100.0
  440.     @fog.zoom_y = $game_map.fog_zoom / 100.0
  441.     @fog.opacity = $game_map.fog_opacity
  442.     @fog.blend_type = $game_map.fog_blend_type
  443.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  444.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  445.     @fog.tone = $game_map.fog_tone
  446.     # 刷新角色活动块
  447.     for sprite in @character_sprites
  448.       sprite.update
  449.     end
  450.  
  451.     #————————————————————
  452.     self.update_furniture if $game_map.map_id == Furniture::MAP_ID
  453.     #————————————————————
  454.  
  455.     # 刷新天候图形
  456.     @weather.type = $game_screen.weather_type
  457.     @weather.max = $game_screen.weather_max
  458.     @weather.ox = $game_map.display_x / 4
  459.     @weather.oy = $game_map.display_y / 4
  460.     @weather.update
  461.     # 刷新图片
  462.     for sprite in @picture_sprites
  463.       sprite.update
  464.     end
  465.     # 刷新计时器块
  466.     @timer_sprite.update
  467.     # 设置画面的色调与震动位置
  468.     @viewport1.tone = $game_screen.tone
  469.     @viewport1.ox = $game_screen.shake
  470.     # 设置画面的闪烁色
  471.     @viewport3.color = $game_screen.flash_color
  472.     # 刷新显示端口
  473.     @viewport1.update
  474.     @viewport3.update
  475.   end
  476. end

家园(伪事件).zip

234.39 KB, 下载次数: 4

工程

评分

参与人数 1+1 收起 理由
taeckle + 1 大神威武!

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-26 11:00

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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