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

Project1

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

[已经过期] 事件的穿透性變得奇奇怪怪的

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
510 小时
注册时间
2010-5-8
帖子
266
跳转到指定楼层
1
发表于 2012-3-24 21:57:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因為在[慕色輪回.光影的彼岸] copy過來的遮罩及光影效果,改了以下腳本
Spriteset_Map
<code>
  1. #==============================================================================
  2. # ■ Spriteset_Map
  3. #------------------------------------------------------------------------------
  4. #  处理地图画面活动块和元件的类。本类在
  5. # Scene_Map 类的内部使用。
  6. #==============================================================================

  7. class Spriteset_Map
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     # 生成显示端口
  13.     @viewport1 = Viewport.new(0, 0, 640, 480)
  14.     @viewport2 = Viewport.new(0, 0, 640, 480)
  15.     @viewport3 = Viewport.new(0, 0, 640, 480)
  16.     @viewport2.z = 200
  17.     @viewport3.z = 5000
  18.     # 生成元件地图
  19.     @tilemap = Tilemap.new(@viewport1)
  20.     @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  21.     for i in 0..6
  22.       autotile_name = $game_map.autotile_names[i]
  23.       @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  24.     end
  25.     @tilemap.map_data = $game_map.data
  26.     @tilemap.priorities = $game_map.priorities
  27.     # 生成远景平面
  28.     @panorama = Plane.new(@viewport1)
  29.     @panorama.z = -1000
  30.     # 生成雾平面
  31.     @fog = Plane.new(@viewport1)
  32.     @fog.z = 3000
  33.     # 生成角色活动块
  34.     @character_sprites = []
  35.    
  36.     for i in $game_map.events.keys.sort
  37.       sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  38.       @character_sprites.push(sprite)
  39.     end
  40.     @mask_sprites = []
  41.     @object_sprites = []
  42.     for i in $game_map.objects.keys.sort
  43.       sprite = Sprite_Character.new(@viewport1, $game_map.objects[i], $game_map.objects[i].name)
  44.       @object_sprites.push(sprite)
  45.       # マスクの設定
  46.       if $game_map.events[i].name[/Mask/]
  47.         for list in $game_map.objects[i].list
  48.           parameter = list.parameters[0]
  49.           if parameter != nil
  50.             if parameter[/"(\d+), (\d+), (\d+)"/]
  51.               color = Color.new($1.to_i, $2.to_i, $3.to_i)
  52.             else
  53.               # マスクスプライトの作成
  54.               sprite = Sprite.new(@viewport1)
  55.               parameter[/\((\d+), (\d+), (\d+), (\d+)\)/]
  56.               # マスクスプライトの描画座標を設定
  57.               sprite.x = $1.to_i * 32 + 16
  58.               sprite.y = $2.to_i * 32 + 16
  59.               sprite.z = 2000
  60.               # マスクスプライトのビットマップを設定
  61.               sprite.bitmap = Bitmap.new(
  62.                 ($3.to_i - $1.to_i) * 32, ($4.to_i - $2.to_i) * 32)
  63.               sprite.bitmap.fill_rect(0, 0, sprite.bitmap.width,
  64.                 sprite.bitmap.height, color)
  65.               if parameter[/<(\d+), (\d+), (\d+), (\d+)>/]
  66.                 sprite.bitmap.fill_rect($1.to_i * 32 - sprite.x + 16,
  67.                   $2.to_i * 32 - sprite.y + 16, ($3.to_i - $1.to_i) * 32,
  68.                   ($4.to_i - $2.to_i) * 32, Color.new(0, 0, 0, 0))
  69.               end
  70.               # 各マスク設定の取得
  71.               parameter[/\[(\d+), (\d+), (\d+), (\d+)\]/]
  72.               mask = [sprite, [$1.to_i, $2.to_i, $3.to_i, $4.to_i], []]
  73.               if parameter[/{(\d+), (\d+), (\d+), (\d+)}/]
  74.                 mask[2] = [$1.to_i, $2.to_i, $3.to_i, $4.to_i]
  75.               end
  76.               # 透過度の設定
  77.               if (mask[1][0]..mask[1][2]) === $game_player.x and
  78.                   (mask[1][1]..mask[1][3]) === $game_player.y and
  79.                   (mask[2].empty? or
  80.                   not ((mask[2][0]..mask[2][2]) === $game_player.x and
  81.                   (mask[2][1]..mask[2][3]) === $game_player.y))
  82.                 mask[0].opacity = 0
  83.               else
  84.                 mask[0].opacity = 255
  85.               end
  86.               # マスクスプライトセットにマスクを追加
  87.               @mask_sprites.push(mask)
  88.             end
  89.           end
  90.         end
  91.       end
  92.     end

  93.     @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  94.     # 生成天气
  95.     @weather = RPG::Weather.new(@viewport1)
  96.     @mask = Sprite.new(@viewport1)
  97.     @mask_name = $game_map.mask_name
  98.     if $game_map.mask_name != ""
  99.       @mask.blend_type = $game_map.mask_blend_type
  100.       @mask.bitmap = RPG::Cache.fog($game_map.mask_name, 0)
  101.       if $game_map.time < 10
  102.         @mask.x = $game_player.screen_x
  103.         @mask.y = $game_player.screen_y - 16
  104.       else
  105.         @mask.x = 0
  106.         @mask.y = 0
  107.       end
  108.       @mask.z = 3000
  109.       @mask.ox = @mask.bitmap.width / 2
  110.       @mask.oy = @mask.bitmap.height / 2
  111.     end
  112.     @text_picture = []
  113.     # 生成图片
  114.     @picture_sprites = []
  115.     for i in 1..50
  116.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  117.         $game_screen.pictures[i]))
  118.       end
  119.    
  120.     # 生成计时器块
  121.     @timer_sprite = Sprite_Timer.new
  122.     # 刷新画面
  123.     update
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 释放
  127.   #--------------------------------------------------------------------------
  128.   def dispose
  129.     # 释放元件地图
  130.     @tilemap.tileset.dispose
  131.     for i in 0..6
  132.       @tilemap.autotiles[i].dispose
  133.     end
  134.     @tilemap.dispose
  135.     # 释放远景平面
  136.     @panorama.dispose
  137.     # 释放雾平面
  138.     @fog.dispose
  139.     # 释放角色活动块
  140.     for sprite in @character_sprites
  141.       sprite.dispose
  142.     end
  143.     # 释放天候
  144.     @weather.dispose
  145.     # 释放图片
  146.     for sprite in @picture_sprites
  147.       sprite.dispose
  148.     end
  149.     if @mask.bitmap != nil
  150.       @mask.bitmap.dispose
  151.     end
  152.     @mask.dispose
  153.     for sprite in @text_picture.reverse
  154.       sprite.dispose
  155.       @text_picture.delete(sprite)
  156.     end
  157.     # 释放计时器块
  158.     @timer_sprite.dispose
  159.     # 释放显示端口
  160.     @viewport1.dispose
  161.     @viewport2.dispose
  162.     @viewport3.dispose

  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # ● 刷新画面
  166.   #--------------------------------------------------------------------------
  167.   def update
  168.     # 远景与现在的情况有差异发生的情况下
  169.     if @panorama_name != $game_map.panorama_name or
  170.        @panorama_hue != $game_map.panorama_hue
  171.       @panorama_name = $game_map.panorama_name
  172.       @panorama_hue = $game_map.panorama_hue
  173.       if @panorama.bitmap != nil
  174.         @panorama.bitmap.dispose
  175.         @panorama.bitmap = nil
  176.       end
  177.       if @panorama_name != ""
  178.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  179.       end
  180.       Graphics.frame_reset
  181.     end
  182.     # 雾与现在的情况有差异的情况下
  183.     if (@fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue)
  184.       @fog_name = $game_map.fog_name
  185.       @fog_hue = $game_map.fog_hue
  186.       if @fog.bitmap != nil
  187.         @fog.bitmap.dispose
  188.         @fog.bitmap = nil
  189.       end
  190.       if @fog_name != ""
  191.         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  192.       end
  193.       Graphics.frame_reset
  194.     end
  195.     # 刷新元件地图
  196.     @tilemap.ox = $game_map.display_x / 4
  197.     @tilemap.oy = $game_map.display_y / 4
  198.     @tilemap.update
  199.     for mask in @mask_sprites
  200.       mask[0].ox = $game_map.display_x / 4
  201.       mask[0].oy = $game_map.display_y / 4
  202.       # 透過度の設定
  203.       if (mask[1][0]..mask[1][2]) === $game_player.x and
  204.           (mask[1][1]..mask[1][3]) === $game_player.y and
  205.           (mask[2].empty? or
  206.           not ((mask[2][0]..mask[2][2]) === $game_player.x and
  207.           (mask[2][1]..mask[2][3]) === $game_player.y))
  208.         mask[0].opacity -= 16 if mask[0].opacity > 0
  209.       else
  210.         mask[0].opacity += 8 if mask[0].opacity < 255
  211.       end
  212.     end
  213.     # 刷新远景平面
  214.     @panorama.ox = $game_map.display_x / 8
  215.     @panorama.oy = $game_map.display_y / 8
  216.     # 刷新雾平面
  217.     @fog.zoom_x = $game_map.fog_zoom / 100.0
  218.     @fog.zoom_y = $game_map.fog_zoom / 100.0
  219.     @fog.opacity = $game_map.fog_opacity
  220.     @fog.blend_type = $game_map.fog_blend_type
  221.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  222.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  223.     @fog.tone = $game_map.fog_tone
  224.     # 刷新角色活动块
  225.     for sprite in @character_sprites
  226.       sprite.update
  227.     end
  228.     # 刷新天候图形
  229.     @weather.type = $game_screen.weather_type
  230.     @weather.max = $game_screen.weather_max
  231.     @weather.ox = $game_map.display_x / 4
  232.     @weather.oy = $game_map.display_y / 4
  233.     @weather.update
  234.     # 刷新图片
  235.     for sprite in @picture_sprites
  236.       sprite.update
  237.     end
  238.     for sprite in @text_picture.reverse
  239.       sprite.update
  240.       @text_picture.delete(sprite) if sprite.disposed?
  241.     end
  242.     # 刷新计时器块
  243.     @timer_sprite.update
  244.     # 设置画面的色调与震动位置
  245.     @viewport1.tone = $game_screen.tone
  246.     @viewport1.ox = $game_screen.shake_x
  247.     @viewport1.oy = $game_screen.shake_y
  248.     # マスクの設定
  249.     if @mask_name != $game_map.mask_name
  250.       if @mask.bitmap != nil
  251.         @mask.bitmap.dispose
  252.         @mask.bitmap = nil
  253.       end
  254.       @mask_name = $game_map.mask_name
  255.       if @mask_name != ""
  256.         @mask.bitmap = Bitmap.new("Graphics/Fogs/" + @mask_name)
  257.         @mask.blend_type = $game_map.mask_blend_type
  258.         @mask.z = 3000
  259.         @mask.ox = @mask.bitmap.width / 2
  260.         @mask.oy = @mask.bitmap.height / 2
  261.       end
  262.     end
  263.     @mask.opacity = $game_map.mask_opacity
  264.     case @mask_name
  265.     when "Mask_01"
  266.       @mask.x = $game_player.screen_x
  267.       @mask.y = $game_player.screen_y - 16
  268.     when "Mask_02"
  269.       @mask.x = $game_player.screen_x
  270.       @mask.y = $game_player.screen_y - 16
  271.     when "Mask_03"
  272.       @mask.x = @light.x
  273.       @mask.y = @light.y
  274.     when "Mask_04"
  275.       @mask.x = $game_player.screen_x
  276.       @mask.y = $game_player.screen_y - 16
  277.     when "Mask_05"
  278.       @mask.x = @light.x
  279.       @mask.y = @light.y
  280.     when "Mask_06"
  281.       @mask.x = 320
  282.       @mask.y = 240
  283.     when "Mask_07"
  284.       @mask.x = @light.x
  285.       @mask.y = @light.y
  286.     end

  287.     # 设置画面的闪烁色
  288.     @viewport3.color = $game_screen.flash_color
  289.     # 刷新显示端口
  290.     @viewport1.update
  291.     @viewport3.update
  292. #@c.update

  293.   end
  294. end
