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

Project1

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

[原创发布] 华丽的电影式对话效果

[复制链接]

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1530
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

跳转到指定楼层
1
发表于 2011-7-12 16:28:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 「旅」 于 2011-7-12 22:29 编辑

【灵感来源】http://rpg.blue/thread-190972-2-1.htmllichenggmm)
【兼容范围】暂时只适合默认对话框脚本,用其他对话框的同学可以提一下~
【内容解释】其实就是柳子那部游戏里的那个效果~看图不解释~另外文字会自动排在中间~
【使用方法】首先把这个脚本插入到Main前,接着把开关8打开(这个8对应脚本里的Swi),然后把对话框设置为下面那样就行了~

  1. #==============================================================================
  2. # ■ Window_Message
  3. #------------------------------------------------------------------------------
  4. #  显示文章的信息窗口。
  5. #==============================================================================

  6. class Window_Message < Window_Selectable
  7.   #——控制电影对话的内容
  8.   Swi = 8 # 开关
  9.   Lv31_Y = 400 # 位置
  10.   #——分割分割分割分割线
  11.   #--------------------------------------------------------------------------
  12.   # ● 初始化状态
  13.   #--------------------------------------------------------------------------
  14.   def initialize
  15.     super(80, 304, 480, 160)
  16.     self.contents = Bitmap.new(width - 32, height - 32)
  17.     self.visible = false
  18.     self.z = 9998
  19.     @fade_in = false
  20.     @fade_out = false
  21.     @contents_showing = false
  22.     @cursor_width = 0
  23.     self.active = false
  24.     self.index = -1
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 释放
  28.   #--------------------------------------------------------------------------
  29.   def dispose
  30.     terminate_message
  31.     $game_temp.message_window_showing = false
  32.     if @input_number_window != nil
  33.       @input_number_window.dispose
  34.     end
  35.     super
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 处理信息结束
  39.   #--------------------------------------------------------------------------
  40.   def terminate_message
  41.     self.active = false
  42.     self.pause = false
  43.     self.index = -1
  44.     self.contents.clear
  45.     # 清除显示中标志
  46.     @contents_showing = false
  47.     # 呼叫信息调用
  48.     if $game_temp.message_proc != nil
  49.       $game_temp.message_proc.call
  50.     end
  51.     # 清除文章、选择项、输入数值的相关变量
  52.     $game_temp.message_text = nil
  53.     $game_temp.message_proc = nil
  54.     $game_temp.choice_start = 99
  55.     $game_temp.choice_max = 0
  56.     $game_temp.choice_cancel_type = 0
  57.     $game_temp.choice_proc = nil
  58.     $game_temp.num_input_start = 99
  59.     $game_temp.num_input_variable_id = 0
  60.     $game_temp.num_input_digits_max = 0
  61.     # 开放金钱窗口
  62.     if @gold_window != nil
  63.       @gold_window.dispose
  64.       @gold_window = nil
  65.     end
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 刷新
  69.   #--------------------------------------------------------------------------
  70.   def refresh
  71.     self.contents.clear
  72.     self.contents.font.color = normal_color
  73.     x = y = 0
  74.     @cursor_width = 0
  75.     # 到选择项的下一行字
  76.     if $game_temp.choice_start == 0
  77.       x = 8
  78.     end
  79.     # 有等待显示的文字的情况下
  80.     if $game_temp.message_text != nil
  81.       text = $game_temp.message_text
  82.       # 限制文字处理
  83.       begin
  84.         last_text = text.clone
  85.         text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  86.       end until text == last_text
  87.       text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  88.         $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  89.       end
  90.       if $game_switches[Swi]
  91.         lv31_text = text.clone
  92.         lv31_text.gsub!(/\\\\/) { "" }
  93.         lv31_text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "" }
  94.         lv31_text.gsub!(/\\[Gg]/) { "" }
  95.         lv31_width = []
  96.         lv31_2 = 0
  97.         for lv31 in lv31_text.split("\n")
  98.           lv31_width[lv31_2] = self.contents.text_size(lv31).width
  99.           lv31_2 += 1
  100.         end
  101.         x += 240 - 16 - lv31_width[y] / 2 if $game_switches[Swi] and lv31_width[y] != nil
  102.       end
  103.       # 为了方便、将 "\\\\" 变换为 "\000"
  104.       text.gsub!(/\\\\/) { "\000" }
  105.       # "\\C" 变为 "\001" 、"\\G" 变为 "\002"
  106.       text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  107.       text.gsub!(/\\[Gg]/) { "\002" }
  108.       # c 获取 1 个字 (如果不能取得文字就循环)
  109.       while ((c = text.slice!(/./m)) != nil)
  110.         # \\ 的情况下
  111.         if c == "\000"
  112.           # 还原为本来的文字
  113.           c = "\\"
  114.         end
  115.         # \C[n] 的情况下
  116.         if c == "\001"
  117.           # 更改文字色
  118.           text.sub!(/\[([0-9]+)\]/, "")
  119.           color = $1.to_i
  120.           if color >= 0 and color <= 7
  121.             self.contents.font.color = text_color(color)
  122.           end
  123.           # 下面的文字
  124.           next
  125.         end
  126.         # \G 的情况下
  127.         if c == "\002"
  128.           # 生成金钱窗口
  129.           if @gold_window == nil
  130.             @gold_window = Window_Gold.new
  131.             @gold_window.x = 560 - @gold_window.width
  132.             if $game_temp.in_battle
  133.               @gold_window.y = 192
  134.             else
  135.               @gold_window.y = self.y >= 128 ? 32 : 384
  136.             end
  137.             @gold_window.opacity = self.opacity
  138.             @gold_window.back_opacity = self.back_opacity
  139.           end
  140.           # 下面的文字
  141.           next
  142.         end
  143.         # 另起一行文字的情况下
  144.         if c == "\n"
  145.           # 刷新选择项及光标的高
  146.           if y >= $game_temp.choice_start
  147.             @cursor_width = [@cursor_width, x].max
  148.           end
  149.           # y 加 1
  150.           y += 1
  151.           x = 0
  152.           # 移动到选择项的下一行
  153.           if y >= $game_temp.choice_start
  154.             x = 8
  155.           end
  156.           x += 240 - 16 - lv31_width[y] / 2 if $game_switches[Swi] and lv31_width[y] != nil
  157.           # 下面的文字
  158.           next
  159.         end
  160.         # 描绘文字
  161.         self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
  162.         # x 为要描绘文字的加法运算
  163.         x += self.contents.text_size(c).width
  164.       end
  165.     end
  166.     # 选择项的情况
  167.     if $game_temp.choice_max > 0
  168.       @item_max = $game_temp.choice_max
  169.       self.active = true
  170.       self.index = 0
  171.     end
  172.     # 输入数值的情况
  173.     if $game_temp.num_input_variable_id > 0
  174.       digits_max = $game_temp.num_input_digits_max
  175.       number = $game_variables[$game_temp.num_input_variable_id]
  176.       @input_number_window = Window_InputNumber.new(digits_max)
  177.       @input_number_window.number = number
  178.       @input_number_window.x = self.x + 8
  179.       @input_number_window.y = self.y + $game_temp.num_input_start * 32
  180.     end
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● 设置窗口位置与不透明度
  184.   #--------------------------------------------------------------------------
  185.   def reset_window
  186.     if $game_temp.in_battle
  187.       self.y = 16
  188.     else
  189.       case $game_system.message_position
  190.       when 0  # 上
  191.         #——调整这里
  192.         self.y = 16
  193.         #——分割分割
  194.       when 1  # 中
  195.         self.y = 160
  196.       when 2  # 下
  197.         self.y = 304
  198.         self.y = Lv31_Y if $game_switches[Swi]
  199.       end
  200.     end
  201.     if $game_system.message_frame == 0
  202.       self.opacity = 255
  203.     else
  204.       self.opacity = 0
  205.     end
  206.     self.back_opacity = 160
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 刷新画面
  210.   #--------------------------------------------------------------------------
  211.   def update
  212.     super
  213.     # 渐变的情况下
  214.     if @fade_in
  215.       self.contents_opacity += 24
  216.       if @input_number_window != nil
  217.         @input_number_window.contents_opacity += 24
  218.       end
  219.       if self.contents_opacity == 255
  220.         @fade_in = false
  221.       end
  222.       return
  223.     end
  224.     # 输入数值的情况下
  225.     if @input_number_window != nil
  226.       @input_number_window.update
  227.       # 确定
  228.       if Input.trigger?(Input::C)
  229.         $game_system.se_play($data_system.decision_se)
  230.         $game_variables[$game_temp.num_input_variable_id] =
  231.           @input_number_window.number
  232.         $game_map.need_refresh = true
  233.         # 释放输入数值窗口
  234.         @input_number_window.dispose
  235.         @input_number_window = nil
  236.         terminate_message
  237.       end
  238.       return
  239.     end
  240.     # 显示信息中的情况下
  241.     if @contents_showing
  242.       # 如果不是在显示选择项中就显示暂停标志
  243.       if $game_temp.choice_max == 0
  244.         self.pause = true
  245.       end
  246.       # 取消
  247.       if Input.trigger?(Input::B)
  248.         if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
  249.           $game_system.se_play($data_system.cancel_se)
  250.           $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
  251.           terminate_message
  252.         end
  253.       end
  254.       # 确定
  255.       if Input.trigger?(Input::C)
  256.         if $game_temp.choice_max > 0
  257.           $game_system.se_play($data_system.decision_se)
  258.           $game_temp.choice_proc.call(self.index)
  259.         end
  260.         terminate_message
  261.       end
  262.       return
  263.     end
  264.     # 在渐变以外的状态下有等待显示的信息与选择项的场合
  265.     if @fade_out == false and $game_temp.message_text != nil
  266.       @contents_showing = true
  267.       $game_temp.message_window_showing = true
  268.       reset_window
  269.       refresh
  270.       Graphics.frame_reset
  271.       self.visible = true
  272.       self.contents_opacity = 0
  273.       if @input_number_window != nil
  274.         @input_number_window.contents_opacity = 0
  275.       end
  276.       @fade_in = true
  277.       return
  278.     end
  279.     # 没有可以显示的信息、但是窗口为可见的情况下
  280.     if self.visible
  281.       @fade_out = true
  282.       self.opacity -= 48
  283.       if self.opacity == 0
  284.         self.visible = false
  285.         @fade_out = false
  286.         $game_temp.message_window_showing = false
  287.       end
  288.       return
  289.     end
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # ● 刷新光标矩形
  293.   #--------------------------------------------------------------------------
  294.   def update_cursor_rect
  295.     if @index >= 0
  296.       n = $game_temp.choice_start + @index
  297.       self.cursor_rect.set(8, n * 32, @cursor_width, 32)
  298.     else
  299.       self.cursor_rect.empty
  300.     end
  301.   end
  302. end
