Project1

标题: 迷宫旅人那样的迷雾如何实现? [打印本页]

作者: bloodyliao    时间: 2015-10-4 17:09
标题: 迷宫旅人那样的迷雾如何实现?


视野的话是用一张图片实现这个我会了,并且图片的Z值要高于地图的Z值

但是,视野黑暗部分的迷雾是怎么做的呢?

似乎可以用一些天气脚本、雾气脚本来做,但是雾气的Z值应该高于视野图片的Z值,这样才能显示在视野图片的前端

然而雾气又不能跑到视野图片透明部分(地图)上面,因此似乎迷雾的Z值要低于地图的Z值

这样要如何实现呢?
作者: tseyik    时间: 2015-10-4 17:19



  1. #==============================================================================
  2. #                   「近景スクリプト」(ACE) ver2.2
  3. #
  4. #   製作者:奈々(なな)
  5. #   へぷたなすくろーる http://heptanas.mamagoto.com/
  6. #
  7. #   ◇使用規約
  8. #   使用される場合はスクリプト作成者として「奈々」を明記して下さい。
  9. #   このスクリプトを改変したり、改変したものを配布するなどは自由ですが
  10. #   その場合も元のスクリプトの作成者として名前は載せて下さい。
  11. #
  12. #------------------------------------------------------------------------------
  13. #
  14. #   マップの遠景とは逆に、マップ手前に表示される「近景」を設定できます。
  15. #   設定によってフォグや二重遠景なども表現可能です。
  16. #   近景用の画像ファイルは遠景と同じくParallaxesフォルダに入れます。
  17. #   
  18. # ・マップのメモ欄に設定
  19. #   <近景画像 ファイル名>
  20. #   :近景として表示する画像ファイルの指定
  21. #   <近景ループ横 数値>
  22. #   <近景ループ縦 数値>
  23. #   :ループと、自動スクロール速度の指定
  24. #   :遠景と同じなのでそちらを参考に(0でスクロールなしループ)
  25. #   <近景不透明度 数値>
  26. #   :不透明度を0~255で指定、デフォルトは255
  27. #   <近景合成方法 加算/減算>
  28. #   :合成方法を加算タイプや減算タイプに変更する
  29. #   <近景表示位置 数値>
  30. #   :0    遠景の上、マップチップの下
  31. #   :1    マップチップの上、キャラチップの下
  32. #   :2    キャラチップの上、ピクチャの下(デフォルト値)
  33. #   :3    ピクチャの上、メッセージの下
  34. #   
  35. # ・イベントコマンドのスクリプトから変更
  36. #   change_lid
  37. #   :近景を削除する
  38. #
  39. #   change_lid("ファイル名")
  40. #   :指定したファイルを近景として表示する
  41. #
  42. #   change_lid("ファイル名", ループ横, ループ縦)
  43. #   ループの設定をしたい場合はスクロール速度を指定する。
  44. #
  45. #   change_lid("ファイル名", ループ横, ループ縦, 不透明度, 合成方法)
  46. #   更に不透明度を0~255で、合成方法を「通常」「加算」「減算」で指定可能。
  47. #   
  48. #==============================================================================


  49. module Cache
  50.   #--------------------------------------------------------------------------
  51.   # ● 近景グラフィックの取得
  52.   #--------------------------------------------------------------------------
  53.   def self.lid(filename)
  54.     load_bitmap("Graphics/Parallaxes/", filename)
  55.   end
  56. end

  57. class RPG::Map
  58.   #--------------------------------------------------------------------------
  59.   # ● 近景情報の取得
  60.   #--------------------------------------------------------------------------
  61.   def lid_name
  62.     @note[/<近景画像\s?(\w+)>/] ? $1.to_s : ""
  63.   end
  64.   
  65.   def lid_loop_x
  66.     @note.include?("<近景ループ横")
  67.   end
  68.   def lid_loop_y
  69.     @note.include?("<近景ループ縦")
  70.   end

  71.   def lid_sx
  72.     @note[/<近景ループ横\s?([-]?\d+)>/] ? $1.to_i : 0
  73.   end
  74.   def lid_sy
  75.     @note[/<近景ループ縦\s?([-]?\d+)>/] ? $1.to_i : 0
  76.   end
  77.   
  78.   def lid_opacity
  79.     @note[/<近景不透明度\s?(\d+)>/] ? $1.to_i : 255
  80.   end
  81.   def lid_blend_type
  82.     if @note[/<近景合成方法\s?(加算|減算)>/]
  83.       if $1.to_s == "加算"
  84.         return 1
  85.       else
  86.         return 2
  87.       end
  88.     else
  89.       return 0
  90.     end
  91.   end

  92.   def lid_height_level
  93.     @note[/<近景表示位置\s?(\d)>/] ? $1.to_i : 2
  94.   end

  95. end

  96. class Game_Map
  97.   attr_reader   :lid_name            # 近景 ファイル名
  98.   attr_reader   :lid_opacity         # 近景 不透明度
  99.   attr_reader   :lid_blend_type      # 近景 合成方法
  100.   attr_reader   :lid_height_level    # 近景 表示位置
  101.   #--------------------------------------------------------------------------
  102.   # ● 遠景のセットアップ
  103.   #--------------------------------------------------------------------------
  104.   alias lid_setup_parallax setup_parallax
  105.   def setup_parallax
  106.     lid_setup_parallax
  107.     setup_lid
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 近景のセットアップ
  111.   #--------------------------------------------------------------------------
  112.   def setup_lid
  113.     @lid_name = @map.lid_name
  114.     @lid_opacity = @map.lid_opacity
  115.     @lid_blend_type = @map.lid_blend_type
  116.     @lid_height_level = @map.lid_height_level
  117.     @lid_loop_x = @map.lid_loop_x
  118.     @lid_loop_y = @map.lid_loop_y
  119.     @lid_sx = @map.lid_sx
  120.     @lid_sy = @map.lid_sy
  121.     @lid_x = 0
  122.     @lid_y = 0
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 表示位置の設定
  126.   #--------------------------------------------------------------------------
  127.   alias lid_set_display_pos set_display_pos
  128.   def set_display_pos(x, y)
  129.     x = [0, [x, width - screen_tile_x].min].max unless loop_horizontal?
  130.     y = [0, [y, height - screen_tile_y].min].max unless loop_vertical?
  131.     lid_set_display_pos(x, y)
  132.     @lid_x = x
  133.     @lid_y = y
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 遠景表示の原点 X 座標の計算
  137.   #--------------------------------------------------------------------------
  138.   def lid_ox(bitmap)
  139.     if @lid_loop_x
  140.       @lid_x * 16
  141.     else
  142.       w1 = [bitmap.width - Graphics.width, 0].max
  143.       w2 = [width * 32 - Graphics.width, 1].max
  144.       @lid_x * 16 * w1 / w2
  145.     end
  146.   end
  147.   #--------------------------------------------------------------------------
  148.   # ● 遠景表示の原点 Y 座標の計算
  149.   #--------------------------------------------------------------------------
  150.   def lid_oy(bitmap)
  151.     if @lid_loop_y
  152.       @lid_y * 16
  153.     else
  154.       h1 = [bitmap.height - Graphics.height, 0].max
  155.       h2 = [height * 32 - Graphics.height, 1].max
  156.       @lid_y * 16 * h1 / h2
  157.     end
  158.   end
  159.   #--------------------------------------------------------------------------
  160.   # ● 下にスクロール
  161.   #--------------------------------------------------------------------------
  162.   def scroll_down(distance)
  163.     if loop_vertical?
  164.       @display_y += distance
  165.       @display_y %= @map.height
  166.       @parallax_y += distance if @parallax_loop_y
  167.       @lid_y += distance if @lid_loop_y
  168.     else
  169.       last_y = @display_y
  170.       @display_y = [@display_y + distance, height - screen_tile_y].min
  171.       @parallax_y += @display_y - last_y
  172.       @lid_y += @display_y - last_y
  173.     end
  174.   end
  175.   #--------------------------------------------------------------------------
  176.   # ● 左にスクロール
  177.   #--------------------------------------------------------------------------
  178.   def scroll_left(distance)
  179.     if loop_horizontal?
  180.       @display_x += @map.width - distance
  181.       @display_x %= @map.width
  182.       @parallax_x -= distance if @parallax_loop_x
  183.       @lid_x -= distance if @lid_loop_x
  184.     else
  185.       last_x = @display_x
  186.       @display_x = [@display_x - distance, 0].max
  187.       @parallax_x += @display_x - last_x
  188.       @lid_x += @display_x - last_x
  189.     end
  190.   end
  191.   #--------------------------------------------------------------------------
  192.   # ● 右にスクロール
  193.   #--------------------------------------------------------------------------
  194.   def scroll_right(distance)
  195.     if loop_horizontal?
  196.       @display_x += distance
  197.       @display_x %= @map.width
  198.       @parallax_x += distance if @parallax_loop_x
  199.       @lid_x += distance if @lid_loop_x
  200.     else
  201.       last_x = @display_x
  202.       @display_x = [@display_x + distance, (width - screen_tile_x)].min
  203.       @parallax_x += @display_x - last_x
  204.       @lid_x += @display_x - last_x
  205.     end
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 上にスクロール
  209.   #--------------------------------------------------------------------------
  210.   def scroll_up(distance)
  211.     if loop_vertical?
  212.       @display_y += @map.height - distance
  213.       @display_y %= @map.height
  214.       @parallax_y -= distance if @parallax_loop_y
  215.       @lid_y -= distance if @lid_loop_y
  216.     else
  217.       last_y = @display_y
  218.       @display_y = [@display_y - distance, 0].max
  219.       @parallax_y += @display_y - last_y
  220.       @lid_y += @display_y - last_y
  221.     end
  222.   end
  223.   #--------------------------------------------------------------------------
  224.   # ● 遠景の更新
  225.   #--------------------------------------------------------------------------
  226.   alias lid_update_parallax update_parallax
  227.   def update_parallax
  228.     lid_update_parallax
  229.     update_lid
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ● 近景の更新
  233.   #--------------------------------------------------------------------------
  234.   def update_lid
  235.     @lid_x += @lid_sx / 64.0 if @lid_loop_x
  236.     @lid_y += @lid_sy / 64.0 if @lid_loop_y
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   # ● 近景の変更
  240.   #--------------------------------------------------------------------------
  241.   def change_lid(name, loop_x, loop_y, sx, sy, opacity, blend_type)
  242.     @lid_name = name
  243.     @lid_x = 0 if @lid_loop_x && !loop_x
  244.     @lid_y = 0 if @lid_loop_y && !loop_y
  245.     @lid_loop_x = loop_x
  246.     @lid_loop_y = loop_y
  247.     @lid_sx = sx
  248.     @lid_sy = sy
  249.     @lid_opacity = opacity
  250.     @lid_blend_type = blend_type
  251.   end
  252. end

  253. class Game_Interpreter
  254.   #--------------------------------------------------------------------------
  255.   # ● 近景の変更
  256.   #--------------------------------------------------------------------------
  257.   def change_lid(name = "", loop_sx = false, loop_sy = false, opacity = 255, blend_type = "通常")
  258.     if loop_sx
  259.       loop_x = true
  260.       sx = loop_sx
  261.     else
  262.       loop_x = false
  263.       sx = 0
  264.     end
  265.     if loop_sy
  266.       loop_y = true
  267.       sy = loop_sy
  268.     else
  269.       loop_y = false
  270.       sy = 0
  271.     end
  272.     if blend_type == "加算"
  273.       blend_type = 1
  274.     elsif blend_type == "減算"
  275.       blend_type = 2
  276.     else
  277.       blend_type = 0
  278.     end
  279.     $game_map.change_lid(name, loop_x, loop_y, sx, sy, opacity, blend_type)
  280.   end
  281. end


  282. class Spriteset_Map
  283.   #--------------------------------------------------------------------------
  284.   # ● 遠景の作成
  285.   #--------------------------------------------------------------------------
  286.   alias lid_create_parallax create_parallax
  287.   def create_parallax
  288.     lid_create_parallax
  289.     create_lid
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # ● 近景の作成
  293.   #--------------------------------------------------------------------------
  294.   def create_lid
  295.     case $game_map.lid_height_level
  296.     when 0
  297.       @lid = Plane.new(@viewport1)
  298.       @lid.z = -90
  299.     when 1
  300.       @lid = Plane.new(@viewport1)
  301.       @lid.z = 10
  302.     when 2
  303.       @lid = Plane.new(@viewport1)
  304.       @lid.z = 250
  305.     when 3
  306.       @lid = Plane.new(@viewport2)
  307.       @lid.z = 120
  308.     end
  309.   end
  310.   #--------------------------------------------------------------------------
  311.   # ● 遠景の解放
  312.   #--------------------------------------------------------------------------
  313.   alias lid_dispose_parallax dispose_parallax
  314.   def dispose_parallax
  315.     lid_dispose_parallax
  316.     dispose_lid
  317.   end
  318.   #--------------------------------------------------------------------------
  319.   # ● 近景の解放
  320.   #--------------------------------------------------------------------------
  321.   def dispose_lid
  322.     @lid.bitmap.dispose if @lid.bitmap
  323.     @lid.dispose
  324.   end
  325.   #--------------------------------------------------------------------------
  326.   # ● 遠景の更新
  327.   #--------------------------------------------------------------------------
  328.   alias lid_update_parallax update_parallax
  329.   def update_parallax
  330.     lid_update_parallax
  331.     update_lid
  332.   end
  333.   #--------------------------------------------------------------------------
  334.   # ● 近景の更新
  335.   #--------------------------------------------------------------------------
  336.   def update_lid
  337.     if @lid_name != $game_map.lid_name
  338.       @lid_name = $game_map.lid_name
  339.       @lid.bitmap.dispose if @lid.bitmap
  340.       @lid.bitmap = Cache.lid(@lid_name)
  341.       Graphics.frame_reset
  342.     end
  343.     @lid.ox = $game_map.lid_ox(@lid.bitmap)
  344.     @lid.oy = $game_map.lid_oy(@lid.bitmap)
  345.     @lid.opacity = $game_map.lid_opacity
  346.     @lid.blend_type = $game_map.lid_blend_type
  347.   end
  348. end