复制代码

==============================================================================
Game_Map

  1. #==============================================================================
  2. # ■ Game_Map
  3. #------------------------------------------------------------------------------
  4. #  处理地图的类。包含卷动以及可以通行的判断功能。
  5. # 本类的实例请参考 $game_map 。
  6. #==============================================================================

  7. class Game_Map
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_accessor :tileset_name             # 元件 文件名
  12.   attr_accessor :autotile_names           # 自动元件 文件名
  13.   attr_accessor :panorama_name            # 全景 文件名
  14.   attr_accessor :panorama_hue             # 全景 色相
  15.   attr_accessor :fog_name                 # 雾 文件名
  16.   attr_accessor :fog_hue                  # 雾 色相
  17.   attr_accessor :fog_opacity              # 雾 不透明度
  18.   attr_accessor :fog_blend_type           # 雾 混合方式
  19.   attr_accessor :fog_zoom                 # 雾 放大率
  20.   attr_accessor :fog_sx                   # 雾 SX
  21.   attr_accessor :fog_sy                   # 雾 SY
  22.   attr_accessor :battleback_name          # 战斗背景 文件名
  23.   attr_accessor :display_x                # 显示 X 坐标 * 128
  24.   attr_accessor :display_y                # 显示 Y 坐标 * 128
  25.   attr_accessor :need_refresh             # 刷新要求标志
  26.   attr_reader   :passages                 # 通行表
  27.   attr_reader   :priorities               # 优先表
  28.   attr_reader   :terrain_tags             # 地形标记表
  29.   attr_reader   :events                   # 事件
  30.   attr_reader   :fog_ox                   # 雾 原点 X 坐标
  31.   attr_reader   :fog_oy                   # 雾 原点 Y 坐标
  32.   attr_reader   :fog_tone                 # 雾 色调
  33.   attr_reader   :mask_name                # マスク
  34.   attr_reader   :mask_opacity             # マスク不透過度
  35.   attr_reader   :mask_blend_type          # マスクブレンドタイプ
  36.   attr_reader   :objects
  37.   #--------------------------------------------------------------------------
  38.   # ● 初始化条件
  39.   #--------------------------------------------------------------------------
  40.   def initialize
  41.     @map_id = 0
  42.     @display_x = 0
  43.     @display_y = 0
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 设置
  47.   #     map_id : 地图 ID
  48.   #--------------------------------------------------------------------------
  49.   def setup(map_id)
  50.     # 地图 ID 记录到 @map_id
  51.     @map_id = map_id
  52.     # 地图文件装载后、设置到 @map
  53.     @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  54.     # 定义实例变量设置地图元件信息
  55.     tileset = $data_tilesets[@map.tileset_id]
  56.     @tileset_name = tileset.tileset_name
  57.     @autotile_names = tileset.autotile_names
  58.     @panorama_name = tileset.panorama_name
  59.     @panorama_hue = tileset.panorama_hue
  60.     @fog_name = tileset.fog_name
  61.     @fog_hue = tileset.fog_hue
  62.     @fog_opacity = tileset.fog_opacity
  63.     @fog_blend_type = tileset.fog_blend_type
  64.     @fog_zoom = tileset.fog_zoom
  65.     @fog_sx = tileset.fog_sx
  66.     @fog_sy = tileset.fog_sy
  67.     @battleback_name = tileset.battleback_name
  68.     @passages = tileset.passages
  69.     @priorities = tileset.priorities
  70.     @terrain_tags = tileset.terrain_tags
  71.     # 初始化显示坐标
  72.     @display_x = 0
  73.     @display_y = 0
  74.     # 清除刷新要求标志
  75.     @need_refresh = false
  76.     # 设置地图事件数据
  77.     @events = {}
  78.     @objects = {}
  79.     for i in @map.events.keys
  80.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  81.       if events[i].name[/Object/] != nil
  82.           @objects[i] = @events[i]
  83.       end
  84.     end
  85.     # 设置公共事件数据
  86.     @common_events = {}
  87.     for i in 1...$data_common_events.size
  88.       @common_events[i] = Game_CommonEvent.new(i)
  89.     end
  90.     @mask_name = ""
  91.     @mask_opacity = 255
  92.     @mask_blend_type = 0
  93.     # 初始化雾的各种信息
  94.     @fog_ox = 0
  95.     @fog_oy = 0
  96.     @fog_tone = Tone.new(0, 0, 0, 0)
  97.     @fog_tone_target = Tone.new(0, 0, 0, 0)
  98.     @fog_tone_duration = 0
  99.     @fog_opacity_duration = 0
  100.     @fog_opacity_target = 0
  101.     # 初始化滚动信息
  102.     @scroll_direction = 2
  103.     @scroll_rest = 0
  104.     @scroll_speed = 4
  105.   end
  106.   #--------------------------------------------------------------------------
  107.   # ● 获取地图 ID
  108.   #--------------------------------------------------------------------------
  109.   def map_id
  110.     return @map_id
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   # ● 获取宽度
  114.   #--------------------------------------------------------------------------
  115.   def width
  116.     return @map.width
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # ● 获取高度
  120.   #--------------------------------------------------------------------------
  121.   def height
  122.     return @map.height
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 获取遇敌列表
  126.   #--------------------------------------------------------------------------
  127.   def encounter_list
  128.     return @map.encounter_list
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 获取遇敌步数
  132.   #--------------------------------------------------------------------------
  133.   def encounter_step
  134.     return @map.encounter_step
  135.   end
  136.   #--------------------------------------------------------------------------
  137.   # ● 获取地图数据
  138.   #--------------------------------------------------------------------------
  139.   def data
  140.     return @map.data
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● BGM / BGS 自动切换
  144.   #--------------------------------------------------------------------------
  145.   def autoplay
  146.     if @map.autoplay_bgm && $game_switches[6]==false
  147.       $game_system.bgm_play(@map.bgm)
  148.     end
  149.     if @map.autoplay_bgs
  150.       $game_system.bgs_play(@map.bgs)
  151.     end
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ● 刷新
  155.   #--------------------------------------------------------------------------
  156.   def refresh
  157.     # 地图 ID 有效
  158.     if @map_id > 0
  159.       # 刷新全部的地图事件
  160.       for event in @events.values
  161.         event.refresh
  162.       end
  163.       # 刷新全部的公共事件
  164.       for common_event in @common_events.values
  165.         common_event.refresh
  166.       end
  167.     end
  168.     # 清除刷新要求标志
  169.     @need_refresh = false
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 向下滚动
  173.   #     distance : 滚动距离
  174.   #--------------------------------------------------------------------------
  175.   def scroll_down(distance)
  176.     @display_y = [@display_y + distance, (self.height - 15) * 128].min
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 向左滚动
  180.   #     distance : 滚动距离
  181.   #--------------------------------------------------------------------------
  182.   def scroll_left(distance)
  183.     @display_x = [@display_x - distance, 0].max
  184.   end
  185.   #--------------------------------------------------------------------------
  186.   # ● 向右滚动
  187.   #     distance : 滚动距离
  188.   #--------------------------------------------------------------------------
  189.   def scroll_right(distance)
  190.     @display_x = [@display_x + distance, (self.width - 20) * 128].min
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # ● 向上滚动
  194.   #     distance : 滚动距离
  195.   #--------------------------------------------------------------------------
  196.   def scroll_up(distance)
  197.     @display_y = [@display_y - distance, 0].max
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ● 有效坐标判定
  201.   #     x          : X 坐标
  202.   #     y          : Y 坐标
  203.   #--------------------------------------------------------------------------
  204.   def valid?(x, y)
  205.      return (x >= 0 and x < width and y >= 1 and y < height-1)
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 可以通行判定
  209.   #     x          : X 坐标
  210.   #     y          : Y 坐标
  211.   #     d          : 方向 (0,2,4,6,8,10)
  212.   #                  ※ 0,10 = 全方向不能通行的情况的判定 (跳跃等)
  213.   #     self_event : 自己 (判定事件可以通行的情况下)
  214.   #--------------------------------------------------------------------------
  215.   def passable?(x, y, d, self_event = nil)
  216.     # 被给予的坐标地图外的情况下
  217.     unless valid?(x, y)
  218.       # 不能通行
  219.       return false
  220.     end
  221.     # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
  222.     bit = (1 << (d / 2 - 1)) & 0x0f
  223.     # 循环全部的事件
  224.     for event in events.values
  225.       # 自己以外的元件与坐标相同的情况
  226.       if event.tile_id >= 0 and event != self_event and
  227.          event.x == x and event.y == y and not event.through
  228.         # 如果障碍物的接触被设置的情况下
  229.         if @passages[event.tile_id] & bit != 0
  230.           # 不能通行
  231.           return false
  232.         # 如果全方向的障碍物的接触被设置的情况下
  233.         elsif @passages[event.tile_id] & 0x0f == 0x0f
  234.           # 不能通行
  235.           return false
  236.         # 这以外的优先度为 0 的情况下
  237.         elsif @priorities[event.tile_id] == 0
  238.           # 可以通行
  239.           return true
  240.         end
  241.       end
  242.     end
  243.     # 从层按从上到下的顺序调查循环
  244.     for i in [2, 1, 0]
  245.       # 取得元件 ID
  246.       tile_id = data[x, y, i]
  247.       # 取得元件 ID 失败
  248.       if tile_id == nil
  249.         # 不能通行
  250.         return false
  251.       # 如果障碍物的接触被设置的情况下
  252.       elsif @passages[tile_id] & bit != 0
  253.         # 不能通行
  254.         return false
  255.       # 如果全方向的障碍物的接触被设置的情况下
  256.       elsif @passages[tile_id] & 0x0f == 0x0f
  257.         # 不能通行
  258.         return false
  259.       # 这以外的优先度为 0 的情况下
  260.       elsif @priorities[tile_id] == 0
  261.         # 可以通行
  262.         return true
  263.       end
  264.     end
  265.     # 可以通行
  266.     return true
  267.   end
  268.   #--------------------------------------------------------------------------
  269.   # ● 茂密判定
  270.   #     x          : X 坐标
  271.   #     y          : Y 坐标
  272.   #--------------------------------------------------------------------------
  273.   def bush?(x, y)
  274.     if @map_id != 0
  275.       for i in [2, 1, 0]
  276.         tile_id = data[x, y, i]
  277.         if tile_id == nil
  278.           return false
  279.         elsif @passages[tile_id] & 0x40 == 0x40
  280.           return true
  281.         end
  282.       end
  283.     end
  284.     return false
  285.   end
  286.   #--------------------------------------------------------------------------
  287.   # ● 柜台判定
  288.   #     x          : X 坐标
  289.   #     y          : Y 坐标
  290.   #--------------------------------------------------------------------------
  291.   def counter?(x, y)
  292.     if @map_id != 0
  293.       for i in [2, 1, 0]
  294.         tile_id = data[x, y, i]
  295.         if tile_id == nil
  296.           return false
  297.         elsif @passages[tile_id] & 0x80 == 0x80
  298.           return true
  299.         end
  300.       end
  301.     end
  302.     return false
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ● 获取地形标志
  306.   #     x          : X 坐标
  307.   #     y          : Y 坐标
  308.   #--------------------------------------------------------------------------
  309.   def terrain_tag(x, y)
  310.     if @map_id != 0
  311.       for i in [2, 1, 0]
  312.         tile_id = data[x, y, i]
  313.         if tile_id == nil or  @terrain_tags[tile_id] == nil
  314.           return 0
  315.         elsif @terrain_tags[tile_id] > 0 #bug tabris
  316.           return @terrain_tags[tile_id]
  317.         end
  318.       end
  319.     end
  320.     return 0
  321.   end
  322.   #--------------------------------------------------------------------------
  323.   # ● 获取指定位置的事件 ID
  324.   #     x          : X 坐标
  325.   #     y          : Y 坐标
  326.   #--------------------------------------------------------------------------
  327.   def check_event(x, y)
  328.     for event in $game_map.events.values
  329.       if event.x == x and event.y == y
  330.         return event.id
  331.       end
  332.     end
  333.   end
  334.   #--------------------------------------------------------------------------
  335.   # ● 滚动开始
  336.   #     direction : 滚动方向
  337.   #     distance  : 滚动距离
  338.   #     speed     : 滚动速度
  339.   #--------------------------------------------------------------------------
  340.   def start_scroll(direction, distance, speed)
  341.     @scroll_direction = direction
  342.     @scroll_rest = distance * 128
  343.     @scroll_speed = speed
  344.   end
  345.   #--------------------------------------------------------------------------
  346.   # ● 滚动中判定
  347.   #--------------------------------------------------------------------------
  348.   def scrolling?
  349.     return @scroll_rest > 0
  350.   end
  351.   #--------------------------------------------------------------------------
  352.   # ● 开始变更雾的色调
  353.   #     tone     : 色调
  354.   #     duration : 时间
  355.   #--------------------------------------------------------------------------
  356.   def start_fog_tone_change(tone, duration)
  357.     @fog_tone_target = tone.clone
  358.     @fog_tone_duration = duration
  359.     if @fog_tone_duration == 0
  360.       @fog_tone = @fog_tone_target.clone
  361.     end
  362.   end
  363.   #--------------------------------------------------------------------------
  364.   # ● 开始变更雾的不透明度
  365.   #     opacity  : 不透明度
  366.   #     duration : 时间
  367.   #--------------------------------------------------------------------------
  368.   def start_fog_opacity_change(opacity, duration)
  369.     @fog_opacity_target = opacity * 1.0
  370.     @fog_opacity_duration = duration
  371.     if @fog_opacity_duration == 0
  372.       @fog_opacity = @fog_opacity_target
  373.     end
  374.   end
  375.   #--------------------------------------------------------------------------
  376.   # ● 刷新画面
  377.   #--------------------------------------------------------------------------
  378.   def update
  379.     # 还原必要的地图
  380.     if $game_map.need_refresh
  381.       refresh
  382.     end
  383.     # 滚动中的情况下
  384.     if @scroll_rest > 0
  385.       # 滚动速度变化为地图坐标系的距离
  386.       distance = 2 ** @scroll_speed
  387.       # 执行滚动
  388.       case @scroll_direction
  389.       when 2  # 下
  390.         scroll_down(distance)
  391.       when 4  # 左
  392.         scroll_left(distance)
  393.       when 6  # 右
  394.         scroll_right(distance)
  395.       when 8  # 上
  396.         scroll_up(distance)
  397.       end
  398.       # 滚动距离的减法运算
  399.       @scroll_rest -= distance
  400.     end
  401.     # 更新地图事件
  402.     for event in @events.values
  403.       event.update
  404.     end
  405.     # 更新公共事件
  406.     for common_event in @common_events.values
  407.       common_event.update
  408.     end
  409.     # 处理雾的滚动
  410.     @fog_ox -= @fog_sx / 8.0
  411.     @fog_oy -= @fog_sy / 8.0
  412.     # 处理雾的色调变更
  413.     if @fog_tone_duration >= 1
  414.       d = @fog_tone_duration
  415.       target = @fog_tone_target
  416.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  417.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  418.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  419.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  420.       @fog_tone_duration -= 1
  421.     end
  422.     # 处理雾的不透明度变更
  423.     if @fog_opacity_duration >= 1
  424.       d = @fog_opacity_duration
  425.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  426.       @fog_opacity_duration -= 1
  427.     end
  428.   end
  429. end