复制代码

ps上面这个图片,直接用事件里的“图片显示”就行了~

电影式对话.rar (715.01 KB, 下载次数: 1311) 再加个范例好了~

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2010-6-19
帖子
36
2
发表于 2011-7-12 16:52:14 | 只看该作者
就是加了最前面的一段话 其他的都没改 是吗?


lichenggmm于2011-7-12 18:45补充以下内容:
class Window_Message < Window_Selectable

  #——控制电影对话的内容

  Swi = 8 # 开关

  Lv31_Y = 400 # 位置

  #——分割分割分割分割线

点评

直接把这个插入到Main前就行了~  发表于 2011-7-12 20:23
不是的,里面还有改一些地方~  发表于 2011-7-12 18:50
是指脚本吗?  发表于 2011-7-12 18:12
哪段话?  发表于 2011-7-12 18:00
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
777
在线时间
1270 小时
注册时间
2011-2-14
帖子
5589
3
发表于 2011-7-12 19:49:47 | 只看该作者
话说默认对话框脚本好像也有两个版本……

点评

有两个版本吗><不知道……  发表于 2011-7-12 20:22
回复 支持 反对

使用道具 举报

Lv1.梦旅人

54酱是大笨蛋!

梦石
0
星屑
66
在线时间
1389 小时
注册时间
2011-2-23
帖子
5014
4
发表于 2011-7-12 20:05:43 | 只看该作者
懒散酱不是阿姨咩