复制代码

作者: bloodyliao    时间: 2015-10-4 17:49
tseyik 发表于 2015-10-4 17:19

能说下使用方法吗?看不懂~~~~(>_<)~~~~
作者: tseyik    时间: 2015-10-4 18:33
bloodyliao 发表于 2015-10-4 17:49
能说下使用方法吗?看不懂~~~~(>_

# ・地圖的附註欄に設定
#   <近景画像 文件名>
#   :指定近景として表示する画像文件
#   <近景ループ横 数値>
#   <近景ループ縦 数値>
#   :設定捲動、自動捲動速度
#   :遠景同方法設定(0不捲動)
#   <近景不透明度 数値>
#   :指定不透明度0~255、預設255
#   <近景合成方法 加算/減算>
#   :合成方法;加算/減算変更
#   <近景表示位置 数値>
#   :0    遠景之上、地圖元件以下
#   :1    地圖元件以上、人物元件以下
#   :2    人物元件以上、圖片以下(預設値)
#   :3    圖片以上、文字以下
#   
# ・可在事件指令中的脚本変更
#   change_lid
#   :削除近景画像
#
#   change_lid("ファイル名")
#   :指定表示近景用近景画像
#
#   change_lid("ファイル名", ループ横, ループ縦)
#   指定捲動速度。
#
#   change_lid("ファイル名", ループ横, ループ縦, 不透明度, 合成方法)
#  指定不透明度0~255、指定合成方法「通常」「加算」「減算」。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1