复制代码


spriteset_character
  1.   def initialize(viewport, character = nil , name = "")
  2.     @name = name
  3.     @character = character
  4.     super(viewport)         
  5.     update
  6.   end
复制代码

只改了這部份

game_event (只改了這部份)
  1.   attr_reader   :trigger                  # 目标
  2.   attr_reader   :list                     # 执行内容
  3.   attr_reader   :starting                 # 启动中标志
  4.   attr_reader   :name
复制代码


加入light effect
  1. # ? Light Effects
  2. #================================
  3. # ?By: Near Fantastica
  4. #   Date: 28.06.05
  5. #   Version: 3
  6. #================================

  7. class Spriteset_Map
  8. #class Scene_Map
  9. #--------------------------------------------------------------
  10. alias les_spriteset_map_initalize initialize
  11. alias les_spriteset_map_dispose dispose
  12. alias les_spriteset_map_update update
  13. #--------------------------------------------------------------
  14. def initialize
  15.    @light_effects = []
  16.    setup_lights
  17.    les_spriteset_map_initalize
  18.    update
  19. end
  20. #--------------------------------------------------------------
  21. def dispose
  22.    les_spriteset_map_dispose
  23.    for effect in @light_effects
  24.      effect.light.dispose
  25.    end
  26.    @light_effects = []
  27. end
  28. #--------------------------------------------------------------
  29. def update
  30.    les_spriteset_map_update
  31.    update_light_effects
  32. end
  33. #--------------------------------------------------------------
  34. def setup_lights
  35.    for event in $game_map.events.values
  36.      next if event.list == nil
  37.      for i in 0...event.list.size
  38.        if event.list[i].code == 108 and event.list[i].parameters == ["Light Effects"]
  39.          type = event.list[i+1].parameters.to_s
  40.          case type.upcase!
  41.          when "GROUND"
  42.            light_effects = Light_Effect.new(event,type)
  43.            light_effects.light.zoom_x = 400 / 100.0
  44.            light_effects.light.zoom_y = 400 / 100.0
  45.            light_effects.light.opacity = 200
  46.            @light_effects.push(light_effects)
  47.          when "NIGHT"
  48.            light_effects = Light_Effect.new(event,type)
  49.            light_effects.light.zoom_x = 200 / 100.0
  50.            light_effects.light.zoom_y = 200 / 100.0
  51.            light_effects.light.opacity = 0
  52.            @light_effects.push(light_effects)
  53.          when "FIRE"
  54.            light_effects = Light_Effect.new(event,type)
  55.            light_effects.light.zoom_x = 300 / 100.0
  56.            light_effects.light.zoom_y = 300 / 100.0
  57.            light_effects.light.opacity = 255
  58.            @light_effects.push(light_effects)
  59.          when "LAMPPOST"
  60.            light_effects = Light_Effect.new(event,"LEFT LAMP POST")
  61.            light_effects.light.opacity = 100
  62.            @light_effects.push(light_effects)
  63.            light_effects = Light_Effect.new(event,"RIGHT LAMP POST")
  64.            light_effects.light.opacity = 100
  65.            @light_effects.push(light_effects)
  66.          when "LEFTLANTERN"
  67.            light_effects = Light_Effect.new(event,type)
  68.            light_effects.light.opacity = 150
  69.            @light_effects.push(light_effects)
  70.          when "RIGHTLANTERN"
  71.            light_effects = Light_Effect.new(event,type)
  72.            light_effects.light.opacity = 150
  73.            @light_effects.push(light_effects)
  74.          when "DARK"
  75.            light_effects = Dark_Effect.new(event,type)
  76.            light_effects.light.opacity = 150
  77.            @light_effects.push(light_effects)
  78.          end
  79.        end
  80.      end
  81.    end
  82.    for effect in @light_effects
  83.      case effect.type
  84.      when "GROUND"
  85.        effect.light.x = (effect.event.real_x - 450 - $game_map.display_x) / 4
  86.        effect.light.y = (effect.event.real_y - 400 - $game_map.display_y) / 4
  87.      when "FIRE"
  88.        effect.light.x = (effect.event.real_x - 300 - $game_map.display_x) / 4
  89.        effect.light.y = (effect.event.real_y - 300 - $game_map.display_y) / 4
  90.      when "NIGHT"
  91.        effect.light.x = (effect.event.real_x - 300 - $game_map.display_x) / 4
  92.        effect.light.y = (effect.event.real_y - 300 - $game_map.display_y) / 4
  93.      when "LEFT LAMP POST"
  94.        effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 5
  95.        effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15
  96.      when "RIGHT LAMP POST"
  97.        effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 25
  98.        effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15
  99.      when "LEFTLANTERN"
  100.        effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 20
  101.        effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 5
  102.      when "RIGHTLANTERN"
  103.        effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 10
  104.        effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 5
  105.      when "DARK"
  106.        effect.light.x = $game_player.screen_x - 640
  107.        effect.light.y = $game_player.screen_y - 480
  108.      end
  109.    end
  110. end
  111. #--------------------------------------------------------------
  112. def update_light_effects
  113.    for effect in @light_effects
  114.      next if not in_range?(effect.event)
  115.      case effect.type
  116.      when "GROUND"
  117.        effect.light.x = (effect.event.real_x - 450 - $game_map.display_x) / 4
  118.        effect.light.y = (effect.event.real_y - 400 - $game_map.display_y) / 4
  119.      when "NIGHT"
  120.        effect.light.x = (effect.event.real_x - 180 - $game_map.display_x) / 4
  121.        effect.light.y = (effect.event.real_y - 200 - $game_map.display_y) / 4
  122.        case $game_system.daynight_phase
  123.          when 0
  124.            effect.light.opacity = 0
  125.          when 1
  126.            effect.light.opacity = 130
  127.          when 2
  128.            effect.light.opacity = 200
  129.          when 3
  130.            effect.light.opacity = 0
  131.         end
  132.      when "FIRE"
  133.        effect.light.x = (effect.event.real_x - 300 - $game_map.display_x) / 4
  134.        effect.light.y = (effect.event.real_y - 300 - $game_map.display_y) / 4
  135.      when "LEFT LAMP POST"
  136.        effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 5
  137.        effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15
  138.      when "RIGHT LAMP POST"
  139.        effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 25
  140.        effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15
  141.      when "LEFTLANTERN"
  142.        effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 20
  143.        effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 5
  144.      when "RIGHTLANTERN"
  145.        effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 10
  146.        effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 5
  147.      when "DARK"
  148.       effect.light.x = $game_player.screen_x - 640
  149.       effect.light.y = $game_player.screen_y - 480
  150.      end
  151.    end
  152. end
  153. #--------------------------------------------------------------
  154. def in_range?(object)
  155.    screne_x = $game_map.display_x
  156.    screne_x -= 256
  157.    screne_y = $game_map.display_y
  158.    screne_y -= 256
  159.    screne_width = $game_map.display_x
  160.    screne_width += 2816
  161.    screne_height = $game_map.display_y
  162.    screne_height += 2176
  163.    return false if object.real_x <= screne_x
  164.    return false if object.real_x >= screne_width
  165.    return false if object.real_y <= screne_y
  166.    return false if object.real_y >= screne_height
  167.    return true
  168. end
  169. end

  170. #================================
  171. # ? Light Effects Class
  172. #================================

  173. class Light_Effect
  174. #--------------------------------------------------------------
  175. attr_accessor :light
  176. attr_accessor :event
  177. attr_accessor :type
  178. #--------------------------------------------------------------
  179. def initialize(event, type)
  180.    @light = Sprite.new(@viewport1)
  181.    @light.bitmap = RPG::Cache.title("le.png")
  182.    @light.visible = true
  183.    @light.z = 1
  184.    @light.blend_type = 1
  185.    @event = event
  186.    @type = type
  187. end
  188. end

  189. class Dark_Effect
  190. #--------------------------------------------------------------
  191. attr_accessor :light
  192. attr_accessor :event
  193. attr_accessor :type
  194. #--------------------------------------------------------------
  195. def initialize(event, type)
  196. @light=Sprite.new
  197. @light.bitmap = RPG::Cache.title("dark.jpg")
  198. @light.blend_type = 2
  199. @light.z = 2
  200. #@light.opacity = 180
  201. @event = event
  202. @type = type
  203. end
  204. end
复制代码


效果是不錯,不過奇怪地有些場所移動的事件明明設定了可被穿透,不過卻不能被穿透,是有甚麼問題嗎?

点评

↑指的是地圖轉換時間中不能轉BGM  发表于 2012-3-24 22:08
補充:後來連BGM也不能轉換了  发表于 2012-3-24 22:05
舊坑被棄了
開新坑~
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-4-30 13:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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