查看: 2036|回复: 5

[已经解决] 如何在脚本中实现对话框的字体更改?

[复制链接]
梦石
3
星屑
195
在线时间
246 小时
注册时间
2013-10-19
回帖
85
发表于 2015-6-29 18:01:47 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 漫天游弋 于 2015-6-29 18:04 编辑

这是我自己练习写的脚本,用到了喵呜喵5前辈的改变字体的脚本。为何我在脚本里修改变量的值,游戏中的字体不会更改呢?(用事件写的就可以。
是我的脚本写的有问题么?(つд`゚)
我的脚本:↓
[pre lang="ruby"]class Game_Interpreter
  def 偷懒大法
  $game_variables[97] = 1
  n=$game_variables[18] #当前周目数
  s=[]
  s[0]="△";
  for i in 1..12
    s="△";       
    s=s+s[i-1];
  end
  $game_message.add(s[n-1]) #显示三角形的数量
  $game_variables[97] = 0
  $game_message.add(sprintf("纸张上画了%d个三角形,我是什么时候画的呢。。",
  $game_variables[18]))
  end #def
end   #class[/pre]

喵呜喵5前辈的脚本:↓
https://rpg.blue/forum.php?mod=viewthread&tid=328520

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-6-29 18:14:16 | 显示全部楼层
因为字还没显示出来你就把字体给改回去了

点评

soga!麻烦再看下4楼吧  发表于 2015-6-29 18:46
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2015-6-29 18:28:46 | 显示全部楼层
本帖最后由 tseyik 于 2015-6-29 18:48 编辑

◆スキップ機能

    シフトキーを押しっぱなしにすることで、文章をメッセージをスキップすることができます。
    これはイベントが始まってからシフトキーを押すと機能します。
    押しながらイベントを開始しても、いきなりスキップすることはありません。

◆エフェクトの種類

    0         : 文字が右にスライドしながら浮かび上がる演出を行います。
    1         : 文字が下にスライドしながら浮かび上がる演出を行います。
    2         : 文字が上にスライドしながら浮かび上がる演出を行います。
    3         : 文字が左にスライドしながら浮かび上がる演出を行います。
    4         : スライドせずに浮かび上がる演出を行います。
    5         : 文字が拡大していく演出が加えられます。
    6         : 文字が回転する演出が加えられます。
    7         : カスタム (スクリプト自作用)

◆制御文字

    \sp[n]         : 文章の表示速度を秒間 n 文字に変更します。
     デフォルト値は 60 です。
     0 にすると瞬間表示となります。
    \a         : スキップ機能や、決定キーによる文章の瞬間表示を無効化します。
    \et[n]         : エフェクトの種類を n 番に変更します。
    \ed[n]         : エフェクトの時間を n フレームに変更します。
    \font[n]         : フォントを番号 n に対応したものに変更します。
     0 でデフォルトのフォントに戻します。
    \df         : エフェクト、フォント、文字の色とサイズ、文章表示の速度をデフォルトの値に戻します。
    \fo[n]         : n フレームかけて文章のフェードアウトを行います。
     入力待ちをせずに、次のイベントコマンドへと移行します。
    \set[n]         予め設定しておいた文字列 n 番に変換します。
    \save         現在のエフェクト、フォント、文字色、文字サイズ、文章表示の速度を記憶します。
    \load         \save で記憶した状態に変更します。
範本
メッセージエフェクト.zip (1.45 MB, 下载次数: 50)


另一個
http://www.whiteflute.org/wfrgss ... C%E3%83%B3%E3%82%B9


メッセージエフェクト ver. 1.3.4[pre lang="ruby"]=begin

▼ メッセージエフェクト ver. 1.3.4

RPGツクールVXAce用スクリプト

制作 : 木星ペンギン
URL  : http://woodpenguin.blog.fc2.com/

------------------------------------------------------------------------------
概要

□ メッセージを表示する際、ちょっとした演出を行います。

------------------------------------------------------------------------------
機能説明

□ スキップ機能
  ・シフトキーを押しっぱなしにすることで、文章をメッセージを
   スキップすることができます。
  ・これはイベントが始まってからシフトキーを押すと機能します。
   押しながらイベントを開始しても、いきなりスキップすることはありません。

□ エフェクトの種類
   0 : 文字が右にスライドしながら浮かび上がる演出を行います。
   1 : 文字が下にスライドしながら浮かび上がる演出を行います。
   2 : 文字が上にスライドしながら浮かび上がる演出を行います。
   3 : 文字が左にスライドしながら浮かび上がる演出を行います。
   4 : スライドせずに浮かび上がる演出を行います。
   5 : 文字が拡大していく演出が加えられます。
   6 : 文字が回転する演出が加えられます。
   
   上記以外 : カスタム (スクリプト自作用)

□ 制御文字
   \sp[n]   : 文章の表示速度を秒間 n 文字に変更します。
              デフォルト値は 60 です。
              0 にすると瞬間表示となります。
   \a       : スキップ機能や、決定キーによる文章の瞬間表示を無効化します。
   \et[n]   : エフェクトの種類を n 番に変更します。
   \ed[n]   : エフェクトの時間を n フレームに変更します。
   \font[n] : フォントを番号 n に対応したものに変更します。
              0 でデフォルトのフォントに戻します。
   \df      : エフェクト、フォント、文字色、文字サイズ、文章表示の速度を
              デフォルトの値に戻します。
   \fo[n]   : n フレームかけて文章のフェードアウトを行います。
              入力待ちをせずに、次のイベントコマンドへと移行します。
   \set[n]  : 予め設定しておいた文字列 n 番に変換します。
   \save    : 現在のエフェクト、フォント、文字色、文字サイズ、文章表示の速度を
              記憶します。
   \load    : \save で記憶した状態に変更します。

=end
module WdTk
module MesEff
#//////////////////////////////////////////////////////////////////////////////
#
# 設定項目
#
#//////////////////////////////////////////////////////////////////////////////
  #--------------------------------------------------------------------------
  # ● スキップの有効状態
  #     false で無効化できます。
  #--------------------------------------------------------------------------
  SKIP = true
  
  #--------------------------------------------------------------------------
  # ● エフェクトの種類のデフォルト値
  #--------------------------------------------------------------------------
  TYPE = 0
  
  #--------------------------------------------------------------------------
  # ● エフェクトの時間のデフォルト値
  #     エフェクトの種類を 5 以上にする場合は、増やしたほうがいいです。
  #     (24 ~ 32 くらいがおすすめ)
  #--------------------------------------------------------------------------
  DURATION = 6
  
  #--------------------------------------------------------------------------
  # ● フォント
  #     配列にフォント名を入れ、制御文字で \font[n] と入れることで、
  #     n 番目のフォントに変更されます。
  #     0 はデフォルトに戻すのに使用します。
  #--------------------------------------------------------------------------
  FONTS = [nil, "MS ゴシック"]
  
  #--------------------------------------------------------------------------
  # ● 文字列のセット
  #     制御文字を入れる場合は、ダブルクォート(")ではなく
  #     シングルクォート(')を使ってください。
  #     例 : \set[0] で下記の文字列に置き換わります。
  #--------------------------------------------------------------------------
  ESC_SET = ['\a\sp[15]\ed[12]',     # 0
             ]
  
  #--------------------------------------------------------------------------
  # ● 文字スプライトへのエフェクト
  #  ※ スクリプトが組める人向け
  #     sprite   : 文字スプライト
  #     duration : エフェクトの残り時間
  #     max      : エフェクトの時間
  #     type     : エフェクトの種類
  #   スプライトの x, y, z, bitmap は変更しないでください。
  #--------------------------------------------------------------------------
  def self.effect(sprite, duration, max, type, pos)
    case type
    when 0,1,2,3,4
      sprite.opacity = 256 * (max - duration) / max
      origin = (2 + max * 2 / 3) * duration / max
      case type
      when 0; sprite.ox = origin
      when 1; sprite.oy = origin
      when 2; sprite.oy = -origin
      when 3; sprite.ox = -origin
      end
    when 5,6
      sprite.opacity = 256
      m = (max - max / 4) ** 2
      n = m - (max / 4) ** 2
      return if n == 0
      c = m - (duration - max / 4) ** 2
      sprite.zoom_x = sprite.zoom_y = 1.0 * c / n
      sprite.angle = 90.0 * (n - c) / n if type == 6
    else # カスタム用
      
    end
  end
end

#//////////////////////////////////////////////////////////////////////////////
#
# 以降、変更する必要なし
#
#//////////////////////////////////////////////////////////////////////////////

  @material ||= []
  @material << :MesEff
  def self.include?(sym)
    @material.include?(sym)
  end
  
end

#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message
  #--------------------------------------------------------------------------
  # ○ オブジェクト初期化
  #--------------------------------------------------------------------------
  alias _wooden_meseff_initialize initialize
  def initialize
    @character_sprites = {}
    _wooden_meseff_initialize
  end
  #--------------------------------------------------------------------------
  # ● X 座標の設定
  #--------------------------------------------------------------------------
  def x=(x)
    super
    sx = self.x - x
    @character_sprites.each_key {|sprite| sprite.x += sx } if sx != 0
  end
  #--------------------------------------------------------------------------
  # ● Y 座標の設定
  #--------------------------------------------------------------------------
  def y=(y)
    super
    sy = self.y - y
    @character_sprites.each_key {|sprite| sprite.y += sy } if sy != 0
  end
  #--------------------------------------------------------------------------
  # ● Z 座標の設定
  #--------------------------------------------------------------------------
  def z=(z)
    super
    @character_sprites.each_key {|sprite| sprite.z = z }
  end
  #--------------------------------------------------------------------------
  # ○ 解放
  #--------------------------------------------------------------------------
  alias _wooden_meseff_dispose dispose
  def dispose
    _wooden_meseff_dispose
    dispose_character_sprites
  end
  #--------------------------------------------------------------------------
  # ● 文字スプライトの解放
  #--------------------------------------------------------------------------
  def dispose_character_sprites
    @character_sprites.each_key do |sprite|
      sprite.bitmap.dispose if sprite.bitmap
      sprite.dispose
    end
    @character_sprites.clear
  end
  #--------------------------------------------------------------------------
  # ● フォント設定のリセット
  #--------------------------------------------------------------------------
  def reset_font_settings
    super
    contents.font.name = Font.default_name
  end
  #--------------------------------------------------------------------------
  # ○ フラグのクリア
  #--------------------------------------------------------------------------
  alias _wooden_meseff_clear_flags clear_flags
  def clear_flags
    _wooden_meseff_clear_flags
    clear_wooden_flags
    @auto = false
    @count = 0
  end
  #--------------------------------------------------------------------------
  # ● オリジナルフラグのクリア
  #--------------------------------------------------------------------------
  def clear_wooden_flags
    @effect_type = WdTk::MesEff::TYPE
    @effect_duration = WdTk::MesEff::DURATION
    @speed = 60
  end
  #--------------------------------------------------------------------------
  # ○ フレーム更新
  #--------------------------------------------------------------------------
  alias _wooden_meseff_update update
  def update
    _wooden_meseff_update
    update_character_sprites
    if $game_party.in_battle
      @message_skip &&= $game_troop.interpreter.running?
    else
      @message_skip &&= $game_map.interpreter.running?
    end
  end
  #--------------------------------------------------------------------------
  # ● 文字スプライトの更新
  #--------------------------------------------------------------------------
  def update_character_sprites
    @character_sprites.each do |sprite, params|
      next if params.empty?
      params[0] = (@show_fast ? 0 : params[0] - 1)
      if params[0] > 0
        WdTk::MesEff.effect(sprite, *params)
      else
        x = sprite.x - self.x - padding
        y = sprite.y - self.y - padding
        contents.blt(x, y, sprite.bitmap, sprite.src_rect)
        sprite.bitmap.clear
        sprite.visible = false
        params.clear
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 制御文字の事前変換
  #--------------------------------------------------------------------------
  def convert_escape_characters(*)
    result = super
    result.gsub!(/\eSET\[(\d+)\]/i) { ESC_SET[$1.to_i].to_s.gsub(/\\/, "\e") }
    result
  end
  #--------------------------------------------------------------------------
  # ○ ファイバーのメイン処理
  #--------------------------------------------------------------------------
  alias _wooden_meseff_fiber_main fiber_main
  def fiber_main
    _wooden_meseff_fiber_main
    dispose_character_sprites
  end
  #--------------------------------------------------------------------------
  # ○ 全テキストの処理
  #--------------------------------------------------------------------------
  alias _wooden_meseff_process_all_text process_all_text
  def process_all_text
    _wooden_meseff_process_all_text
    Fiber.yield until @show_fast || @character_sprites.all? {|*,p| p.empty? }
  end
  #--------------------------------------------------------------------------
  # ○ 早送りフラグの更新
  #--------------------------------------------------------------------------
  alias _wooden_meseff_update_show_fast update_show_fast
  def update_show_fast
    return if @auto
    _wooden_meseff_update_show_fast
    @message_skip ||= WdTk::MesEff::SKIP && Input.trigger?(:A)
    @show_fast ||= @message_skip && Input.press?(:A)
  end
  #--------------------------------------------------------------------------
  # ● ウェイト (文章表示中)
  #--------------------------------------------------------------------------
  def wait_message(duration)
    duration.times do
      update_show_fast
      return if @show_fast
      Fiber.yield
    end
  end
  #--------------------------------------------------------------------------
  # ○ 一文字出力後のウェイト
  #--------------------------------------------------------------------------
  alias _wooden_meseff_wait_for_one_character wait_for_one_character
  def wait_for_one_character
    while @count < 60
      _wooden_meseff_wait_for_one_character
      @count += @speed
    end
    @count -= 60
  end
  #--------------------------------------------------------------------------
  # ○ 改ページ処理
  #--------------------------------------------------------------------------
  alias _wooden_meseff_new_page new_page
  def new_page(text, pos)
    self.contents_opacity = 255
    _wooden_meseff_new_page(text, pos)
  end
  #--------------------------------------------------------------------------
  # ☆ 通常文字の処理
  #--------------------------------------------------------------------------
  def process_normal_character(c, pos)
    return super if @show_fast || @speed == 0
    sprite = get_empty_sprite(pos)
    sprite.bitmap.font = contents.font.dup
    text_width = text_size(c).width
    sprite.bitmap.draw_text(0, 0, text_width * 2, pos[:height], c)
    pos[:x] += text_width
    wait_for_one_character
  end
  #--------------------------------------------------------------------------
  # ☆ 制御文字によるアイコン描画の処理
  #--------------------------------------------------------------------------
  def process_draw_icon(icon_index, pos)
    return super if @show_fast || @speed == 0
    sprite = get_empty_sprite(pos)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    sprite.bitmap.blt(0, 0, bitmap, rect)
    pos[:x] += 24
    wait_for_one_character
  end
  #--------------------------------------------------------------------------
  # ● 使用していない文字スプライトの取得
  #--------------------------------------------------------------------------
  def get_empty_sprite(pos)
    sprite, = @character_sprites.find {|*,p| p.empty? }
    if sprite
      sprite.visible = true
      if sprite.bitmap.height < pos[:height]
        sprite.bitmap.dispose
        sprite.bitmap = nil
      end
    else
      sprite = Sprite.new(viewport)
      sprite.z = self.z
    end
    sprite.bitmap ||= Bitmap.new(pos[:height], pos[:height])
    params = []
    params << @effect_duration << @effect_duration
    params << @effect_type
    params << pos.dup
    @character_sprites[sprite] = params
    sprite.x = self.x + self.padding + pos[:x]
    sprite.y = self.y + self.padding + pos[:y]
    sprite.ox = sprite.oy = 0
    sprite.angle = 0
    sprite.zoom_x = sprite.zoom_y = 1.0
    sprite.opacity = 0
    sprite
  end
  #--------------------------------------------------------------------------
  # ◯ 制御文字の処理
  #--------------------------------------------------------------------------
  alias _wooden_meseff_process_escape_character process_escape_character
  def process_escape_character(code, text, pos)
    case code.upcase
    when '.'
      wait_message(15) unless @show_fast
    when '|'
      wait_message(60) unless @show_fast
    when 'SP'
      @speed = obtain_escape_param(text)
    when 'A'
      @auto = true
    when 'ET'
      @effect_type = obtain_escape_param(text)
    when 'ED'
      @effect_duration = obtain_escape_param(text)
    when 'FONT'
      process_font(obtain_escape_param(text))
    when 'DF'
      process_default
    when 'FO'
      process_fadeout(obtain_escape_param(text))
    when 'SAVE'
      process_save
    when 'LOAD'
      process_load
    else
      _wooden_meseff_process_escape_character(code, text, pos)
    end
  end
  #--------------------------------------------------------------------------
  # ● フォント変更の処理
  #--------------------------------------------------------------------------
  def process_font(index)
    contents.font.name = WdTk::MesEff::FONTS[index] || Font.default_name
  end
  #--------------------------------------------------------------------------
  # ● デフォルトの処理
  #--------------------------------------------------------------------------
  def process_default
    reset_font_settings
    clear_wooden_flags
    @line_show_fast = false
  end
  #--------------------------------------------------------------------------
  # ● フェードアウトの処理
  #--------------------------------------------------------------------------
  def process_fadeout(duration)
    duration.times do |i|
      self.contents_opacity = 256 * (duration - i - 1) / duration
      Fiber.yield
    end
    @pause_skip = true
  end
  #--------------------------------------------------------------------------
  # ● セーブの処理
  #--------------------------------------------------------------------------
  def process_save
    @save_font            = contents.font.dup
    @save_effect_type     = @effect_type
    @save_effect_duration = @effect_duration
    @save_speed           = @speed
    @save_line_show_fast  = @line_show_fast
  end
  #--------------------------------------------------------------------------
  # ● ロードの処理
  #--------------------------------------------------------------------------
  def process_load
    contents.font    = @save_font.dup        if @save_font
    @effect_type     = @save_effect_type     if @save_effect_type
    @effect_duration = @save_effect_duration if @save_effect_duration
    @speed           = @save_speed           if @save_speed
    @line_show_fast  = @save_line_show_fast  if @save_line_show_fast != nil
  end
  #--------------------------------------------------------------------------
  # ☆ 入力待ち処理
  #--------------------------------------------------------------------------
  def input_pause
    self.pause = true
    wait(10)
    until Input.trigger?(:B) || Input.trigger?(:C) || (@message_skip && Input.press?(:A))
      Fiber.yield
      @message_skip ||= WdTk::MesEff::SKIP && Input.trigger?(:A)
    end
    Input.update
    self.pause = false
  end
end
[/pre]

点评

恩,感谢!脚本挺好的。不过我想看看自己能不能把脚本写出来~  发表于 2015-6-29 18:51
回复

使用道具 举报

梦石
3
星屑
195
在线时间
246 小时
注册时间
2013-10-19
回帖
85
 楼主| 发表于 2015-6-29 18:45:05 | 显示全部楼层
本帖最后由 漫天游弋 于 2015-6-29 18:49 编辑

这样啊,我以为是运行到哪行就会执行哪行的代码oez,不过如果分开的话也也有一个问题呢
中间得隔一个对话框下一句才能恢复正常呢。有什么办法避免么?( ´ρ`)
就像这样:
偷懒大法one和Test测试的对话框是黑体,偷懒大法tow显示就是正常的微软雅黑
test.png
脚本代码:
[pre lang="ruby"]class Game_Interpreter
  def 偷懒大法one
  $game_variables[97] = 1
  n=$game_variables[18] #当前周目数
  s=[]
  s[0]="△";
  for i in 1..12
    s="△";       
    s=s+s[i-1];
  end
  $game_message.add(s[n-1]) #显示三角形的数量
  
  end #def

  def 偷懒大法tow
   
  $game_variables[97] = 0
  $game_message.add(sprintf("纸张上画了%d个三角形,我是什么时候画的呢。。",
  $game_variables[18]))
  
  end #def

end   #class[/pre]
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-6-29 19:31:02 | 显示全部楼层
漫天游弋 发表于 2015-6-29 18:45
这样啊,我以为是运行到哪行就会执行哪行的代码oez,不过如果分开的话也也有一个问题呢
中间得隔一个对话框 ...


中间加一行 wait_for_message # 未测试

点评

可行,感谢!唯一的缺陷就是必须得分成两个方法= =  发表于 2015-6-29 20:05
回复

使用道具 举报

梦石
1
星屑
23246
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2015-6-29 19:37:56 | 显示全部楼层
试试这个

rpg.blue/home.php?mod=space&uid=291206&do=blog&id=13409

点评

恩恩,可以了!感谢大大0v0  发表于 2015-6-29 20:33
没有其他转义的话,强烈建议使用单引号,没这么多破事  发表于 2015-6-29 20:20
可以用转义字符的,用双引号的话记得 \\  发表于 2015-6-29 20:19
事件里可用,不过这样的话我写的脚本就没法用了,在$game_message.add()里好像用不了转义字符  发表于 2015-6-29 20:08

评分

参与人数 1星屑 +400 收起 理由
taroxd + 400 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部