Project1

标题: 请问,这种气泡对话框的使用教程是? [打印本页]

作者: 诺亚之城    时间: 2013-4-21 14:49
标题: 请问,这种气泡对话框的使用教程是?
本帖最后由 诺亚之城 于 2013-4-21 15:00 编辑

脚本不仅不能工作
还弹窗退出。

教程搜不到。
6R主站搜索的话显示一片空白。

fuki对话框的头像带着一个框,无法和说话的对话框融合,很难看……


抱歉……各位不用回答了,我还是用fuki吧,突然想到这种气泡对话框对我的游戏来说有很大的缺点,没办法使用。

http://rpg.blue/forum.php?mod=viewthread&tid=235892
  1. #===============================================================
  2. #
  3. #    呼出对话框 ver. 1.31 By パラ犬(日)
  4. #  来自 http://rpg.para.s3p.net/
  5. #
  6. #  汉化修改 66RPG bbschat(2006.1.5)
  7. #    来自
  8. #
  9. #    脚本更新:by KKME◎66RPG.com,2007年2月
  10. #    by 沉影不器
  11. #    modified by 熊的选民 chosen of bear
  12. #
  13. #===============================================================

  14. module FUKI

  15.   # 是否显示尾部图标
  16.   TAIL_SHOW = true

  17.   # Skin的设定
  18.   # 使用数据库默认窗口Skin情况下这里使用[""]
  19.   SAY_SKIN_NAME = "say"   # 呼出对话框用Skin
  20.   THINK_SKIN_NAME = "think"
  21.   VOICE_SKIN_NAME = "voiceover"

  22.   # 字体大小
  23.   MES_FONT_SIZE = GAME_FONT_SIZE    # 呼出对话框

  24.   # 字体颜色
  25.   #(设定为 Color.new(0, 0, 0, 0) 表示使用普通文字色)
  26.   FUKI_COLOR = Color.new(255, 255, 255, 255)  # 呼出对话框

  27.   # 窗口透明度
  28.   # 如修改窗口透明度请同时修改尾部箭头图形内部的透明度
  29.   FUKI_OPACITY = 255    # 呼出对话框
  30.   MES_OPACITY = 255     # 默认信息窗口

  31.   # 窗口表示时是否根据画面大小自动检查窗口出现的位置,
  32.   # 自动改变位置( true / false )
  33.   # 设置成 true 在某些变态情况下可能出现箭头图标颠倒的问题 <- bbschat <= KKME
  34.   POS_FIX = true

  35.   # 在画面最边缘表示时的稍微挪动
  36.   # 使用圆形Skin的角和方框的角重合的情况下为 true
  37.   CORNER_SHIFT = false
  38.   SHIFT_PIXEL = 4   # true 时挪动的象素

  39.   # 呼出对话框的相对位置(纵坐标)
  40.   POP_SHIFT_TOP = 0         # 表示位置为上的时候
  41.   POP_SHIFT_UNDER = 0       # 表示位置为下的时候

  42.   # 信息的表示速度(数字越小速度越快,0为瞬间表示)
  43.   # 游戏中 可随时用数字代入 $mes_speed 来改变消息表示速度。
  44.   MES_SPEED = 0
  45.   # 默认的文字自动消失时间为45帧
  46.   DEFAULT_AUTO_CLOSE_TIME = 45

  47.   FRAME_WIDTH = 5
  48.   HEAD_WIDTH = 100
  49.   FADE_IN_STEP = 48
  50.   FADE_OUT_STEP = 48
  51. end


  52. #===============================================================
  53. # 初始化两个变量,不要动(by KKME◎66RPG.com)
  54. #===============================================================
  55. $mes_center = -1


  56. #===============================================================
  57. # □ Game_Temp
  58. #===============================================================

  59. class Game_Temp
  60.   attr_accessor  :namebmp              #保存头像图片的Hash表
  61.   alias initialize_fuki initialize
  62.   def initialize
  63.     initialize_fuki
  64.     # 如果不想使用角色名字直接作为头像文件名
  65.     # 可在这里重新设定角色名字与文件名的对应关系
  66.     @namebmp = {}
  67.   end
  68. end

  69. #===============================================================
  70. # □ Window_Message
  71. #===============================================================

  72. class Window_Message < Window_Selectable
  73.   MARGIN_WIDTH = 0

  74.   #-----------------------------------------------------------
  75.   # ● 初始化状态
  76.   #-----------------------------------------------------------
  77.   def initialize
  78.     super(MARGIN_WIDTH, 304, 640 - MARGIN_WIDTH * 2, 160)
  79.     self.contents = Bitmap.new(width - 32, height - 32)
  80.     self.visible = false
  81.     self.z = 9998
  82.     @fade_in = false
  83.     @fade_out = false
  84.     @contents_showing = false
  85.     @cursor_width = 0
  86.     @kkme_name = ""
  87.     @head_name = nil
  88.     self.active = false
  89.     self.index = -1
  90.     [url=home.php?mod=space&uid=36110]@Wait[/url] = 0
  91.     @dx = 0
  92.     @dy = 0
  93.     @auto_close=-1
  94.     $mes_speed = FUKI::MES_SPEED
  95.     @think = false
  96.     skin = FUKI::SAY_SKIN_NAME != "" ? FUKI::SAY_SKIN_NAME : FUKI::VOICE_SKIN_NAME
  97.     self.windowskin = RPG::Cache.windowskin(skin)
  98.   end

  99.   #-----------------------------------------------------------
  100.   # ○ 决定窗口尺寸并生成窗口
  101.   #-----------------------------------------------------------
  102.   def refresh_create
  103.     [url=home.php?mod=space&uid=36110]@Wait[/url] = $mes_speed
  104.     @kkme_name = nil
  105.     @head_name = nil
  106.     @think = true
  107.     begin
  108.       temp = $game_temp.message_text.split("*")
  109.       if temp[1] != nil
  110.         @kkme_name = temp[0]
  111.         
  112.         @kkme_name.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  113.           $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  114.         end
  115.         
  116.         @head_name = @kkme_name.clone
  117.         @head_name.sub!(/([0-9])/,"")
  118.   
  119.         @kkme_name = @kkme_name.split("-")[0] if @kkme_name.size > 0
  120.         
  121.         if @kkme_name == ""
  122.           @head_name = $game_party.actors[0].name + @head_name
  123.           #@head_name = "华音" + @head_name
  124.         elsif @kkme_name.to_i != 0
  125.           @head_name = $game_party.actors[@kkme_name.to_i].name + @head_name
  126.         end
  127.         
  128.         if @head_name == "无"
  129.           @head_name = nil
  130.         end
  131.         
  132.         #@head_name = "我" if @head_name == "我"
  133.         
  134.         if temp[2] != nil
  135.           $game_temp.message_text = temp[2][1, temp[2].size]
  136.         else
  137.           @think = false
  138.           $game_temp.message_text = temp[1][1, temp[1].size]
  139.         end         

  140.         #$game_temp.message_text = $game_temp.message_text[@kkme_name.size + 2, $game_temp.message_text.size]
  141.       end
  142.     rescue
  143.     end
  144.       
  145.     self.contents.clear
  146.     self.contents.font.color = normal_color
  147.     self.contents.font.size = FUKI::MES_FONT_SIZE
  148.       
  149.     update_character
  150.    
  151.     #cob
  152.     if @character == nil
  153.       if $game_switches[31]
  154.         skin = $game_system.windowskin_name
  155.       else
  156.         skin = FUKI::VOICE_SKIN_NAME
  157.       end
  158.       #self.back_opacity = 180
  159.     elsif @think
  160.       skin = FUKI::THINK_SKIN_NAME != "" ? FUKI::THINK_SKIN_NAME : FUKI::VOICE_SKIN_NAME
  161.       #$game_temp.message_text = "(" + $game_temp.message_text + ")" unless $game_system.message_position == 1
  162.     else
  163.       skin = FUKI::SAY_SKIN_NAME != "" ? FUKI::SAY_SKIN_NAME : FUKI::VOICE_SKIN_NAME
  164.     end
  165.    
  166.     self.windowskin = RPG::Cache.windowskin(skin)
  167.    
  168.    
  169.     if @character != nil        
  170.       # 生成呼出窗口
  171.       set_fukidasi
  172.       # 生成角色名字窗口
  173.       set_namewindow if @head_name != nil
  174.     else
  175.       reset_window
  176.     end
  177.    
  178.     if $game_system.menu_disabled
  179.       self.pause = false
  180.       @auto_close = 20 + $game_temp.message_text.size * 2
  181.       @auto_close = 80 if @auto_close < 80        
  182.     end

  183.     # 初始化信息表示使用的变量
  184.     @dx = @dy = 0
  185.     @cursor_width = 0
  186.     @contents_drawing = true
  187.     # 瞬间表示的情况下
  188.     if $mes_speed == 0
  189.       # 循环信息描绘处理
  190.       while $game_temp.message_text != ""
  191.         draw_massage
  192.       end
  193.       draw_opt_text
  194.       @contents_showing_end = true
  195.       @contents_drawing = false
  196.     else
  197.       # 一个一个描绘文字
  198.       refresh_drawtext
  199.     end
  200.   end

  201.   #-----------------------------------------------------------
  202.   # ○ 一个一个描绘文字
  203.   #-----------------------------------------------------------
  204.   def refresh_drawtext
  205.     if $game_temp.message_text != nil
  206.       if [url=home.php?mod=space&uid=36110]@Wait[/url] > 0
  207.         [url=home.php?mod=space&uid=36110]@Wait[/url] -= 1
  208.         draw_massage
  209.         @wait = $mes_speed if @wait == 0
  210.       end
  211.     end
  212.     # 描绘结束
  213.     if $game_temp.message_text == ""
  214.       draw_opt_text
  215.       @contents_showing_end = true
  216.       @contents_drawing = false
  217.     end
  218.   end

  219.   #-----------------------------------------------------------
  220.   # ○ 取得窗口尺寸
  221.   #-----------------------------------------------------------
  222.   def update_window_size
  223.     x = y = 0
  224.     h = w = 0
  225.     @cursor_width = 0
  226.     # 有选择项的话,处理字的缩进
  227.     if $game_temp.choice_start == 0
  228.       x = 16
  229.     end
  230.     # 有等待显示的文字的情况下
  231.     if $game_temp.message_text != nil
  232.       text = $game_temp.message_text.clone

  233.       # 限制文字处理
  234.       begin
  235.         last_text = text.clone
  236.         text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  237.       end until text == last_text
  238.       text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  239.         $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  240.       end
  241.       # 为了方便、将 "\\\\" 变换为 "\000"
  242.       text.gsub!(/\\\\/) { "\000" }
  243.       # "\\C" 变为 "\001" 、"\\G" 变为 "\002"
  244.       text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001" }
  245.       text.gsub!(/\\[Gg]/) { "\002" }
  246.       text.gsub!(/\\[Oo]\[([0-9]+)\]/) { "\003[#{$1}]" }
  247.       text.slice!(/\\[Aa]\[(\w+)\]/) { "" }
  248.       # c 获取 1 个字 (如果不能取得文字就循环)
  249.       while ((c = text.slice!(/./m)) != nil)
  250.         # \\ 的情况下
  251.         if c == "\000"
  252.           # 还原为本来的文字
  253.           c = "\\"
  254.         end
  255.         # \C[n] 或者 \G 的情况下
  256.         if c == "\001" or c == "\002"
  257.           # 下面的文字
  258.           next
  259.         end
  260.         # 另起一行文字的情况下
  261.         if c == "\n"
  262.           # y 累加 1
  263.           y += 1
  264.           # 取得纵横尺寸
  265.           h = y
  266.           w = x > w ? x : w
  267.           if y >= $game_temp.choice_start
  268.             w = x + 8 > w ? x + 8 : w
  269.           end
  270.           x = 0
  271.           # 移动到选择项的下一行
  272.           if y >= $game_temp.choice_start
  273.             x = 8
  274.           end
  275.           # 下面的文字
  276.           next
  277.         end
  278.         # x 为要描绘文字的宽度加法运算
  279.         x += self.contents.text_size(c).width
  280.       end
  281.     end
  282.     # 输入数值的情况
  283.     if $game_temp.num_input_variable_id > 0
  284.       digits_max = $game_temp.num_input_digits_max
  285.       h += 1
  286.       x = digits_max * self.contents.font.size + 16
  287.       w = x > w ? x : w
  288.     end

  289.     w += 40
  290.     h = h * (self.contents.font.size + 10) + 26

  291.     #cob
  292.     if @head_name != nil
  293.       w += FUKI::HEAD_WIDTH + 8
  294.       min_h = FUKI::HEAD_WIDTH + 8 + FUKI::FRAME_WIDTH * 2
  295.       h = min_h if h < min_h
  296.     end
  297.    
  298.     #cob
  299.     if $game_system.message_frame == 1
  300.       h += 16
  301.     end

  302.     self.width = w
  303.     self.height = h
  304.   end

  305.   #-----------------------------------------------------------
  306.   # ○ 描绘信息处理
  307.   #-----------------------------------------------------------
  308.   def draw_massage
  309.     # 有等待显示的文字的情况下
  310.     if $game_temp.message_text != nil
  311.       text = $game_temp.message_text

  312.       #cob
  313.       if @head_name != nil
  314.         start_x = FUKI::HEAD_WIDTH + 8
  315.       elsif @tail != nil
  316.         start_x = 4
  317.       else
  318.         #start_x = 4
  319.         start_x = @text_x + 4 - MARGIN_WIDTH
  320.       end

  321.       # 限制文字处理
  322.       begin
  323.         last_text = text.clone
  324.         text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  325.       end until text == last_text
  326.       text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  327.         $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  328.       end
  329.       # 为了方便、将 "\\\\" 变换为 "\000"
  330.       text.gsub!(/\\\\/) { "\000" }
  331.       # "\\C" 变为 "\001"、"\\G" 变为 "\002"
  332.       text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  333.       text.gsub!(/\\[Gg]/) { "\002" }
  334.       text.gsub!(/\\[Oo]\[([0-9]+)\]/) { "\003[#{$1}]" }
  335.       if text.slice!(/\\[Aa]\[(\w+)\]/)!=nil
  336.         @auto_close=$1.to_i*10
  337.       elsif false
  338.         if text.slice!(/\\[Aa]/)!=nil
  339.           @auto_close = FUKI::DEFAULT_AUTO_CLOSE_TIME
  340.         end
  341.       end
  342.       # c 获取 1 个字
  343.       if $mes_speed == 0 or @wait == 0
  344.         c = text.slice!(/./m)
  345.       else
  346.         c = text[/./m]
  347.       end        
  348.       if c
  349.         # 选择项的情况
  350.         if @dy >= $game_temp.choice_start
  351.           # 处理字的缩进
  352.           @dx = 8
  353.           # 描绘文字
  354.           self.contents.draw_text(start_x + @dx, 32 * @dy, 40, 32, c)
  355.           # x 为要描绘文字宽度的加法运算
  356.           @dx += self.contents.text_size(c).width
  357.           # 循环
  358.           while ((c = text.slice!(/./m)) != "\n")
  359.             # 描绘文字
  360.             self.contents.draw_text(start_x + @dx, 32 * @dy, 40, 32, c)
  361.             # x 为要描绘文字宽度的加法运算
  362.             @dx += self.contents.text_size(c).width
  363.           end
  364.           if c == "\n"
  365.             # 更新光标宽度
  366.             @cursor_width = [@cursor_width, @dx].max
  367.             # dy 累加 1
  368.             @dy += 1
  369.             @dx = 0
  370.           end
  371.           return
  372.         end
  373.         # \\ 的情况下
  374.         if c == "\000"
  375.           # 还原为本来的文字
  376.           c = "\\"
  377.         end

  378.         #\C[n] 的情况下
  379.         if c == "\001"
  380.           # 更改文字色
  381.           text.sub!(/\[([0-9]+)\]/, "")
  382.           color = $1.to_i
  383.           if color >= 0 and color <= 7
  384.             self.contents.font.color = text_color(color)
  385.           end
  386.           return
  387.         end

  388.         # \G 的情况下
  389.         if c == "\002"
  390.           # 生成金钱窗口
  391.           if @gold_window == nil
  392.             @gold_window = Window_Gold.new
  393.             @gold_window.x = 560 - @gold_window.width
  394.             if $game_temp.in_battle
  395.               @gold_window.y = 192
  396.             else
  397.               @gold_window.y = self.y >= 128 ? 32 : 384
  398.             end
  399.             @gold_window.opacity = self.opacity
  400.             @gold_window.back_opacity = self.back_opacity
  401.           end
  402.           return
  403.         end

  404.         if c == "\003"
  405.           text.sub!(/\[([0-9]+)\]/, "")
  406.           self.contents.font.color.alpha = [[0, $1.to_i].max, 255].min
  407.           return
  408.         end

  409.         # 另起一行文字的情况下
  410.         if c == "\n"
  411.           if $mes_speed == 0 or @wait == 0
  412.             #dy 累加 1
  413.             @dy += 1
  414.             @dx = 0
  415.           end
  416.           return
  417.         end
  418.         
  419.         if $mes_speed == 0 or @wait == 0
  420.           self.contents.font.color.alpha = 255
  421.         else
  422.           #self.contents.font.color.alpha = 255 * ($mes_speed - @wait) / $mes_speed
  423.           self.contents.font.color.alpha = 255 / $mes_speed
  424.         end         

  425.         # 描绘文字
  426.         self.contents.font.size = FUKI::MES_FONT_SIZE
  427.         font_size = self.contents.font.size
  428.         self.contents.draw_text(start_x+@dx, (font_size+10)*@dy, font_size, font_size, c)
  429.         # dx 为要描绘文字的宽度加法运算
  430.         @dx += self.contents.text_size(c).width if $mes_speed == 0 or @wait == 0
  431.       end
  432.     end
  433.   end

  434.   #-----------------------------------------------------------
  435.   # ○ 选择项和输入数值的情况下
  436.   #-----------------------------------------------------------
  437.   def draw_opt_text
  438.     # 选择项的情况下
  439.     if $game_temp.choice_max > 0
  440.       @item_max = $game_temp.choice_max
  441.       self.active = true
  442.       self.index = 0
  443.     end
  444.     # 输入数值的情况下
  445.     if $game_temp.num_input_variable_id > 0
  446.       digits_max = $game_temp.num_input_digits_max
  447.       number = $game_variables[$game_temp.num_input_variable_id]
  448.       @input_number_window = Window_InputNumber.new(digits_max)
  449.       @input_number_window.number = number
  450.       @input_number_window.x = self.x + 8
  451.       @input_number_window.y = self.y + $game_temp.num_input_start * 32
  452.     end
  453.   end

  454.   #-----------------------------------------------------------
  455.   # ○ 设置呼出对话框
  456.   #-----------------------------------------------------------
  457.   def set_fukidasi


  458.       # 不显示暂停标志
  459.       self.pause = false

  460.       update_window_size
  461.       update_window_pos
  462.       
  463.       self.opacity = 0

  464.       self.contents.dispose
  465.       self.contents = Bitmap.new(width - 32, height - 32)
  466.       self.back_opacity = FUKI::FUKI_OPACITY
  467.       self.contents.clear
  468.       self.contents.font.color = normal_color
  469.       self.contents.font.size = FUKI::MES_FONT_SIZE
  470.       
  471.       # 描绘尾部图标
  472.       if $game_system.message_frame == 0 and FUKI::TAIL_SHOW == true and
  473.           @message_position != 1
  474.         @tail = Sprite.new        
  475.         @tail.z = self.z + 1
  476.         @tail.opacity = 0
  477.         update_tail_pos
  478.         
  479.     #cob
  480.     if @think
  481.       skin = FUKI::THINK_SKIN_NAME != "" ? FUKI::THINK_SKIN_NAME : FUKI::VOICE_SKIN_NAME
  482.     else
  483.       skin = FUKI::SAY_SKIN_NAME != "" ? FUKI::SAY_SKIN_NAME : FUKI::VOICE_SKIN_NAME
  484.     end        
  485.         
  486.         case @message_position
  487.         when 0  # 上
  488.           if(@tail.x < self.x + self.width / 2)
  489.             @tail.bitmap = RPG::Cache.windowskin(skin + "-upper_right")
  490.           else
  491.             @tail.bitmap = RPG::Cache.windowskin(skin + "-upper_left")
  492.           end
  493.         when 2  # 下
  494.           if(@tail.x + 40 > self.x + self.width / 2)
  495.             @tail.bitmap = RPG::Cache.windowskin(skin + "-lower_left")
  496.           else
  497.             @tail.bitmap = RPG::Cache.windowskin(skin + "-lower_right")
  498.           end
  499.         end
  500.       end
  501.   end
  502.   #-----------------------------------------------------------
  503.   # ○ 新功能:根据输入文章计算呼出对话框的位置
  504.   #-----------------------------------------------------------
  505.   def update_character
  506.     @character = get_character_by_name
  507.   end
  508.   
  509.   BATTLER_NAME = {
  510.     ""=>"",
  511.   }
  512.    
  513.   def get_character_by_name
  514.     return nil if @kkme_name == nil
  515.    
  516.     if $game_temp.in_battle
  517.       return $game_party.actors[0] if @kkme_name == ""
  518.       return $game_party.actors[@kkme_name.to_i] if @kkme_name.to_i != 0
  519.       
  520.       name = BATTLER_NAME[@kkme_name]
  521.       name = @kkme_name unless name
  522.       for enemy in $game_troop.enemies
  523.         return enemy if enemy.name == name
  524.       end
  525.       
  526.       return nil
  527.     end
  528.    
  529.     if @kkme_name == ""
  530.       return $game_player unless $game_player.transparent
  531.       @kkme_name = "我"
  532.     else  
  533.       return $game_party.characters[@kkme_name.to_i - 1] if @kkme_name.to_i != 0
  534.     end

  535.     #@kkme_name = "我" if @kkme_name == "我"
  536.     for event in $game_map.events.values
  537.       return event if event.name == @kkme_name and event.character_name != ""
  538.     end
  539.       
  540.     for actor in $game_party.actors
  541.       return $game_player if actor.name == @kkme_name
  542.     end
  543.       
  544.     return nil
  545.   end
  546.   
  547.   def tail_offset_x
  548.     return 18 if @think
  549.     return 16
  550.   end
  551.   
  552.   def tail_offset_y
  553.     return 18 if @think
  554.     return 2
  555.   end

  556.   #-----------------------------------------------------------
  557.   # ○ 计算呼出对话框的位置
  558.   #-----------------------------------------------------------
  559.   def update_window_pos
  560.     # 记录文章显示位置
  561.     @message_position = $game_system.message_position
  562.     if @message_position == 1
  563.       self.x = (640 - self.width) / 2
  564.       self.y = (480 - self.height) / 2
  565.       return
  566.     end
  567.    
  568.     update_character

  569.     if @character == nil
  570.       # 角色不存在的情况下使用默认信息框
  571.       del_fukidasi
  572.       reset_window
  573.       return
  574.     end
  575.    
  576.     if $game_temp.in_battle
  577.       @message_position = 0
  578.     elsif $mes_center != nil
  579.       center_char = get_character($mes_center)
  580.       if center_char != nil
  581.         if @character.real_y > center_char.real_y
  582.           @message_position = 2
  583.         else
  584.           @message_position = 0
  585.         end
  586.       end
  587.     end

  588.     case @message_position
  589.     when 0  # 上
  590.       y = @character.screen_y - self.height - @character.sprite_height + FUKI::POP_SHIFT_TOP
  591.       y -= tail_offset_y
  592.       if FUKI::POS_FIX and y < 4
  593.         if $game_temp.in_battle
  594.           y = 4         
  595.         else         
  596.           @message_position = 2
  597.           y = @character.screen_y + FUKI::POP_SHIFT_UNDER
  598.           y += tail_offset_y
  599.         end
  600.       end
  601.     when 2  # 下
  602.       y = @character.screen_y + FUKI::POP_SHIFT_UNDER
  603.       y += tail_offset_y
  604.       if FUKI::POS_FIX and y + self.height > 480 - 4
  605.         @message_position = 0
  606.         y = @character.screen_y - self.height - @character.sprite_height + FUKI::POP_SHIFT_TOP
  607.         y -= tail_offset_y
  608.       end
  609.     end

  610.     x = @character.screen_x - self.width / 2
  611.     case @message_position
  612.     when 0  # 上
  613.       x += tail_offset_x
  614.     when 2  # 下
  615.       x -= tail_offset_x
  616.     end

  617.     if x + self.width > 640 - 4
  618.       x = 640 - 4 - self.width
  619.     elsif x < 4
  620.       x = 4
  621.     end
  622.    
  623.     if y + self.height > 480 - 4
  624.       y = 480 - 4 - self.height
  625.     elsif y < 4
  626.       y = 4
  627.     end

  628.     self.x = x
  629.     self.y = y
  630.   end

  631.   #-----------------------------------------------------------
  632.   # ○ 计算尾部图标的位置
  633.   #-----------------------------------------------------------
  634.   def update_tail_pos
  635.     x = @character.screen_x - tail_offset_x
  636.    
  637.     case @message_position
  638.     when 0  # 上
  639.       # 画面边缘的话则移动位置
  640.       if FUKI::CORNER_SHIFT
  641.         if x == 0
  642.           x = FUKI::SHIFT_PIXEL
  643.         elsif x == 640 - 32
  644.           x = 640 - 32 - FUKI::SHIFT_PIXEL
  645.         end
  646.       end
  647.       y = self.y + self.height - 16
  648.       y += 16 if @think
  649.     when 2  # 下
  650.       # 画面边缘的话则移动位置
  651.       if FUKI::CORNER_SHIFT
  652.         if x == 0
  653.           x = FUKI::SHIFT_PIXEL
  654.         elsif @tail.x == 640 - 32
  655.           x = 640 - 32 - FUKI::SHIFT_PIXEL
  656.         end
  657.       end
  658.       y = self.y - 16
  659.       y -= 16 if @think
  660.     end   
  661.    
  662.     @tail.x = x
  663.     @tail.y = y
  664.   end

  665.   #-----------------------------------------------------------
  666.   # ○ 计算名字窗口的位置
  667.   #-----------------------------------------------------------
  668.   def update_name_pos
  669.     @head.x = self.x + FUKI::FRAME_WIDTH + 4
  670.     @head.y = self.y + (self.height - FUKI::HEAD_WIDTH)/2
  671.   end

  672.   #-----------------------------------------------------------
  673.   # ○ 设置角色名字窗口
  674.   #-----------------------------------------------------------
  675.   def set_namewindow
  676.     @head = Sprite.new
  677.    
  678.     #判断名称是否有对应的图片"Graphics/heads/" +
  679.     if $game_temp.namebmp[@head_name] == nil then
  680.       @head.bitmap = RPG::Cache.icon(@head_name)
  681.     else
  682.       @head.bitmap = RPG::Cache.icon($game_temp.namebmp[@head_name])
  683.     end
  684.     @head.z = self.z + 1
  685.     @head.opacity = 0
  686.     update_name_pos
  687.   end

  688.   #-----------------------------------------------------------
  689.   # ○ 释放呼出对话框和角色名字窗口
  690.   #-----------------------------------------------------------
  691.   def del_fukidasi
  692.     if @tail != nil
  693.       @tail.dispose
  694.       @tail = nil
  695.     end
  696.     if @head != nil
  697.       @head.dispose
  698.       @head = nil
  699.     end
  700.     self.opacity = 0
  701.     self.x = MARGIN_WIDTH
  702.     self.width = 640 - MARGIN_WIDTH * 2
  703.     self.height = 160
  704.     self.contents.dispose
  705.     self.contents = Bitmap.new(width - 32, height - 32)
  706.     self.pause = true
  707.   end

  708.   #-----------------------------------------------------------
  709.   # ○ 取得角色
  710.   #     parameter : 参数
  711.   #-----------------------------------------------------------
  712.   def get_character(parameter)
  713.     # 参数分歧
  714.     case parameter
  715.     when -1  # 玩家
  716.       return $game_player
  717.     when 0   # 该事件
  718.       return nil unless $game_system.map_interpreter.running?
  719.       events = $game_map.events
  720.       return events == nil ? nil : events[$game_system.map_interpreter.event_id]
  721.     else     # 特定事件
  722.       if parameter > 0
  723.         events = $game_map.events
  724.         return events == nil ? nil : events[parameter]
  725.       end
  726.       events = $game_party.characters
  727.       return events == nil ? nil : events[-parameter - 2]
  728.     end
  729.   end

  730.   #-----------------------------------------------------------
  731.   # ● 设定窗口位置和不透明度
  732.   #-----------------------------------------------------------
  733.   def reset_window
  734.     update_window_size
  735.     @text_x = 320 - width / 2
  736.     self.width = 640 - MARGIN_WIDTH * 2
  737.     self.contents.dispose   
  738.     self.contents = Bitmap.new(width - 32, height - 32)
  739.     self.x = 320 - width / 2
  740.    
  741.     if false and $game_temp.in_battle
  742.       self.y = 16
  743.     else
  744.       case $game_system.message_position
  745.       when 0  # 上
  746.         self.y = 16
  747.       when 1  # 中
  748.         self.y = 240 - self.height / 2 #160
  749.       when 2  # 下
  750.         #self.y = 304
  751.         self.y = 480 - 16 - height
  752.       end
  753.     end
  754.     if $game_system.message_frame == 0
  755.       self.opacity = 255
  756.     else
  757.       self.opacity = 0
  758.     end
  759.     self.back_opacity = FUKI::MES_OPACITY
  760.     @think = false
  761.    
  762.   end

  763.   #-----------------------------------------------------------
  764.   # ● 刷新画面
  765.   #-----------------------------------------------------------
  766.   def update
  767.     super
  768.    
  769.     # 呼出模式下跟随事件移动
  770.     if @tail != nil
  771.       update_window_pos
  772.       update_name_pos if @head != nil
  773.       update_tail_pos
  774.     end

  775.     # 渐变的情况下
  776.     if @fade_in   
  777.       self.opacity += FUKI::FADE_IN_STEP if $game_system.message_frame == 0
  778.       self.contents_opacity += FUKI::FADE_IN_STEP
  779.       @head.opacity += FUKI::FADE_IN_STEP if @head != nil
  780.       @tail.opacity += FUKI::FADE_IN_STEP if @tail != nil
  781.       @input_number_window.contents_opacity += FUKI::FADE_IN_STEP if @input_number_window != nil
  782.       @fade_in = false if self.contents_opacity == 255
  783.       return
  784.     end

  785.     # 显示信息中的情况下
  786.     if @contents_drawing
  787.       refresh_drawtext
  788.       return
  789.     end

  790.     # 输入数值的情况下
  791.     if @input_number_window != nil
  792.       @input_number_window.update
  793.       # 确定
  794.       if Input.trigger?(Input::C)
  795.         $game_system.se_play($data_system.decision_se)
  796.         $game_variables[$game_temp.num_input_variable_id] =
  797.           @input_number_window.number
  798.         $game_map.need_refresh = true
  799.         # 释放输入数值窗口
  800.         @input_number_window.dispose
  801.         @input_number_window = nil
  802.         terminate_message
  803.       end
  804.       return
  805.     end

  806.     # 显示信息结束的情况下
  807.     if @contents_showing_end
  808.       if $game_system.menu_disabled
  809.         self.pause = false
  810.       # 不是显示选择项且不是呼出对话模式则显示暂停标志
  811.       elsif $game_temp.choice_max == 0 and @tail == nil
  812.         self.pause = true
  813.       else
  814.         self.pause = false
  815.       end
  816.       
  817.       #cob
  818.       if false and $game_temp.choice_max == 0 and @auto_close == -1
  819.         if Input.press?(Input::B) or
  820.             Input.press?(Input::UP) or
  821.             Input.press?(Input::DOWN) or
  822.             Input.press?(Input::LEFT) or
  823.             Input.press?(Input::RIGHT)
  824.           terminate_message
  825.           del_fukidasi
  826.           $game_temp.terminate_message = true
  827.         end
  828.       end
  829.       
  830.       # 取消
  831.       if Input.trigger?(Input::B)
  832.         if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
  833.           #$game_system.se_play($data_system.cancel_se)
  834.           $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
  835.           terminate_message
  836.         end
  837.       end
  838.       # 自动关闭
  839.       @auto_close > 0 ? @auto_close-=1 : @auto_close=-1
  840.       if @auto_close==0
  841.         # 文字还没有处理完的时候
  842.         # 选择项
  843.         if $game_temp.choice_max > 0
  844.           #$game_system.se_play($data_system.decision_se)
  845.           $game_temp.choice_proc.call(self.index)
  846.         end
  847.         terminate_message
  848.         del_fukidasi
  849.       end
  850.       # 确定
  851.       if Input.trigger?(Input::C) and @auto_close == -1
  852.         if $game_temp.choice_max > 0
  853.           #$game_system.se_play($data_system.decision_se)
  854.           $game_temp.choice_proc.call(self.index)
  855.         end
  856.         terminate_message
  857.         # 释放呼出窗口
  858.         del_fukidasi
  859.       end
  860.       return
  861.     end

  862.     # 在渐变以外的状态下有等待显示的信息与选择项的场合
  863.     if @fade_out == false and $game_temp.message_text != nil
  864.       @contents_showing = true
  865.       $game_temp.message_window_showing = true
  866.       reset_window
  867.       refresh_create
  868.       if @head != nil
  869.         @head.opacity = 0
  870.       end
  871.       if @tail != nil
  872.         @tail.opacity = 0
  873.       end
  874.       Graphics.frame_reset
  875.       self.visible = true
  876.       self.contents_opacity = 0
  877.       if @input_number_window != nil
  878.         @input_number_window.contents_opacity = 0
  879.       end
  880.       @fade_in = true
  881.       return
  882.     end

  883.     # 没有可以显示的信息、但是窗口为可见的情况下
  884.     if self.visible
  885.       @fade_out = true
  886.       
  887.       self.contents_opacity -= FUKI::FADE_OUT_STEP
  888.       @head.opacity -= FUKI::FADE_OUT_STEP if @head != nil
  889.       @tail.opacity -= FUKI::FADE_OUT_STEP if @tail != nil
  890.       @input_number_window.contents_opacity -= FUKI::FADE_OUT_STEP if @input_number_window != nil

  891.       if self.opacity == 0
  892.         self.visible = false
  893.         @fade_out = false
  894.         $game_temp.message_window_showing = false
  895.         del_fukidasi
  896.       end
  897.       return
  898.     end
  899.   end

  900.   #-----------------------------------------------------------
  901.   # ● 释放
  902.   #-----------------------------------------------------------
  903.   def dispose
  904.     terminate_message
  905.     $game_temp.message_window_showing = false
  906.     if @input_number_window != nil
  907.       @input_number_window.dispose
  908.     end
  909.     del_fukidasi   
  910.     super
  911.   end

  912.   #-----------------------------------------------------------
  913.   # ● 信息结束处理
  914.   #-----------------------------------------------------------
  915.   def terminate_message
  916.     @auto_close = -1
  917.     self.active = false
  918.     self.pause = false
  919.     self.index = -1
  920.     self.contents.clear
  921.     # 清除显示中标志
  922.     @contents_showing = false
  923.     @contents_showing_end = false
  924.     unless @kkme_name == "" or @kkme_name == nil
  925.       @kkme_name = ""
  926.     end
  927.     # 呼叫信息调用
  928.     if $game_temp.message_proc != nil
  929.       $game_temp.message_proc.call
  930.     end
  931.     # 清除文章、选择项、输入数值的相关变量
  932.     $game_temp.message_text = nil
  933.     $game_temp.message_proc = nil
  934.     $game_temp.choice_start = 99
  935.     $game_temp.choice_max = 0
  936.     $game_temp.choice_cancel_type = 0
  937.     $game_temp.choice_proc = nil
  938.     $game_temp.num_input_start = 99
  939.     $game_temp.num_input_variable_id = 0
  940.     $game_temp.num_input_digits_max = 0
  941.     # 释放金钱窗口
  942.     if @gold_window != nil
  943.       @gold_window.dispose
  944.       @gold_window = nil
  945.     end
  946.   end

  947.   #-----------------------------------------------------------
  948.   # ● 刷新光标矩形
  949.   #-----------------------------------------------------------
  950.   def update_cursor_rect
  951.     if @index >= 0
  952.       n = $game_temp.choice_start + @index
  953.       self.cursor_rect.set(@text_x, n * 32, [@cursor_width, 60].max, 32)
  954.     else
  955.       self.cursor_rect.empty
  956.     end
  957.   end
  958.   #-----------------------------------------------------------
  959.   # ● 取得普通文字色
  960.   #-----------------------------------------------------------
  961.   def normal_color
  962.     return FUKI::FUKI_COLOR #if FUKI::FUKI_COLOR != nil
  963.   end
  964. end


  965. #===============================================================
  966. # ■ Window_InputNumber
  967. #===============================================================

  968. class Window_InputNumber < Window_Base
  969.   #-----------------------------------------------------------
  970.   # ● 初始化对像
  971.   #     digits_max : 位数
  972.   #-----------------------------------------------------------
  973.   def initialize(digits_max)
  974.     @digits_max = digits_max
  975.     [url=home.php?mod=space&uid=27178]@Number[/url] = 0
  976.     # 从数字的幅度计算(假定与 0~9 等幅)光标的幅度
  977.     dummy_bitmap = Bitmap.new(32, 32)
  978.     dummy_bitmap.font.size = FUKI::MES_FONT_SIZE
  979.     @cursor_width = dummy_bitmap.text_size("0").width + 8
  980.     dummy_bitmap.dispose
  981.     super(0, 0, @cursor_width * @digits_max + 32, 64)
  982.     self.contents = Bitmap.new(width - 32, height - 32)
  983.     self.contents.font.size = FUKI::MES_FONT_SIZE
  984.     self.z += 9999
  985.     self.opacity = 0
  986.     @index = 0
  987.     refresh
  988.     update_cursor_rect
  989.   end
  990. end

  991. #============================================================
  992. # Game_Map,把events变量公开
  993. #============================================================
  994. class Game_Map
  995.   attr_reader   :events
  996. end

  997. #============================================================
  998. # 便于返回姓名
  999. #============================================================
  1000. class Game_Event < Game_Character
  1001.   def name
  1002.     return @event.name
  1003.   end
  1004.   def name=(na)
  1005.     @event.name = na
  1006.   end
  1007. end


  1008. #cob
  1009. class Game_Character
  1010.   SPRITE_HEIGHTS = {
  1011.     "081-Angel03"=>220,
  1012.     "082-Angel04"=>220,
  1013.     "078-Devil04"=>300,
  1014.   }
  1015.   def sprite_height
  1016.     height = SPRITE_HEIGHTS[@character_name]
  1017.     return height / 4 if height
  1018.     bitmap = RPG::Cache.character(@character_name, @character_hue)
  1019.     return bitmap.height / 4
  1020.   end
  1021. end

  1022. class Game_Battler
  1023.   def sprite_height
  1024.     bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  1025.     return bitmap.height
  1026.   end
  1027. end
复制代码





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