Project1

标题: 呼出对话框与人物跟随脚本的冲突问题 [打印本页]

作者: vv398124445    时间: 2012-5-14 13:45
标题: 呼出对话框与人物跟随脚本的冲突问题
本帖最后由 hcm 于 2012-5-28 01:09 编辑
  1. #
  2. #    呼出对话框 ver. 1.31 By パラ犬(日)
  3. #  来自 [url=http://rpg.para.s3p.net/]http://rpg.para.s3p.net/[/url]
  4. #
  5. #  汉化修改 66RPG bbschat(2006.1.5)
  6. #    来自 [url=http://www.66RPG.com/]http://www.66RPG.com/[/url]
  7. #
  8. #    ●准备工作-窗口Skin
  9. #
  10. #    首先,确认自己使用的对话框窗口Skin,(数据库-系统-窗口外观图形)
  11. #    然后根据该窗口Skin制作对话框尾部使用的两个箭头图形
  12. #    尾部箭头图形命名方式:“窗口skin名-top”,“窗口skin名-under”
  13. #    将该图形文件存放在“Graphics/Windowskins”文件夹下。
  14. #
  15. #    本演示游戏内置2套窗口和箭头图形,
  16. #    一套是游戏默认的“001-Blue01”,一套是定制的“fk”
  17. #    玩家可以根据自己的需要参照样本定制自己的呼出对话框窗口Skin。
  18. #
  19. #    ●呼出对话框使用方法
  20. #
  21. #    在事件命令行使用[脚本]将事件ID代入[$mes_id]
  22. #    该事件就可以使用呼出对话框了。
  23. #   (举例:$mes_id=4)
  24. #
  25. #    ID 代入 -1 表示玩家,代入 0 表示事件自身。
  26. #    代入 nil 或者 "" 则返回成通常的信息窗口。
  27. #    对话框的表示位置可以通过事件的“更改文章选项”来设定(上、中、下)。
  28. #    表示位置为“中央”的话,不管事件位置在哪里,对话框都将显示在画面中央。
  29. #
  30. #    ●角色名字窗口的使用文字的方法
  31. #
  32. #    在事件命令行使用[脚本]将文字列代入[$mes_name]
  33. #    对话框就会显示角色名字窗口
  34. #   (举例:$mes_name="阿尔西斯")
  35. #    代入 nil 或者 "" 则不显示角色名字窗口。
  36. #
  37. #    以上两个机能是独立的,所以可以单独使用
  38. #
  39. #   $mes_id=(ID) + $mes_name="名字"  :呼出对话框显示 + 角色名字窗口
  40. #   $mes_id=(ID) + $mes_name=""      :呼出对话框显示(没有角色名字)
  41. #   $mes_id=nil  + $mes_name="名字"  :默认信息窗口 + 角色名字窗口
  42. #   $mes_id=nil  + $mes_name=""      :默认信息窗口(没有角色名字)
  43. #
  44. #    ●角色名字窗口使用角色图片的方法(汉化特别追加功能,原脚本只能使用文字)
  45. #   
  46. #    如果能在对应文件夹中找到文件名和角色名字相同的图片,   
  47. #    则角色名字窗口显示角色头像图片,角色图片最好能包括角色的名字。
  48. #    默认头像图片保存目录为“Graphics/Heads/”,玩家可自行修改。
  49. #
  50. #    如果不想使用角色名字直接作为头像文件名。
  51. #    可以使用下面在 Game_Temp 类里增加的namebmp属性。
  52. #    重新设定角色名字与文件名的对应关系。
  53. #
  54. #    ●信息表示速度的变更方法
  55. #
  56. #    在事件命令行使用[脚本]将数值代入[$mes_speed]
  57. #    速度为 0 即瞬间显示全部信息,数字越大,信息表示速度越慢。
  58. #   (举例:$mes_speed=1)
  59. #
  60. #    ●其他设置
  61. #
  62. #    请参照下面的注释
  63. #==============================================================================
  64. module FUKI
  65.   # 头像图片保存目录的设定
  66.   HEAD_PIC_DIR = "Graphics/Heads/"
  67.   # 是否显示尾部图标
  68.   TAIL_SHOW = true  
  69.   # Skin的设定
  70.   # 使用数据库默认窗口Skin情况下这里使用[""]
  71.   FUKI_SKIN_NAME = "001-Blue01"   # 呼出对话框用Skin
  72.   NAME_SKIN_NAME = "001-Blue01"   # 角色名字窗口用Skin
  73.   
  74.   # 字体大小
  75.   MES_FONT_SIZE = 22    # 呼出对话框
  76.   NAME_FONT_SIZE = 14   # 角色名字窗口
  77.   
  78.   # 字体颜色
  79.   #(设定为 Color.new(0, 0, 0, 0) 表示使用普通文字色)
  80.   FUKI_COLOR = Color.new(255, 255, 255, 255)  # 呼出对话框
  81.   NAME_COLOR = Color.new(255, 255, 255, 255)  # 角色名字窗口
  82.   
  83.   # 窗口透明度
  84.   # 如修改窗口透明度请同时修改尾部箭头图形内部的透明度
  85.   FUKI_OPACITY = 255    # 呼出对话框
  86.   MES_OPACITY = 255     # 默认信息窗口
  87.   NAME_OPACITY = 255    # 角色名字窗口
  88.   
  89.   # 角色名字窗口的相对位置
  90.   NAME_SHIFT_X = 0      # 横坐标
  91.   NAME_SHIFT_Y = 16     # 纵坐标
  92.   
  93.   # 窗口表示时是否根据画面大小自动检查窗口出现的位置,
  94.   # 自动改变位置( true / false )
  95.   # 设置成 true 可能出现箭头图标颠倒的问题 <- bbschat
  96.   POS_FIX = false
  97.   # 在画面最边缘表示时的稍微挪动
  98.   # 使用圆形Skin的角和方框的角重合的情况下为 true
  99.   CORNER_SHIFT = false
  100.   SHIFT_PIXEL = 0   # true 时挪动的象素
  101.   
  102.   # 角色高度尺寸
  103.   CHARACTOR_HEIGHT = 48
  104.   # 呼出对话框的相对位置(纵坐标)
  105.   POP_SHIFT_TOP = 0         # 表示位置为上的时候
  106.   POP_SHIFT_UNDER = 0       # 表示位置为下的时候
  107.   
  108.   # 信息的表示速度(数字越小速度越快,0为瞬间表示)
  109.   # 游戏中 可随时用数字代入 $mes_speed 来改变消息表示速度。
  110.   MES_SPEED = 0
  111. end
  112. #==============================================================================
  113. # 方便用户同时设置2个常用参数而使用的函数
  114. #==============================================================================
  115. def chat(id = 0,name = "")
  116.   $mes_id = id
  117.   $mes_name = name
  118. end
  119. #==============================================================================
  120. # □ Game_Temp
  121. #==============================================================================
  122. class Game_Temp
  123.   attr_accessor  :namebmp              #保存头像图片的Hash表
  124.   alias initialize_fuki initialize
  125.   def initialize
  126.     initialize_fuki
  127.     # 如果不想使用角色名字直接作为头像文件名
  128.     # 可在这里重新设定角色名字与文件名的对应关系
  129.     @namebmp ={"玩家"=>"001-Player-Face", "维斯特"=>"002-Player-Face"}
  130.   end
  131. end
  132. #==============================================================================
  133. # □ Window_FukiMessage
  134. #==============================================================================
  135. class Window_FukiMessage < Window_Selectable
  136.   #--------------------------------------------------------------------------
  137.   # ● 初始化状态
  138.   #--------------------------------------------------------------------------
  139.   def initialize
  140.     super(80, 304, 480, 160)
  141.     self.contents = Bitmap.new(width - 32, height - 32)
  142.     self.visible = false
  143.     self.z = 9998
  144.     @fade_in = false
  145.     @fade_out = false
  146.     @contents_showing = false
  147.     @cursor_width = 0
  148.     self.active = false
  149.     self.index = -1
  150.     @w = 0
  151.     @h = 0
  152.     @wait = 0
  153.     @dx = 0
  154.     @dy = 0
  155.     $mes_speed = FUKI::MES_SPEED
  156.   end
  157.   
  158.   #--------------------------------------------------------------------------
  159.   # ○ 决定窗口尺寸并生成窗口
  160.   #--------------------------------------------------------------------------
  161.   def refresh_create
  162.     self.contents.clear
  163.     self.contents.font.color = normal_color
  164.     self.contents.font.size = FUKI::MES_FONT_SIZE
  165.     # 取得窗口尺寸
  166.     get_windowsize
  167.     w = @w + 32 + 8
  168.     h = @h * (self.contents.font.size + 10) + 26
  169.     # 生成呼出窗口
  170.     set_fukidasi(self.x, self.y, w, h)
  171.     # 生成角色名字窗口
  172.     set_namewindow
  173.     # 初始化信息表示使用的变量
  174.     @dx = @dy = 0
  175.     @cursor_width = 0
  176.     @contents_drawing = true
  177.     # 瞬间表示的情况下
  178.     if $mes_speed == 0
  179.       # 循环信息描绘处理
  180.       while $game_temp.message_text != ""
  181.         draw_massage
  182.       end
  183.       draw_opt_text
  184.       @contents_showing_end = true
  185.       @contents_drawing = false
  186.     else
  187.       # 一个一个描绘文字
  188.       refresh_drawtext
  189.     end
  190.   end
  191.   
  192.   #--------------------------------------------------------------------------
  193.   # ○ 一个一个描绘文字
  194.   #--------------------------------------------------------------------------
  195.   def refresh_drawtext
  196.     if $game_temp.message_text != nil
  197.       if @wait > 0
  198.         @wait -= 1
  199.       elsif @wait == 0
  200.         # 描绘处理
  201.         draw_massage
  202.         @wait = $mes_speed
  203.       end
  204.     end
  205.     # 描绘结束
  206.     if $game_temp.message_text == ""
  207.       draw_opt_text
  208.       @contents_showing_end = true
  209.       @contents_drawing = false
  210.     end
  211.   end
  212.   
  213.   #--------------------------------------------------------------------------
  214.   # ○ 取得窗口尺寸
  215.   #--------------------------------------------------------------------------
  216.   def get_windowsize
  217.     x = y = 0
  218.     @h = @w = 0
  219.     @cursor_width = 0
  220.     # 有选择项的话,处理字的缩进
  221.     if $game_temp.choice_start == 0
  222.       x = 16
  223.     end
  224.     # 有等待显示的文字的情况下
  225.     if $game_temp.message_text != nil
  226.     text = $game_temp.message_text.clone
  227.       # 限制文字处理
  228.       begin
  229.         last_text = text.clone
  230.         text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  231.       end until text == last_text
  232.       text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  233.         $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  234.       end
  235.       # 为了方便、将 "[url=]\\\\[/url]" 变换为 "\000"
  236.       text.gsub!(/\\\\/) { "\000" }
  237.       # "[url=file://\\C]\\C[/url]" 变为 "\001" 、"[url=file://\\G]\\G[/url]" 变为 "\002"
  238.       text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001" }
  239.       text.gsub!(/\\[Gg]/) { "\002" }
  240.       # c 获取 1 个字 (如果不能取得文字就循环)
  241.       while ((c = text.slice!(/./m)) != nil)
  242.         # \\ 的情况下
  243.         if c == "\000"
  244.           # 还原为本来的文字
  245.           c = "\\"
  246.         end
  247.         # \C[n] 或者 \G 的情况下
  248.         if c == "\001" or c == "\002"
  249.           # 下面的文字
  250.           next
  251.         end
  252.         # 另起一行文字的情况下
  253.         if c == "\n"
  254.           # y 累加 1
  255.           y += 1
  256.           # 取得纵横尺寸
  257.           @h = y
  258.           @w = x > @w ? x : @w
  259.           if y >= $game_temp.choice_start
  260.             @w = x + 8 > @w ? x + 8 : @w
  261.           end
  262.           x = 0
  263.           # 移动到选择项的下一行
  264.           if y >= $game_temp.choice_start
  265.             x = 8
  266.           end
  267.           # 下面的文字
  268.           next
  269.         end
  270.         # x 为要描绘文字的宽度加法运算
  271.         x += self.contents.text_size(c).width
  272.       end
  273.     end
  274.     # 输入数值的情况
  275.     if $game_temp.num_input_variable_id > 0
  276.       digits_max = $game_temp.num_input_digits_max
  277.       number = $game_variables[$game_temp.num_input_variable_id]
  278.       @h += 1
  279.       x = digits_max * self.contents.font.size + 16
  280.       @w = x > @w ? x : @w
  281.     end
  282.   end
  283.   
  284.   #--------------------------------------------------------------------------
  285.   # ○ 描绘信息处理
  286.   #--------------------------------------------------------------------------
  287.   def draw_massage
  288.     # 有等待显示的文字的情况下
  289.     if $game_temp.message_text != nil
  290.       text = $game_temp.message_text
  291.       # 限制文字处理
  292.       begin
  293.         last_text = text.clone
  294.         text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  295.       end until text == last_text
  296.       text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  297.         $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  298.       end
  299.       # 为了方便、将 "[url=]\\\\[/url]" 变换为 "\000"
  300.       text.gsub!(/\\\\/) { "\000" }
  301.       # "[url=file://\\C]\\C[/url]" 变为 "\001"、"[url=file://\\G]\\G[/url]" 变为 "\002"
  302.       text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  303.       text.gsub!(/\\[Gg]/) { "\002" }
  304.       # c 获取 1 个字
  305.       if ((c = text.slice!(/./m)) != nil)
  306.         # 选择项的情况
  307.         if @dy >= $game_temp.choice_start
  308.           # 处理字的缩进
  309.           @dx = 8
  310.           # 描绘文字
  311.           self.contents.draw_text(4 + @dx, 32 * @dy, 40, 32, c)
  312.           # x 为要描绘文字宽度的加法运算
  313.           @dx += self.contents.text_size(c).width
  314.           # 循环
  315.           while ((c = text.slice!(/./m)) != "\n")
  316.             # 描绘文字
  317.             self.contents.draw_text(4 + @dx, 32 * @dy, 40, 32, c)
  318.             # x 为要描绘文字宽度的加法运算
  319.             @dx += self.contents.text_size(c).width
  320.           end
  321.           if c == "\n"
  322.             # 更新光标宽度
  323.             @cursor_width = [@cursor_width, @dx].max
  324.             # dy 累加 1
  325.             @dy += 1
  326.             @dx = 0
  327.           end
  328.           return
  329.         end
  330.         # \\ 的情况下
  331.         if c == "\000"
  332.           # 还原为本来的文字
  333.           c = "\\"
  334.         end
  335.         #\C[n] 的情况下
  336.         if c == "\001"
  337.           # 更改文字色
  338.           text.sub!(/\[([0-9]+)\]/, "")
  339.           color = $1.to_i
  340.           if color >= 0 and color <= 7
  341.             self.contents.font.color = text_color(color)
  342.           end
  343.         end
  344.         # \G 的情况下
  345.         if c == "\002"
  346.           # 生成金钱窗口
  347.           if @gold_window == nil
  348.             @gold_window = Window_Gold.new
  349.             @gold_window.x = 560 - @gold_window.width
  350.             if $game_temp.in_battle
  351.               @gold_window.y = 192
  352.             else
  353.               @gold_window.y = self.y >= 128 ? 32 : 384
  354.             end
  355.             @gold_window.opacity = self.opacity
  356.             @gold_window.back_opacity = self.back_opacity
  357.           end
  358.         end
  359.         # 另起一行文字的情况下
  360.         if c == "\n"
  361.           # dy 累加 1
  362.           @dy += 1
  363.           @dx = 0
  364.         end
  365.         # 描绘文字
  366.         self.contents.font.size = FUKI::MES_FONT_SIZE
  367.         font_size = self.contents.font.size
  368.         self.contents.draw_text([url=mailto:4+@dx]4+@dx[/url], (font_size+10)*@dy, font_size, font_size, c)
  369.         # dx 为要描绘文字的宽度加法运算
  370.         @dx += self.contents.text_size(c).width
  371.       end
  372.     end
  373.   end
  374.   
  375.   #--------------------------------------------------------------------------
  376.   # ○ 选择项和输入数值的情况下
  377.   #--------------------------------------------------------------------------
  378.   def draw_opt_text
  379.     # 选择项的情况下
  380.     if $game_temp.choice_max > 0
  381.       @item_max = $game_temp.choice_max
  382.       self.active = true
  383.       self.index = 0
  384.     end
  385.     # 输入数值的情况下
  386.     if $game_temp.num_input_variable_id > 0
  387.       digits_max = $game_temp.num_input_digits_max
  388.       number = $game_variables[$game_temp.num_input_variable_id]
  389.       @input_number_window = Window_InputNumber.new(digits_max)
  390.       @input_number_window.number = number
  391.       @input_number_window.x = self.x + 8
  392.       @input_number_window.y = self.y + $game_temp.num_input_start * 32
  393.     end
  394.   end
  395.   
  396.   #--------------------------------------------------------------------------
  397.   # ○ 设置呼出对话框
  398.   #--------------------------------------------------------------------------
  399.   def set_fukidasi(x, y, width, height)
  400.     # $mes_id 为空的时候,不显示呼出对话框
  401.     if $mes_id == nil or $mes_id == ""
  402.       del_fukidasi
  403.       reset_window
  404.     else
  405.       # 不显示暂停标志
  406.       self.pause = false
  407.       # 取得对话框位置
  408.       pos = get_fuki_pos(width, height)
  409.       x = pos[0]
  410.       y = pos[1]
  411.       skin = FUKI::FUKI_SKIN_NAME != "" ? FUKI::FUKI_SKIN_NAME : $game_system.windowskin_name
  412.       # 生成呼出对话框
  413.       self.windowskin = RPG::Cache.windowskin(skin)
  414.       self.x = x
  415.       self.y = y
  416.       self.height = height
  417.       self.width = width
  418.       self.contents.dispose
  419.       self.contents = Bitmap.new(width - 32, height - 32)
  420.       self.back_opacity = FUKI::FUKI_OPACITY
  421.       self.contents.clear
  422.       self.contents.font.color = normal_color
  423.       self.contents.font.size = FUKI::MES_FONT_SIZE
  424.       # 描绘尾部图标
  425.       if $game_system.message_frame == 0
  426.         # 取得位置
  427.         tale_pos = get_tale_pos
  428.         @tale = Sprite.new
  429.         # 是否显示尾部图标 <- bbschat
  430.         if FUKI::TAIL_SHOW == true
  431.           case @message_position
  432.             when 0  # 上
  433.               @tale.bitmap = RPG::Cache.windowskin(skin + "-top")
  434.               @tale.x = tale_pos[0]
  435.               @tale.y = tale_pos[1]
  436.               @tale.z = self.z + 1
  437.             when 1  # 中
  438.               @tale.dispose
  439.               @tale = nil
  440.             when 2  # 下
  441.               @tale.bitmap = RPG::Cache.windowskin(skin + "-under")
  442.               @tale.x = tale_pos[0]
  443.               @tale.y = tale_pos[1]
  444.               @tale.z = self.z + 1
  445.           end
  446.         end
  447.       end
  448.     end
  449.   end
  450.   
  451.   #--------------------------------------------------------------------------
  452.   # ○ 计算呼出对话框的位置
  453.   #--------------------------------------------------------------------------
  454.   def get_fuki_pos(width, height)
  455.    
  456.     # 取得角色
  457.     @character = get_character($mes_id)
  458.     if @character == nil
  459.       # 角色不存在的情况下使用默认信息框
  460.       del_fukidasi
  461.       reset_window
  462.       return
  463.     end
  464.     # 处理坐标
  465.     x = ( @character.real_x - $game_map.display_x + 64 ) * 32 / 128 - (width / 2)
  466.     # 为尽量显示在画面内而移动横坐标
  467.     if x + width > 640
  468.       x = 640 - width
  469.     elsif x < 0
  470.       x = 0
  471.     end
  472.     # 决定窗口位置
  473.     case $game_system.message_position
  474.       when 0  # 上
  475.         y = (@character.real_y - $game_map.display_y + 64) * 32 / 128 - height - FUKI::CHARACTOR_HEIGHT + FUKI::POP_SHIFT_TOP
  476.       when 1  # 中
  477.         y = (480 - height) / 2
  478.         x = (640 - width) / 2
  479.       when 2  # 下
  480.         y =  (@character.real_y - $game_map.display_y + 64) * 32 / 128 + 32 + FUKI::POP_SHIFT_UNDER
  481.     end
  482.     # 纪录文章显示位置
  483.     @message_position = $game_system.message_position
  484.     # 如果选择自动修正,则如果文章会显示到画面外则自动改变窗口的尺寸(高度)
  485.     if FUKI::POS_FIX
  486.       case @message_position
  487.         when 0  # 上
  488.           if y <= 0
  489.             @message_position = 2
  490.             y =  (@character.real_y - $game_map.display_y + 64) * 32 / 128 + 32 + FUKI::POP_SHIFT_UNDER
  491.           end
  492.         when 2  # 下
  493.           if y + height >= 480
  494.             p "上"
  495.             @message_position = 0
  496.             y = (@character.real_y - $game_map.display_y + 64) * 32 / 128 - height - FUKI::CHARACTOR_HEIGHT + FUKI::POP_SHIFT_TOP
  497.           end
  498.       end
  499.     end
  500.     return [x,y]
  501.    
  502.   end
  503.   
  504.   #--------------------------------------------------------------------------
  505.   # ○ 计算尾部图标的位置
  506.   #--------------------------------------------------------------------------
  507.   def get_tale_pos
  508.     case @message_position
  509.       when 0  # 上
  510.         # 处理坐标
  511.         x = ( @character.real_x - $game_map.display_x + 64 ) * 32 / 128 - 16
  512.         # 画面边缘的话则移动位置
  513.         if FUKI::CORNER_SHIFT
  514.           if x == 0
  515.             x = FUKI::SHIFT_PIXEL
  516.           elsif x == 640 - 32
  517.             x = 640 - 32 - FUKI::SHIFT_PIXEL
  518.           end
  519.         end
  520.         y = self.y + self.height - 16
  521.       when 1  # 中
  522.         x = nil
  523.         y = nil
  524.       when 2  # 下
  525.         # 处理坐标
  526.         x = ( @character.real_x - $game_map.display_x + 64 ) * 32 / 128 - 16
  527.         # 画面边缘的话则移动位置
  528.         if FUKI::CORNER_SHIFT
  529.           if x == 0
  530.             x = FUKI::SHIFT_PIXEL
  531.           elsif @tale.x == 640 - 32
  532.             x = 640 - 32 - FUKI::SHIFT_PIXEL
  533.           end
  534.         end
  535.         y = self.y - 16
  536.     end
  537.     return [x,y]
  538.   end
  539.   #--------------------------------------------------------------------------
  540.   # ○ 计算名字窗口的位置
  541.   #--------------------------------------------------------------------------
  542.   def get_name_pos
  543.     case @face_pic_txt
  544.       when 0  # 文字
  545.         x = self.x + FUKI::NAME_SHIFT_X
  546.         y = self.y - FUKI::NAME_FONT_SIZE - 16 + FUKI::NAME_SHIFT_Y
  547.       when 1  # 图片
  548.         if self.x >= @pic_width + 5
  549.           # 默认头像显示在对话框左边
  550.           x = [url=mailto:self.x-@pic_width-5]self.x-@pic_width-5[/url]
  551.         else
  552.           # 对话框左边放不下时头像显示在右边
  553.           x = self.x + self.width
  554.         end
  555.         y = self.y+self.height/2 - (@pic_height + 5)/2
  556.       end
  557.     return [x,y]
  558.   end
  559.   
  560.   #--------------------------------------------------------------------------
  561.   # ○ 设置角色名字窗口
  562.   #--------------------------------------------------------------------------
  563.   def set_namewindow
  564.    
  565.     # $mes_name为空时不显示角色名字窗口
  566.     if $mes_name == nil or $mes_name == ""
  567.       return
  568.     else
  569.       # 设定变量
  570.       mes_name = $mes_name
  571.       skin = FUKI::NAME_SKIN_NAME != "" ? FUKI::NAME_SKIN_NAME : $game_system.windowskin_name
  572.       
  573.       #判断名称是否有对应的图片"Graphics/heads/" +
  574.       if $game_temp.namebmp[mes_name] == nil then
  575.         sFile = "Graphics/heads/" + mes_name + ".png"
  576.       else
  577.         sFile = "Graphics/heads/" + $game_temp.namebmp[mes_name] + ".png"
  578.       end
  579.       
  580.       if FileTest.exist?(sFile) == true then
  581.         
  582.         @face_pic_txt = 1                       #名字窗口使用头像<- bbschat
  583.         
  584.         # 生成头像
  585.         bmp = Bitmap.new(sFile)
  586.         @pic_width = bmp.width
  587.         @pic_height = bmp.height
  588.         
  589.         if self.x >= @pic_width + 5
  590.           # 默认头像显示在对话框左边
  591.           name_x = [url=mailto:self.x-@pic_width-5]self.x-@pic_width-5[/url]
  592.         else
  593.           # 对话框左边放不下时头像显示在右边
  594.           name_x = self.x + self.width
  595.         end
  596.         name_y = self.y+self.height/2 - (@pic_height + 5)/2
  597.         
  598.         # 生成角色头像窗口
  599.         @name_win = Window_Base.new(name_x, name_y, @pic_width + 5, @pic_height + 5)
  600.         @name_win.windowskin = RPG::Cache.windowskin(skin)
  601.         @name_win.back_opacity =0     
  602.         @name_win.z = self.z + 1
  603.         
  604.         @name_contents = Sprite.new
  605.         @name_contents.x = name_x + 2
  606.         @name_contents.y = name_y + 2
  607.         @name_contents.bitmap = bmp
  608.         [url=mailto:#@name_contents.z]#@name_contents.z[/url] = @name_win.z + 2     #这个用了似乎效果不好<- bbschat
  609.         
  610.       else
  611.         
  612.         @face_pic_txt = 0                       #名字窗口使用文字<- bbschat
  613.         # 生成名字
  614.         name_width = mes_name.size / 2 * FUKI::NAME_FONT_SIZE
  615.         name_height = FUKI::NAME_FONT_SIZE
  616.         name_x = self.x + FUKI::NAME_SHIFT_X
  617.         name_y = self.y - name_height - 16 + FUKI::NAME_SHIFT_Y
  618.         # 生成角色名字窗口(只有边框)
  619.         @name_win = Window_Base.new(name_x, name_y, name_width + 16, name_height + 16)
  620.         @name_win.windowskin = RPG::Cache.windowskin(skin)
  621.         @name_win.back_opacity = FUKI::NAME_OPACITY
  622.         @name_win.z = self.z + 1
  623.         
  624.         # 为了使空白比Windows类限定的更小使用双重结构
  625.         @name_contents = Sprite.new
  626.         @name_contents.x = name_x + 12
  627.         @name_contents.y = name_y + 8
  628.         @name_contents.bitmap = Bitmap.new(name_width, name_height)
  629.         @name_contents.z = @name_win.z + 2
  630.         
  631.         # 设定文字色
  632.         nil_color = Color.new(0,0,0,0)
  633.         if FUKI::NAME_COLOR != nil_color
  634.           @name_contents.bitmap.font.color = FUKI::NAME_COLOR
  635.         else
  636.           @name_contents.bitmap.font.color = normal_color
  637.         end
  638.         @name_contents.bitmap.font.size = FUKI::NAME_FONT_SIZE
  639.         # 调整窗口尺寸
  640.         rect = @name_contents.bitmap.text_size(mes_name)
  641.         @name_win.width = rect.width + 32
  642.         # 描画名字
  643.         @name_contents.bitmap.draw_text(rect, mes_name)
  644.       end
  645.     end
  646.   end
  647.   
  648.   #--------------------------------------------------------------------------
  649.   # ○ 释放呼出对话框和角色名字窗口
  650.   #--------------------------------------------------------------------------
  651.   def del_fukidasi
  652.     if @tale != nil
  653.       @tale.dispose
  654.       @tale = nil
  655.     end
  656.     if @name_win != nil
  657.       @name_win.dispose
  658.       @name_win = nil
  659.       @name_contents.dispose
  660.       @name_contents = nil
  661.     end
  662.     self.opacity = 0
  663.     self.x = 80
  664.     self.width = 480
  665.     self.height = 160
  666.     self.contents.dispose
  667.     self.contents = Bitmap.new(width - 32, height - 32)
  668.     self.pause = true
  669.   end
  670.   
  671.   #--------------------------------------------------------------------------
  672.   # ○ 取得角色
  673.   #     parameter : 参数
  674.   #--------------------------------------------------------------------------
  675.   def get_character(parametercs)
  676.     # 参数分歧
  677.     case parametercs
  678.     when -1  # 玩家
  679.       return $game_player
  680.     when 0   # 该事件
  681.       events = $game_map.events
  682.       return events == nil ? nil : events[$active_event_id]
  683.     else     # 特定事件
  684.       events = $game_map.events
  685.       return events == nil ? nil : events[parametercs]
  686.     end
  687.   end
  688.   
  689.   #--------------------------------------------------------------------------
  690.   # ● 设定窗口位置和不透明度
  691.   #--------------------------------------------------------------------------
  692.   def reset_window
  693.     if $game_temp.in_battle
  694.       self.y = 16
  695.     else
  696.       case $game_system.message_position
  697.       when 0  # 上
  698.         self.y = 16
  699.       when 1  # 中
  700.         self.y = 160
  701.       when 2  # 下
  702.         self.y = 304
  703.       end
  704.     end
  705.     if $game_system.message_frame == 0
  706.       self.opacity = 255
  707.     else
  708.       self.opacity = 0
  709.     end
  710.     self.back_opacity = FUKI::MES_OPACITY
  711.   end
  712.   
  713.   #--------------------------------------------------------------------------
  714.   # ● 刷新画面
  715.   #--------------------------------------------------------------------------
  716.   def update
  717.     super
  718.     # 呼出模式下跟随事件移动
  719.     if @tale != nil
  720.       pos = get_fuki_pos(self.width, self.height)
  721.       self.x = pos[0]
  722.       self.y = pos[1]
  723.       tale_pos = get_tale_pos
  724.       @tale.x = tale_pos[0]
  725.       @tale.y = tale_pos[1]
  726.       
  727.       if @name_win != nil
  728.         name_pos = get_name_pos
  729.         @name_win.x = name_pos[0]
  730.         @name_win.y = name_pos[1]
  731.         case @face_pic_txt
  732.           when 0  # 文字
  733.             @name_contents.x = @name_win.x + 12
  734.             @name_contents.y = @name_win.y + 8
  735.           when 1  # 图片
  736.             @name_contents.x = @name_win.x + 2
  737.             @name_contents.y = @name_win.y + 2
  738.           end
  739.       end
  740.     end
  741.    
  742.     # 渐变的情况下
  743.     if @fade_in
  744.       self.contents_opacity += 24
  745.       if @name_win != nil
  746.         @name_win.opacity += 24
  747.       end
  748.       if @tale != nil
  749.         @tale.opacity += 24
  750.       end
  751.       if @input_number_window != nil
  752.         @input_number_window.contents_opacity += 24
  753.       end
  754.       if self.contents_opacity == 255
  755.         @fade_in = false
  756.       end
  757.       return
  758.     end
  759.     # 显示信息中的情况下
  760.     if @contents_drawing
  761.       refresh_drawtext
  762.       return
  763.     end
  764.     # 输入数值的情况下
  765.     if @input_number_window != nil
  766.       @input_number_window.update
  767.       # 确定
  768.       if Input.trigger?(Input::C)
  769.         $game_system.se_play($data_system.decision_se)
  770.         $game_variables[$game_temp.num_input_variable_id] =
  771.           @input_number_window.number
  772.         $game_map.need_refresh = true
  773.         # 释放输入数值窗口
  774.         @input_number_window.dispose
  775.         @input_number_window = nil
  776.         terminate_message
  777.       end
  778.       return
  779.     end
  780.     # 显示信息结束的情况下
  781.     if @contents_showing_end
  782.       # 不是显示选择项且不是呼出对话模式则显示暂停标志
  783.       if $game_temp.choice_max == 0 and @tale == nil
  784.         self.pause = true
  785.       else
  786.         self.pause = false
  787.       end
  788.       # 取消
  789.       if Input.trigger?(Input::B)
  790.         if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
  791.           $game_system.se_play($data_system.cancel_se)
  792.           $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
  793.           terminate_message
  794.         end
  795.       end
  796.       # 确定
  797.       if Input.trigger?(Input::C)
  798.         if $game_temp.choice_max > 0
  799.           $game_system.se_play($data_system.decision_se)
  800.           $game_temp.choice_proc.call(self.index)
  801.         end
  802.         terminate_message
  803.         # 释放呼出窗口
  804.         del_fukidasi
  805.       end
  806.       return
  807.     end
  808.     # 在渐变以外的状态下有等待显示的信息与选择项的场合
  809.     if @fade_out == false and $game_temp.message_text != nil
  810.       @contents_showing = true
  811.       $game_temp.message_window_showing = true
  812.       reset_window
  813.       refresh_create
  814.       if @name_win != nil
  815.         @name_win.opacity = 0
  816.       end
  817.       if @tale != nil
  818.         @tale.opacity = 0
  819.       end
  820.       Graphics.frame_reset
  821.       self.visible = true
  822.       self.contents_opacity = 0
  823.       if @input_number_window != nil
  824.         @input_number_window.contents_opacity = 0
  825.       end
  826.       @fade_in = true
  827.       return
  828.     end
  829.     # 没有可以显示的信息、但是窗口为可见的情况下
  830.     if self.visible
  831.       @fade_out = true
  832.       self.opacity -= 48
  833.       if @name_win != nil
  834.         @name_win.opacity -= 48
  835.       end
  836.       if @tale != nil
  837.         @tale.opacity -= 48
  838.       end
  839.       if self.opacity == 0
  840.         self.visible = false
  841.         @fade_out = false
  842.         $game_temp.message_window_showing = false
  843.         del_fukidasi
  844.       end
  845.       return
  846.     end
  847.   end
  848.   
  849.   #--------------------------------------------------------------------------
  850.   # ● 释放
  851.   #--------------------------------------------------------------------------
  852.   def dispose
  853.     terminate_message
  854.     $game_temp.message_window_showing = false
  855.     if @input_number_window != nil
  856.       @input_number_window.dispose
  857.     end
  858.     super
  859.   end
  860.   
  861.   #--------------------------------------------------------------------------
  862.   # ● 信息结束处理
  863.   #--------------------------------------------------------------------------
  864.   def terminate_message
  865.     self.active = false
  866.     self.pause = false
  867.     self.index = -1
  868.     self.contents.clear
  869.     # 清除显示中标志
  870.     @contents_showing = false
  871.     @contents_showing_end = false
  872.     # 呼叫信息调用
  873.     if $game_temp.message_proc != nil
  874.       $game_temp.message_proc.call
  875.     end
  876.     # 清除文章、选择项、输入数值的相关变量
  877.     $game_temp.message_text = nil
  878.     $game_temp.message_proc = nil
  879.     $game_temp.choice_start = 99
  880.     $game_temp.choice_max = 0
  881.     $game_temp.choice_cancel_type = 0
  882.     $game_temp.choice_proc = nil
  883.     $game_temp.num_input_start = 99
  884.     $game_temp.num_input_variable_id = 0
  885.     $game_temp.num_input_digits_max = 0
  886.     # 释放金钱窗口
  887.     if @gold_window != nil
  888.       @gold_window.dispose
  889.       @gold_window = nil
  890.     end
  891.   end
  892.   
  893.   #--------------------------------------------------------------------------
  894.   # ● 刷新光标矩形
  895.   #--------------------------------------------------------------------------
  896.   def update_cursor_rect
  897.     if @index >= 0
  898.       n = $game_temp.choice_start + @index
  899.       self.cursor_rect.set(8, n * 32, @cursor_width, 32)
  900.     else
  901.       self.cursor_rect.empty
  902.     end
  903.   end
  904.   #--------------------------------------------------------------------------
  905.   # ● 取得普通文字色
  906.   #--------------------------------------------------------------------------
  907.   def normal_color
  908.     nil_color = Color.new(0,0,0,0)
  909.     if FUKI::FUKI_COLOR != nil_color
  910.       color = FUKI::FUKI_COLOR
  911.     else
  912.       color = super
  913.     end
  914.     return color
  915.   end
  916. end
  917. #==============================================================================
  918. # ■ Interpreter
  919. #==============================================================================
  920. class Interpreter
  921.   #--------------------------------------------------------------------------
  922.   # ● 设置事件
  923.   #     event_id : 事件 ID
  924.   #--------------------------------------------------------------------------
  925.   alias setup_fuki setup
  926.   def setup(list, event_id)
  927.     setup_fuki(list, event_id)
  928.     # 如果不是战斗中
  929.     if !($game_temp.in_battle)
  930.       # 记录事件 ID
  931.       $active_event_id = event_id
  932.     end
  933.   end
  934. end
  935. #==============================================================================
  936. # ■ Scene_Map
  937. #==============================================================================
  938. class Scene_Map
  939.   #--------------------------------------------------------------------------
  940.   # ● 主处理
  941.   #--------------------------------------------------------------------------
  942.   def main
  943.     # 生成活动块
  944.     @spriteset = Spriteset_Map.new
  945.     # 生成信息窗口
  946.     @message_window = Window_FukiMessage.new
  947.     # 执行过渡
  948.     Graphics.transition
  949.     # 主循环
  950.     loop do
  951.       # 刷新游戏画面
  952.       Graphics.update
  953.       # 刷新输入信息
  954.       Input.update
  955.       # 刷新画面
  956.       update
  957.       # 如果画面切换的话就中断循环
  958.       if $scene != self
  959.         break
  960.       end
  961.     end
  962.     # 准备过渡
  963.     Graphics.freeze
  964.     # 释放活动块
  965.     @spriteset.dispose
  966.     # 释放信息窗口
  967.     @message_window.dispose
  968.     # 标题画面切换中的情况下
  969.     if $scene.is_a?(Scene_Title)
  970.       # 淡入淡出画面
  971.       Graphics.transition
  972.       Graphics.freeze
  973.     end
  974.   end
  975. end
  976. #==============================================================================
  977. # ■ Window_InputNumber
  978. #==============================================================================
  979. class Window_InputNumber < Window_Base
  980.   #--------------------------------------------------------------------------
  981.   # ● 初始化对像
  982.   #     digits_max : 位数
  983.   #--------------------------------------------------------------------------
  984.   def initialize(digits_max)
  985.     @digits_max = digits_max
  986.     @number = 0
  987.     # 从数字的幅度计算(假定与 0~9 等幅)光标的幅度
  988.     dummy_bitmap = Bitmap.new(32, 32)
  989.     dummy_bitmap.font.size = FUKI::MES_FONT_SIZE
  990.     @cursor_width = dummy_bitmap.text_size("0").width + 8
  991.     dummy_bitmap.dispose
  992.     super(0, 0, @cursor_width * @digits_max + 32, 64)
  993.     self.contents = Bitmap.new(width - 32, height - 32)
  994.     self.contents.font.size = FUKI::MES_FONT_SIZE
  995.     self.z += 9999
  996.     self.opacity = 0
  997.     @index = 0
  998.     refresh
  999.     update_cursor_rect
  1000.   end
  1001. end
复制代码
  1. class Game_Character
  2. attr_accessor :move_speed
  3. end
  4. class Game_Map
  5. attr_accessor :oldroute
  6. attr_accessor :oldeventsnums
  7. attr_reader   :map
  8. alias initialize_old initialize
  9. def initialize
  10.    initialize_old
  11.    @oldroute = []
  12.    @oldeventsnums = 0
  13. end
  14. end
  15. class Game_Player < Game_Character
  16. alias update_old update
  17. def update
  18.    last_moving = moving?
  19.    unless moving? or $game_system.map_interpreter.running? or
  20.           @move_route_forcing or $game_temp.message_window_showing
  21.      case Input.dir4
  22.      when 2
  23.        if passable?(@x, @y, 2)
  24.          $game_map.oldroute.push([@x,@y,2])
  25.          if $game_map.oldroute.size == $game_party.actors.size
  26.            $game_map.oldroute.shift
  27.          end
  28.        end
  29.        move_down
  30.      when 4
  31.        if passable?(@x, @y, 4)
  32.          $game_map.oldroute.push([@x,@y,4])
  33.          if $game_map.oldroute.size == $game_party.actors.size
  34.            $game_map.oldroute.shift
  35.          end
  36.        end
  37.        move_left
  38.      when 6
  39.        if passable?(@x, @y, 6)
  40.          $game_map.oldroute.push([@x,@y,6])
  41.          if $game_map.oldroute.size == $game_party.actors.size
  42.            $game_map.oldroute.shift
  43.          end
  44.        end
  45.        move_right
  46.      when 8
  47.        if passable?(@x, @y, 8)
  48.          $game_map.oldroute.push([@x,@y,8])
  49.          if $game_map.oldroute.size == $game_party.actors.size
  50.            $game_map.oldroute.shift
  51.          end
  52.        end
  53.        move_up
  54.      end
  55.    end
  56.    update_old
  57. end
  58. end
  59. class Interpreter
  60. def command_129
  61.    actor = $game_actors[@parameters[0]]
  62.    if actor != nil
  63.      if @parameters[1] == 0
  64.        if @parameters[2] == 1
  65.          $game_actors[@parameters[0]].setup(@parameters[0])
  66.        end
  67.        $game_party.add_actor(@parameters[0])
  68.        $scene.del_follow
  69.        $scene.follow_system
  70.      else
  71.        $game_party.remove_actor(@parameters[0])
  72.        $scene.del_follow
  73.        $scene.follow_system
  74.      end
  75.    end
  76.    return true
  77. end
  78. end
  79. class Scene_Map
  80. alias main_old main
  81. def main
  82.    @spriteset = Spriteset_Map.new
  83.    if $game_variables[1000] == 0
  84.      follow_system
  85.      $game_variables[1000] = 1
  86.    end
  87.    main_old
  88. end
  89.   
  90. alias update_old update
  91. def update
  92.    follow_system_update
  93.    update_old
  94. end
  95.   
  96. alias transfer_player_old transfer_player
  97. def transfer_player
  98.    $game_temp.player_transferring = false
  99.    if $game_map.map_id != $game_temp.player_new_map_id
  100.      del_follow
  101.      $game_map.setup($game_temp.player_new_map_id)
  102.    end
  103.    $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
  104.    follow_system
  105.    transfer_player_old
  106. end
  107.   
  108. def follow_system
  109.    $game_map.oldeventsnums = $game_map.events.size
  110.    if $game_party.actors.size>=2
  111.      for i in 2..$game_party.actors.size
  112.        # 为事件加上名字考虑做srpg用
  113.        name = "我军,"+i.to_s
  114.        character_name = $game_party.actors[i-1].character_name
  115.        party_event($game_player.x,$game_player.y,name,character_name)
  116.        $game_map.oldroute.push([$game_player.x,$game_player.y,$game_player.direction])
  117.       end
  118.    end
  119. end
  120. def del_follow
  121.    $game_map.oldroute.clear
  122.    for i in 1..($game_map.events.size-$game_map.oldeventsnums)
  123.      $game_map.events.delete($game_map.oldeventsnums+i)
  124.    end
  125. end
  126.   
  127. def party_event(x,y,name,character_name)
  128.    $game_map.events[$game_map.events.size+1] = Game_Event.new($game_map.map_id,produce_party_event(x,y,name,character_name))
  129.     $game_map.map.events[$game_map.events.size] = produce_party_event(x,y,name,character_name)
  130.     @spriteset.dispose
  131.    @spriteset = Spriteset_Map.new
  132. end
  133.   
  134. def produce_party_event(x,y,name,character_name)
  135.    e = RPG::Event.new(x,y)
  136.    e.id = $game_map.events.size
  137.    e.name = name
  138.    e.pages = [RPG::Event::Page.new]   
  139.    e.pages[0].graphic = RPG::Event::Page::Graphic.new
  140.    e.pages[0].graphic.character_name = character_name   
  141.    e.pages[0].through = true
  142.    return e
  143. end
  144.   
  145. def follow_system_update
  146.    num = $game_map.oldeventsnums
  147.    n = $game_player.move_speed
  148.    s=$game_map.oldroute.size-1
  149.    if s>=0
  150.      $game_map.events[num+1].move_speed = n
  151.      if $game_map.events[num+1].x>$game_map.oldroute[s][0]
  152.        $game_map.events[num+1].move_left
  153.      elsif $game_map.events[num+1].x<$game_map.oldroute[s][0]
  154.        $game_map.events[num+1].move_right
  155.      elsif $game_map.events[num+1].y>$game_map.oldroute[s][1]
  156.        $game_map.events[num+1].move_up
  157.      elsif $game_map.events[num+1].y<$game_map.oldroute[s][1]
  158.        $game_map.events[num+1].move_down
  159.      end
  160.    end
  161.    if s>=1
  162.      $game_map.events[num+2].move_speed = n
  163.      if $game_map.events[num+2].x>$game_map.oldroute[s-1][0]
  164.        $game_map.events[num+2].move_left
  165.      elsif $game_map.events[num+2].x<$game_map.oldroute[s-1][0]
  166.        $game_map.events[num+2].move_right
  167.      elsif $game_map.events[num+2].y>$game_map.oldroute[s-1][1]
  168.        $game_map.events[num+2].move_up
  169.      elsif $game_map.events[num+2].y<$game_map.oldroute[s-1][1]
  170.        $game_map.events[num+2].move_down
  171.      end
  172.    end
  173.    if s>=2
  174.      $game_map.events[num+3].move_speed = n
  175.      if $game_map.events[num+3].x>$game_map.oldroute[s-2][0]
  176.        $game_map.events[num+3].move_left
  177.      elsif $game_map.events[num+3].x<$game_map.oldroute[s-2][0]
  178.        $game_map.events[num+3].move_right
  179.      elsif $game_map.events[num+3].y>$game_map.oldroute[s-2][1]
  180.        $game_map.events[num+3].move_up
  181.      elsif $game_map.events[num+3].y<$game_map.oldroute[s-2][1]
  182.        $game_map.events[num+3].move_down
  183.      end
  184.    end
  185. end
  186. end
复制代码
如果跟随放到上面,添加队员时就会出现  interpreter 2   229行错误
如果呼出对话框在上,部分场所移动就会导致程序崩溃....
什么原因
dsu_plus_rewardpost_czw




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