Project1

标题: 关于事件自言自语脚本的问题 [打印本页]

作者: r403736524    时间: 2014-8-18 23:41
标题: 关于事件自言自语脚本的问题
使用了这个脚本视乎并行处理无法使用了,这个要怎么办啊,一些自动改变的东西都不能设置了。
RUBY 代码复制
  1. #==============================================================================
  2. # ★ RGSS3_村人のつぶやき Ver0.11a
  3. #==============================================================================
  4. =begin
  5.  
  6. 作者:tomoaky
  7. webサイト:ひきも記は閉鎖しました。 ([url]http://hikimoki.sakura.ne.jp/[/url])
  8.  
  9. キャラクターの頭上にフキダシメッセージを表示します。
  10.  
  11. イベント名、あるいは実行内容の先頭に注釈コマンドでメッセージを設定します。
  12.   <mrbt 少年>
  13.     メッセージタイプを 少年 に設定します、メッセージタイプは
  14.     自由に編集、追加することができます。
  15.     
  16.   イベントコマンドのスクリプトを使い、手動でメッセージを表示することもできます。
  17.   mrbt(0, "動き理解した?")
  18.     最初の数値でメッセージを表示するイベントを指定してください、
  19.     0 で実行中のイベント、-1 でプレイヤー、1 以上でそのIDのイベントが対象です。
  20.     
  21. メッセージには以下の制御文字が利用できます、内容は文章の表示コマンドと同様です。
  22.   \V[1] / \N[1] / \P / \C[2] / \G
  23.   上記以外に \L で手動での改行が可能です。
  24.  
  25. 注意事項
  26.   イベント名と注釈コマンドの両方でメッセージタイプを指定した場合は
  27.   注釈コマンドが優先されます。注釈コマンドでの指定がないイベントページでのみ
  28.   イベント名による指定が有効になります。
  29.  
  30. 動作に必要な画像
  31.   Graphics/System/mrbt_window.png
  32.  
  33. 2013.08.27  Ver0.11a
  34.   出現条件を満たしていないイベントがあるとエラー落ちする不具合を修正
  35.  
  36. 2013.08.20 Ver0.1a
  37.   公開
  38.  
  39. =end
  40.  
  41. #==============================================================================
  42. # ■ 設定項目
  43. #==============================================================================
  44. module TMMRBT
  45.   FONT_SIZE = 16                  # フォントサイズ
  46.   BACK_OPACITY = 192              # つぶやきウィンドウの不透明度
  47.   MESSAGE_DURATION = 240          # つぶやきの表示時間(フレーム)
  48.  
  49.   MIN_INTERVAL = 180              # 次のつぶやきまでの最小間隔(フレーム)
  50.   MAX_INTERVAL = 360              # 次のつぶやきまでの最大間隔(フレーム)
  51.  
  52.   # メッセージタイプの設定
  53.   # メッセージは '' で囲み、カンマで区切って必要な数だけ設定します
  54.   DATABASE = {}
  55.   DATABASE["少年"] = ['わーい!', '\C[2]動き\C[0]理解した?', '\N[1]さん!\Lこんにちは!']
  56.   DATABASE["盗賊"] = ['げへへへ', 'ひゃっはーー!!']
  57. end
  58.  
  59. #==============================================================================
  60. # ■ Game_Character
  61. #==============================================================================
  62. class Game_Character
  63.   #--------------------------------------------------------------------------
  64.   # ○ 現在のつぶやき内容を返す
  65.   #--------------------------------------------------------------------------
  66.   def mrbt
  67.     @mrbt
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ○ つぶやきをセット
  71.   #--------------------------------------------------------------------------
  72.   def set_mrbt(text)
  73.     @mrbt = text
  74.   end
  75. end
  76.  
  77. #==============================================================================
  78. # ■ Game_Event
  79. #==============================================================================
  80. class Game_Event
  81.   #--------------------------------------------------------------------------
  82.   # ● イベントページの設定をセットアップ
  83.   #--------------------------------------------------------------------------
  84.   alias tmmrbt_game_event_setup_page_settings setup_page_settings
  85.   def setup_page_settings
  86.     tmmrbt_game_event_setup_page_settings
  87.     set_next_mrbt_count
  88.     @mrbt_type = /<mrbt\s+(\S+?)>/i =~ @event.name ? $1 : nil
  89.     if @list
  90.       @list.each do |list|
  91.         if list.code == 108 || list.code == 408
  92.           @mrbt_type = $1 if /<mrbt\s+(\S+?)>/i =~ list.parameters[0]
  93.         else
  94.           break
  95.         end
  96.       end
  97.     else
  98.       @mrbt = nil
  99.     end
  100.   end
  101.   #--------------------------------------------------------------------------
  102.   # ● フレーム更新
  103.   #--------------------------------------------------------------------------
  104.   def update
  105.     super
  106.     update_mrbt
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ○ つぶやきの更新
  110.   #--------------------------------------------------------------------------
  111.   def update_mrbt
  112.     if @mrbt_count && @mrbt_count > 0
  113.       @mrbt_count -= 1
  114.       if @mrbt_count == 0
  115.         set_mrbt(get_random_mrbt)
  116.         set_next_mrbt_count
  117.       end
  118.     end
  119.   end
  120.   #--------------------------------------------------------------------------
  121.   # ○ ランダムつぶやきの内容取得
  122.   #--------------------------------------------------------------------------
  123.   def get_random_mrbt
  124.     return nil unless @mrbt_type && TMMRBT::DATABASE[@mrbt_type]
  125.     TMMRBT::DATABASE[@mrbt_type][rand(TMMRBT::DATABASE[@mrbt_type].size)].clone
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ○ ランダムつぶやきの待機時間をセット
  129.   #--------------------------------------------------------------------------
  130.   def set_next_mrbt_count
  131.     n = rand([TMMRBT::MAX_INTERVAL - TMMRBT::MIN_INTERVAL, 1].max)
  132.     @mrbt_count = TMMRBT::MIN_INTERVAL + n
  133.   end
  134. end
  135.  
  136. #==============================================================================
  137. # ■ Game_Interpreter
  138. #==============================================================================
  139. class Game_Interpreter
  140.   #--------------------------------------------------------------------------
  141.   # ● 指定したIDのイベントにつぶやきを強制
  142.   #--------------------------------------------------------------------------
  143.   def mrbt(id, text)
  144.     event = $game_map.interpreter.get_character(id)
  145.     event.set_mrbt(text) if event
  146.   end
  147. end
  148.  
  149. #==============================================================================
  150. # ■ Sprite_Character
  151. #==============================================================================
  152. class Sprite_Character
  153.   #--------------------------------------------------------------------------
  154.   # ● オブジェクト初期化
  155.   #     viewport  : ビューポート
  156.   #     character : キャラクター (Game_Character)
  157.   #--------------------------------------------------------------------------
  158.   alias tmmrbt_sprite_character_initialize initialize
  159.   def initialize(viewport, character = nil)
  160.     @bitmap_mrbt = Cache.system("mrbt_window")
  161.     @mrbt_duration = 0
  162.     tmmrbt_sprite_character_initialize(viewport, character)
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # ● 解放
  166.   #--------------------------------------------------------------------------
  167.   alias tmmrbt_sprite_character_dispose dispose
  168.   def dispose
  169.     dispose_mrbt
  170.     tmmrbt_sprite_character_dispose
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # ○ フキダシメッセージの解放
  174.   #--------------------------------------------------------------------------
  175.   def dispose_mrbt
  176.     if @mrbt_sprite
  177.       @mrbt_sprite.bitmap.dispose if @mrbt_sprite.bitmap
  178.       @mrbt_sprite.dispose
  179.       @mrbt_sprite = nil
  180.     end
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● その他の更新
  184.   #--------------------------------------------------------------------------
  185.   alias tmmrbt_sprite_character_update_other update_other
  186.   def update_other
  187.     tmmrbt_sprite_character_update_other
  188.     update_mrbt
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ○ フキダシメッセージの更新
  192.   #--------------------------------------------------------------------------
  193.   def update_mrbt
  194.     if @mrbt_duration > 0
  195.       @mrbt_duration -= 1
  196.       if @mrbt_duration == 0
  197.         @character.set_mrbt(nil)
  198.       else
  199.         @mrbt_sprite.x = x
  200.         @mrbt_sprite.y = y - height
  201.         @mrbt_sprite.opacity = @mrbt_duration * 24
  202.       end
  203.     end
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # ● 新しいエフェクトの設定
  207.   #--------------------------------------------------------------------------
  208.   alias tmmrbt_sprite_character_setup_new_effect setup_new_effect
  209.   def setup_new_effect
  210.     tmmrbt_sprite_character_setup_new_effect
  211.     if @mrbt != @character.mrbt
  212.       @mrbt = @character.mrbt
  213.       start_mrbt(@mrbt)
  214.     end
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # ○ 文字色取得
  218.   #     n : 文字色番号 (0~31)
  219.   #--------------------------------------------------------------------------
  220.   def text_color(n)
  221.     x = (n % 8) * 8
  222.     y = 32 + (n / 8) * 8
  223.     return @bitmap_mrbt.get_pixel(x, y)
  224.   end
  225.   #--------------------------------------------------------------------------
  226.   # ○ 特殊文字の変換
  227.   #--------------------------------------------------------------------------
  228.   def convert_special_characters(text)
  229.     text.gsub!(/\\/)               { "\e" }
  230.     text.gsub!(/\e\e/)             { "\\" }
  231.     text.gsub!(/\eV\[([0-9]+)\]/i) { $game_variables[$1.to_i] }
  232.     text.gsub!(/\eV\[([0-9]+)\]/i) { $game_variables[$1.to_i] }
  233.     text.gsub!(/\eN\[([0-9]+)\]/i) { actor_name($1.to_i) }
  234.     text.gsub!(/\eP\[(\d+)\]/i)    { party_member_name($1.to_i) }
  235.     text.gsub!(/\eG/i)             { Vocab::currency_unit }
  236.     text.gsub!(/\eL/i)             { "\x00" }
  237.     text.gsub!(/\eC\[([0-9]+)\]/i) { "\x01[#{$1}]" }
  238.     text
  239.   end
  240.   #--------------------------------------------------------------------------
  241.   # ○ アクター n 番の名前を取得
  242.   #--------------------------------------------------------------------------
  243.   def actor_name(n)
  244.     actor = n >= 1 ? $game_actors[n] : nil
  245.     actor ? actor.name : ""
  246.   end
  247.   #--------------------------------------------------------------------------
  248.   # ○ パーティメンバー n 番の名前を取得
  249.   #--------------------------------------------------------------------------
  250.   def party_member_name(n)
  251.     actor = n >= 1 ? $game_party.members[n - 1] : nil
  252.     actor ? actor.name : ""
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # ○ フキダシメッセージ表示の開始
  256.   #--------------------------------------------------------------------------
  257.   def start_mrbt(text)
  258.     dispose_mrbt
  259.     return unless text
  260.     @mrbt_duration = TMMRBT::MESSAGE_DURATION
  261.     text = convert_special_characters(text)
  262.     pos = {:x => 4, :y => 0, :width => 0, :line_height => TMMRBT::FONT_SIZE + 4}
  263.     bitmap = Bitmap.new(160, 160)
  264.     bitmap.font.size = TMMRBT::FONT_SIZE
  265.     loop do
  266.       c = text.slice!(/./m)         # 次の文字を取得
  267.       case c
  268.       when nil
  269.         break                           # 描画すべき文字がなければ終了
  270.       when "\x00"                       # 改行
  271.         process_new_line(pos)
  272.       when "\x01"                       # \C[n]  (文字色変更)
  273.         text.sub!(/\[([0-9]+)\]/, "")
  274.         bitmap.font.color = text_color($1.to_i)
  275.       else
  276.         bitmap.draw_text(pos[:x], pos[:y], 40, pos[:line_height], c)
  277.         c_width = bitmap.text_size(c).width
  278.         pos[:x] += c_width
  279.         process_new_line(pos) if pos[:x] >= 140   # 右端にきていれば改行
  280.       end
  281.     end
  282.     w = [pos[:x], pos[:width]].max + 4
  283.     h = pos[:y] + (pos[:x] == 4 ? 0 : pos[:line_height])
  284.     create_mrbt_sprite(w, h)            # フキダシウィンドウのスプライトを作成
  285.     @mrbt_sprite.bitmap.blt(0, 0, bitmap, bitmap.rect)
  286.     bitmap.dispose
  287.     update_mrbt
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # ○ 改行の処理
  291.   #--------------------------------------------------------------------------
  292.   def process_new_line(pos)
  293.     pos[:width] = pos[:x] if pos[:width] < pos[:x]
  294.     pos[:x] = 4
  295.     pos[:y] += pos[:line_height]
  296.   end
  297.   #--------------------------------------------------------------------------
  298.   # ○ フキダシウィンドウのスプライトを作成
  299.   #--------------------------------------------------------------------------
  300.   def create_mrbt_sprite(width, height)
  301.     @mrbt_sprite = ::Sprite.new(nil)
  302.     @mrbt_sprite.z = 90
  303.     @mrbt_sprite.ox = width / 2
  304.     @mrbt_sprite.oy = height + 4
  305.     @mrbt_sprite.bitmap = Bitmap.new(width, height + 8)
  306.     rect = Rect.new(0, 0, 8, 8)
  307.     alpha = TMMRBT::BACK_OPACITY
  308.     @mrbt_sprite.bitmap.blt(0, 0, @bitmap_mrbt, rect, alpha)
  309.     rect.x += 8
  310.     @mrbt_sprite.bitmap.blt(width - 8, 0, @bitmap_mrbt, rect, alpha)
  311.     rect.y += 8
  312.     @mrbt_sprite.bitmap.blt(width - 8, height - 8, @bitmap_mrbt, rect, alpha)
  313.     rect.x -= 8
  314.     @mrbt_sprite.bitmap.blt(0, height - 8, @bitmap_mrbt, rect, alpha)
  315.     rect.set(16, 0, 8, 8)
  316.     @mrbt_sprite.bitmap.blt(@mrbt_sprite.ox - 4, height, @bitmap_mrbt, rect, alpha)
  317.     color = @bitmap_mrbt.get_pixel(8, 8)
  318.     color.alpha = alpha
  319.     @mrbt_sprite.bitmap.fill_rect(8, 0, width - 16, height, color)
  320.     @mrbt_sprite.bitmap.fill_rect(0, 8, 8, height - 16, color)
  321.     @mrbt_sprite.bitmap.fill_rect(width - 8, 8, 8, height - 16, color)
  322.   end
  323. end

作者: 唐家耗子    时间: 2014-8-24 09:58
在地图上用自动执行事件,用开关开启公共事件,效果一模一样滴
【俺也是酱紫
作者: r403736524    时间: 2014-8-24 11:33
唐家耗子 发表于 2014-8-24 09:58
在地图上用自动执行事件,用开关开启公共事件,效果一模一样滴
【俺也是酱紫 ...

太罗嗦了- -我宁愿舍弃




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