查看: 70|回复: 0

[转载发布] 华丽的电影式对话效果

[复制链接]
  • TA的每日心情
    开心
    7 天前
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月三日(秋) | 显示全部楼层 |阅读模式
    【灵感来源】http://rpg.blue/thread-190972-2-1.htmllichenggmm)
    【兼容范围】暂时只适合默认对话框脚本,用其他对话框的同学可以提一下~
    【内容解释】其实就是柳子那部游戏里的那个效果~看图不解释~另外文字会自动排在中间~
    【使用方法】首先把这个脚本插入到Main前,接着把开关8打开(这个8对应脚本里的Swi),然后把对话框设置为下面那样就行了~

    1. #==============================================================================# ■ Window_Message#------------------------------------------------------------------------------#  显示文章的信息窗口。#==============================================================================class Window_Message < Window_Selectable  #——控制电影对话的内容  Swi = 8 # 开关  Lv31_Y = 400 # 位置  #——分割分割分割分割线  #--------------------------------------------------------------------------  # ● 初始化状态  #--------------------------------------------------------------------------  def initialize    super(80, 304, 480, 160)    self.contents = Bitmap.new(width - 32, height - 32)    self.visible = false    self.z = 9998    @fade_in = false    @fade_out = false    @contents_showing = false    @cursor_width = 0    self.active = false    self.index = -1  end  #--------------------------------------------------------------------------  # ● 释放  #--------------------------------------------------------------------------  def dispose    terminate_message    $game_temp.message_window_showing = false    if @input_number_window != nil      @input_number_window.dispose    end    super  end  #--------------------------------------------------------------------------  # ● 处理信息结束  #--------------------------------------------------------------------------  def terminate_message    self.active = false    self.pause = false    self.index = -1    self.contents.clear    # 清除显示中标志    @contents_showing = false    # 呼叫信息调用    if $game_temp.message_proc != nil      $game_temp.message_proc.call    end    # 清除文章、选择项、输入数值的相关变量    $game_temp.message_text = nil    $game_temp.message_proc = nil    $game_temp.choice_start = 99    $game_temp.choice_max = 0    $game_temp.choice_cancel_type = 0    $game_temp.choice_proc = nil    $game_temp.num_input_start = 99    $game_temp.num_input_variable_id = 0    $game_temp.num_input_digits_max = 0    # 开放金钱窗口    if @gold_window != nil      @gold_window.dispose      @gold_window = nil    end  end  #--------------------------------------------------------------------------  # ● 刷新  #--------------------------------------------------------------------------  def refresh    self.contents.clear    self.contents.font.color = normal_color    x = y = 0    @cursor_width = 0    # 到选择项的下一行字    if $game_temp.choice_start == 0      x = 8    end    # 有等待显示的文字的情况下    if $game_temp.message_text != nil      text = $game_temp.message_text      # 限制文字处理      begin        last_text = text.clone        text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }      end until text == last_text      text.gsub!(/\\[Nn]\[([0-9]+)\]/) do        $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""      end      if $game_switches[Swi]        lv31_text = text.clone        lv31_text.gsub!(/\\\\/) { "" }        lv31_text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "" }        lv31_text.gsub!(/\\[Gg]/) { "" }        lv31_width = []        lv31_2 = 0        for lv31 in lv31_text.split("\n")          lv31_width[lv31_2] = self.contents.text_size(lv31).width          lv31_2 += 1        end        x += 240 - 16 - lv31_width[y] / 2 if $game_switches[Swi] and lv31_width[y] != nil      end      # 为了方便、将 "\\\" 变换为 "\000"       text.gsub!(/\\\\/) { "\000" }      # "\\C" 变为 "\001" 、"\\G" 变为 "\002"      text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }      text.gsub!(/\\[Gg]/) { "\002" }      # c 获取 1 个字 (如果不能取得文字就循环)      while ((c = text.slice!(/./m)) != nil)        # \\ 的情况下        if c == "\000"          # 还原为本来的文字          c = "\"        end        # \C[n] 的情况下        if c == "\001"          # 更改文字色          text.sub!(/\[([0-9]+)\]/, "")          color = $1.to_i          if color >= 0 and color = 128 ? 32 : 384            end            @gold_window.opacity = self.opacity            @gold_window.back_opacity = self.back_opacity          end          # 下面的文字          next        end        # 另起一行文字的情况下        if c == "\n"          # 刷新选择项及光标的高          if y >= $game_temp.choice_start            @cursor_width = [@cursor_width, x].max          end          # y 加 1          y += 1          x = 0          # 移动到选择项的下一行          if y >= $game_temp.choice_start            x = 8          end          x += 240 - 16 - lv31_width[y] / 2 if $game_switches[Swi] and lv31_width[y] != nil          # 下面的文字          next        end        # 描绘文字        self.contents.draw_text(4 + x, 32 * y, 40, 32, c)        # x 为要描绘文字的加法运算        x += self.contents.text_size(c).width      end    end    # 选择项的情况    if $game_temp.choice_max > 0      @item_max = $game_temp.choice_max      self.active = true      self.index = 0    end    # 输入数值的情况    if $game_temp.num_input_variable_id > 0      digits_max = $game_temp.num_input_digits_max      number = $game_variables[$game_temp.num_input_variable_id]      @input_number_window = Window_InputNumber.new(digits_max)      @input_number_window.number = number      @input_number_window.x = self.x + 8      @input_number_window.y = self.y + $game_temp.num_input_start * 32    end  end  #--------------------------------------------------------------------------  # ● 设置窗口位置与不透明度  #--------------------------------------------------------------------------  def reset_window    if $game_temp.in_battle      self.y = 16    else      case $game_system.message_position      when 0  # 上        #——调整这里        self.y = 16        #——分割分割      when 1  # 中        self.y = 160      when 2  # 下        self.y = 304        self.y = Lv31_Y if $game_switches[Swi]      end    end    if $game_system.message_frame == 0      self.opacity = 255    else      self.opacity = 0    end    self.back_opacity = 160  end  #--------------------------------------------------------------------------  # ● 刷新画面  #--------------------------------------------------------------------------  def update    super    # 渐变的情况下    if @fade_in      self.contents_opacity += 24      if @input_number_window != nil        @input_number_window.contents_opacity += 24      end      if self.contents_opacity == 255        @fade_in = false      end      return    end    # 输入数值的情况下    if @input_number_window != nil      @input_number_window.update      # 确定      if Input.trigger?(Input::C)        $game_system.se_play($data_system.decision_se)        $game_variables[$game_temp.num_input_variable_id] =          @input_number_window.number        $game_map.need_refresh = true        # 释放输入数值窗口        @input_number_window.dispose        @input_number_window = nil        terminate_message      end      return    end    # 显示信息中的情况下    if @contents_showing      # 如果不是在显示选择项中就显示暂停标志      if $game_temp.choice_max == 0        self.pause = true      end      # 取消      if Input.trigger?(Input::B)        if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0          $game_system.se_play($data_system.cancel_se)          $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)          terminate_message        end      end      # 确定      if Input.trigger?(Input::C)        if $game_temp.choice_max > 0          $game_system.se_play($data_system.decision_se)          $game_temp.choice_proc.call(self.index)        end        terminate_message      end      return    end    # 在渐变以外的状态下有等待显示的信息与选择项的场合    if @fade_out == false and $game_temp.message_text != nil      @contents_showing = true      $game_temp.message_window_showing = true      reset_window      refresh      Graphics.frame_reset      self.visible = true      self.contents_opacity = 0      if @input_number_window != nil        @input_number_window.contents_opacity = 0      end      @fade_in = true      return    end    # 没有可以显示的信息、但是窗口为可见的情况下    if self.visible      @fade_out = true      self.opacity -= 48      if self.opacity == 0        self.visible = false        @fade_out = false        $game_temp.message_window_showing = false      end      return    end  end  #--------------------------------------------------------------------------  # ● 刷新光标矩形  #--------------------------------------------------------------------------  def update_cursor_rect    if @index >= 0      n = $game_temp.choice_start + @index      self.cursor_rect.set(8, n * 32, @cursor_width, 32)    else      self.cursor_rect.empty    end  endend复制代码
    复制代码
    ps上面这个图片,直接用事件里的“图片显示”就行了~

    再加个范例好了~

                 本帖来自P1论坛作者「旅」,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=191004  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

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

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-17 15:54 , Processed in 0.049222 second(s), 44 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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