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

Project1

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

[有事请教] 【VA脚本】有没有功能非常简单的气泡对话框脚本?

[复制链接]

Lv2.观梦者

梦石
0
星屑
941
在线时间
116 小时
注册时间
2019-3-2
帖子
42
跳转到指定楼层
发表于 昨天 19:27 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
200星屑
本帖最后由 sansy 于 2025-11-9 00:52 编辑

如题,我的主要需求是需要一个没有任何特殊功能,能显示文本就够了的气泡对话框脚本。
满足以下条件即可:
1.作为气泡对话框,自然就是在事件头顶显示文本的对话框,如果事件正在移动,那这个对话框自然要跟随事件移动
2.不覆盖原版或是其他插件提供的主要对话框,我的需求是龙套NPC使用气泡进行对话,而主要剧情依然使用大型对话框与立绘,因此这个气泡对话框除非主动调用,否则不会默认覆盖掉原版的对话框

Lv5.捕梦者

梦石
0
星屑
27347
在线时间
5472 小时
注册时间
2016-3-8
帖子
1690
8
发表于 半小时前 | 只看该作者
本帖最后由 alexncf125 于 2025-11-9 09:41 编辑

并行处理用 get_character(21).mrbt = "文本1" 啦~
(或者把152行的$game_map.interpreter.删掉
回复

使用道具 举报

Lv6.析梦学徒

老鹰

梦石
40
星屑
36107
在线时间
6890 小时
注册时间
2012-5-26
帖子
3290

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

7
发表于 1 小时前 | 只看该作者
我自己的对话框似乎符合,开启兼容模式,就不会覆盖其它对话框
不过可能功能太多了?
https://rpg.blue/thread-476586-1-1.html
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
941
在线时间
116 小时
注册时间
2019-3-2
帖子
42
6
 楼主| 发表于 9 小时前 | 只看该作者
alexncf125 发表于 2025-11-9 01:04
关于时长时短的情況, 把132行的return nil unless @mrbt_type && TMMRBT::DATABASE[@mrbt_type]
改成retu ...

时长时短的问题已经得到解决,现在又出现了新的问题:
并行处理的事件中使用该脚本,会出现:
1.无法以0指代”本事件“,会错误的让文本气泡出现在另外一个事件上方(我的测试中,21号并行处理事件播放的气泡出现在了5号事件上)
2.尝试令该并行处理事件循环如上所述的:
mrbt(0, "文本1")
等待若干帧数
mrbt(0, "文本2")
等待若干帧数
mrbt(0, "文本3")
等待若干帧数
的时候,在第一条文本播放完毕后,无论等多久,都不会再播放文本。
回复

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
27347
在线时间
5472 小时
注册时间
2016-3-8
帖子
1690
5
发表于 9 小时前 | 只看该作者
本帖最后由 alexncf125 于 2025-11-9 09:42 编辑
sansy 发表于 2025-11-9 00:22
请问这个脚本是没有自动按顺序播放的功能吗?我在事件脚本里写:
mrbt(0, "文本1")
mrbt(0, "文本2")


关于时长时短的情況, 把132行的return nil unless @mrbt_type && TMMRBT::DATABASE[@mrbt_type]
改成return @mrbt unless @mrbt_type && TMMRBT::DATABASE[@mrbt_type]就好了

至于“最大间隔”与“最小间隔”的设置, 那是做菜市场(61-63行)用的,
我想大概是用来随机出时间差, 来模拟出比较人性化的叫卖效果,
不然几个菜贩的每句话, 都隔着相同帧数的话, 会显得有些呆板?

睡觉去了~不说啦~自己研究去吧~
回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
941
在线时间
116 小时
注册时间
2019-3-2
帖子
42
4
 楼主| 发表于 10 小时前 | 只看该作者
本帖最后由 sansy 于 2025-11-9 00:50 编辑
alexncf125 发表于 2025-11-9 00:09
啊这......
那用这版吧......
    #======================================================== ...


请问这个脚本是没有自动按顺序播放的功能吗?我在事件脚本里写:
mrbt(0, "文本1")
mrbt(0, "文本2")
mrbt(0, "文本3")
他会直接显示“文本3”,而且我自行在中间设置60帧间隔以后,虽然会按顺序显示这三条文本,但是每条文本的持续时间却不固定,时长时短(如有时候“文本1”尚未消失就会被“文本2”替换掉,而有时却会在“文本1”自行消失一会儿后,“文本2”才出现)。
这对我的使用造成了很大的困扰,有没有解决方式呢?
同时“最大间隔”与“最小间隔”的设置到底影响了什么?我目前理解不了。
气泡消失时的渐变消失效果,也无法稳定有或稳定没有,观感非常差。
作为一个简易气泡对话而言,似乎有点太过难以使用了,至少需要能够按顺序,好好的播放下一条对话吧
回复

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
27347
在线时间
5472 小时
注册时间
2016-3-8
帖子
1690
3
发表于 10 小时前 | 只看该作者
sansy 发表于 2025-11-8 23:43
该脚本在以事件为主体使用时,在一个气泡显示完毕后会在第199行报错NoMethodError
undefinded method “x ...


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

使用道具 举报

Lv2.观梦者

梦石
0
星屑
941
在线时间
116 小时
注册时间
2019-3-2
帖子
42
2
 楼主| 发表于 昨天 23:43 | 只看该作者
alexncf125 发表于 2025-11-8 21:22
村人a好像就有一个
喔~记错了~不是村人a的~而是tomoaky的~叫村人のつぶやき才对~
https://rpg.blue/ ...


该脚本在以事件为主体使用时,在一个气泡显示完毕后会在第199行报错NoMethodError
undefinded method “x=” for nil:NilClass
以玩家角色为主体使用时,则没有这个问题。
回复

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
27347
在线时间
5472 小时
注册时间
2016-3-8
帖子
1690
1
发表于 昨天 21:22 | 只看该作者
本帖最后由 alexncf125 于 2025-11-8 21:52 编辑

村人a好像就有一个
喔~记错了~不是村人a的~而是tomoaky的~叫村人のつぶやき才对~
https://rpg.blue/forum.php?mod=r ... amp;fromuid=2652223
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-11-9 10:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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