点评

啊咧是吗?  发表于 2011-7-12 21:10
‘不过’和‘话说’不能连用..加逗号也不行...  发表于 2011-7-12 20:28
0 0是吗?不过,话说不要灌水的说><  发表于 2011-7-12 20:23

评分

参与人数 1星屑 -10 收起 理由
夕阳武士 -10 54酱,发布区不要水哦

查看全部评分

去你爹的现充.去你爹的异性恋.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
45 小时
注册时间
2011-6-6
帖子
70
5
发表于 2011-7-12 20:46:21 | 只看该作者
道理狠简单:改一下对齐方式而已  
对齐方式 (0..左对齐、1..中间对齐、2..右对齐)     引用Window_Help < Window_Base

点评

一直以来搞不明白文章脚本  发表于 2011-7-12 21:23
不过其实也很容易的,那个删控制符是不厚道直接复制来的><  发表于 2011-7-12 21:13
口胡~才没那么容易呢~首先要把/c[]和/n等控制符给删除掉,然后把x加上width除 2~因为对话框脚本是一个字一个字描绘的,所以不能直接用你说的那个哦~  发表于 2011-7-12 21:12
请问这里是地球吗?是的话告诉我人类在哪。我要灭了他们!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
176 小时
注册时间
2011-4-20
帖子
156
6
发表于 2011-7-12 21:49:54 | 只看该作者
各种不懂,还是默认简单。

点评

了该!~  发表于 2011-7-13 17:25
修改了~你再看看懂不懂~  发表于 2011-7-12 22:24
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
57 小时
注册时间
2011-7-10
帖子
25
7
发表于 2011-7-12 22:16:56 | 只看该作者
怎么用啊,说详细些。我还只知道用公共事件做这种效果,表示对脚本无能
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1530
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

8
 楼主| 发表于 2011-7-12 22:24:50 | 只看该作者
风华胥 发表于 2011-7-12 22:16
怎么用啊,说详细些。我还只知道用公共事件做这种效果,表示对脚本无能 ...

><好了我添加了一些内容,现在应该比较容易理解了~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
57 小时
注册时间
2011-7-10
帖子
25
9
发表于 2011-7-12 22:50:00 | 只看该作者
「旅」 发表于 2011-7-12 22:24
><好了我添加了一些内容,现在应该比较容易理解了~

哈哈,谢谢,明白了。不过范例里的事件要自动执行哦。

点评

啊忘记了~谢谢提醒~  发表于 2011-7-12 22:52
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
33 小时
注册时间
2011-7-2
帖子
70
10
发表于 2011-7-13 16:12:56 | 只看该作者
只是基本脚本,就连我只个新手都早已会了

点评

小旅酱是说我吗 = =  发表于 2011-8-2 10:06
只要有比你更新的新手不会就行~  发表于 2011-7-13 20:06
失败乃成功之母,努力努力!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 13:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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