Project1

标题: 我想在RMXP里加入一个任务系统,不知道具体怎么操作。 [打印本页]

作者: bb2132960    时间: 2011-10-8 02:56
标题: 我想在RMXP里加入一个任务系统,不知道具体怎么操作。
我用了搜索。。 无果·~~ = =!
到是找到了脚本 不知道咋用。

我的理解是,要在菜单里加一个【任务】选项

然后有一个脚本。
任务内容是不是在脚本里编辑?

不知道具体怎么操作 要注意些什么。

望高手告知,感激不尽。dsu_plus_rewardpost_czw
作者: 各种压力的猫君    时间: 2011-10-8 05:48
走还没学好不要急着跑,先看完新手录像/教程/F1帮助,
看完之后你自己就能写出简单的任务系统了。
“怎么使用脚本”这种问题也自然迎刃而解了 - -

欢迎新人,欢迎来本区学习交流,
但是本区伸手者砍手~❤
作者: 木许许    时间: 2011-10-8 09:02
http://rpg.blue/forum.php?mod=vi ... =%E4%BB%BB%E5%8A%A1

http://rpg.blue/portal.php?mod=view&aid=40182
作者: 我不是字母君    时间: 2011-10-8 10:33
本帖最后由 我不是字母君 于 2011-10-8 10:34 编辑

  1. #==============================================================================
  2. # ■ Window_PlayTime
  3. #------------------------------------------------------------------------------
  4. #  メニュー画面でプレイ時間を表示するウィンドウです。
  5. #==============================================================================

  6. $fontface = "微软雅黑"
  7. $fontsize = 20

  8. class Window_PlayTime < Window_Base
  9. #--------------------------------------------------------------------------
  10. # ● オブジェクト初期化
  11. #--------------------------------------------------------------------------
  12. def initialize
  13.    super(0, 0, 160, 70)
  14.    self.contents = Bitmap.new(width - 32, height - 32)
  15.    self.contents.font.name = $fontface
  16.    self.contents.font.size = $fontsize
  17.    refresh
  18. end
  19. #--------------------------------------------------------------------------
  20. # ● リフレッシュ
  21. #--------------------------------------------------------------------------
  22. def refresh
  23.    self.contents.clear
  24.    self.contents.font.color = system_color
  25.    self.contents.draw_text(0, -8, 120, 32, "游戏时间")
  26.    @total_sec = Graphics.frame_count / Graphics.frame_rate
  27.    hour = @total_sec / 60 / 60
  28.    min = @total_sec / 60 % 60
  29.    sec = @total_sec % 60
  30.    text = sprintf("%02d:%02d:%02d", hour, min, sec)
  31.    self.contents.font.color = normal_color
  32.    self.contents.draw_text(0, 12, 120, 32, text, 2)
  33. end
  34. #--------------------------------------------------------------------------
  35. # ● フレーム更新
  36. #--------------------------------------------------------------------------
  37. def update
  38.    super
  39.    if Graphics.frame_count / Graphics.frame_rate != @total_sec
  40.      refresh
  41.    end
  42. end
  43. end

  44. #==============================================================================
  45. # ■ Window_MapName
  46. # Location Script by Sunrunner
  47. #------------------------------------------------------------------------------
  48. #  メニュー画面で歩数を表示するウィンドウです。
  49. #==============================================================================

  50. class Window_MapName < Window_Base
  51. #--------------------------------------------------------------------------
  52. # ● オブジェクト初期化
  53. #--------------------------------------------------------------------------
  54. def initialize
  55.   super(0, 0, 160, 70)
  56.   self.contents = Bitmap.new(width - 32, height - 32)
  57.   self.contents.font.name = $fontface
  58.    self.contents.font.size = $fontsize
  59.   refresh
  60. end
  61. #--------------------------------------------------------------------------
  62. # ● リフレッシュ
  63. #--------------------------------------------------------------------------
  64. def refresh
  65.   self.contents.clear
  66.   self.contents.font.color = system_color
  67.   self.contents.draw_text(0, -8, 120, 32, "当前位置")
  68.   self.contents.font.color = normal_color
  69.   $maps = load_data("Data/MapInfos.rxdata")
  70. @map_id = $game_map.map_id
  71. @currentmap = $maps[@map_id].name
  72. self.contents.font.size = 18
  73. self.contents.draw_text(40,-5,440,64,@currentmap)

  74. end
  75. end

  76. #==============================================================================
  77. # ■ Window_Gold
  78. #------------------------------------------------------------------------------
  79. #  ゴールドを表示するウィンドウです。
  80. #==============================================================================

  81. class Window_Gold < Window_Base
  82. #--------------------------------------------------------------------------
  83. # ● オブジェクト初期化
  84. #--------------------------------------------------------------------------
  85. def initialize
  86.    super(0, 0, 160, 70)
  87.    self.contents = Bitmap.new(width - 32, height - 32)
  88.    self.contents.font.name = $fontface
  89.    self.contents.font.size = $fontsize
  90.    refresh
  91. end
  92. #--------------------------------------------------------------------------
  93. # ● リフレッシュ
  94. #--------------------------------------------------------------------------
  95. def refresh
  96.    self.contents.clear
  97.    self.contents.font.color = system_color
  98.    self.contents.draw_text(0, -8, 120, 32, "纹银")
  99. cx = contents.text_size($data_system.words.gold).width
  100.    self.contents.font.color = normal_color
  101.    self.contents.draw_text(0, 12, 120-cx-2, 32, $game_party.gold.to_s, 2)
  102. end
  103. end


  104. #==============================================================================
  105. # ■ Window_MenuStatus
  106. #------------------------------------------------------------------------------
  107. #  メニュー画面でパーティメンバーのステータスを表示するウィンドウです。
  108. #==============================================================================

  109. class Window_MenuStatus < Window_Selectable
  110. #--------------------------------------------------------------------------
  111. # ● オブジェクト初期化
  112. #--------------------------------------------------------------------------
  113. def initialize
  114.    super(0, 0, 480, 415)
  115.    self.contents = Bitmap.new(width - 32, height - 32)
  116.    self.contents.font.name = $fontface
  117.    self.contents.font.size = $fontsize
  118.      refresh
  119.    self.active = false
  120.    self.index = -1
  121. end
  122. #--------------------------------------------------------------------------
  123. # ● リフレッシュ
  124. #--------------------------------------------------------------------------
  125. def refresh
  126.    self.contents.clear
  127.    @item_max = $game_party.actors.size
  128.    for i in 0...$game_party.actors.size
  129.      x = 64
  130.      y = i * 95
  131.      actor = $game_party.actors[i]
  132.      draw_actor_graphic(actor, x - 30, y + 70)
  133.      draw_actor_name(actor, x, y)
  134.      draw_actor_class(actor, x + 134, y)
  135.      draw_actor_level(actor, x, y + 30)
  136.      draw_actor_state(actor, x + 80, y + 30)
  137.      draw_actor_exp(actor, x, y + 60)
  138.      draw_actor_hp(actor, x + 226, y + 30)
  139.      draw_actor_sp(actor, x + 226, y + 60)
  140.    end
  141. end
  142. #--------------------------------------------------------------------------
  143. # ● カーソルの矩形更新
  144. #--------------------------------------------------------------------------
  145. def update_cursor_rect
  146.    if @index < 0
  147.      self.cursor_rect.empty
  148.          else
  149.      self.cursor_rect.set(0, @index * 95, self.width - 32, 95)
  150.    end
  151. end
  152. end

  153. #==============================================================================
  154. # ■ Scene_Menu
  155. #------------------------------------------------------------------------------
  156. #  メニュー画面の処理を行うクラスです。
  157. #==============================================================================
  158. class Window_Title < Window_Base
  159. #--------------------------------------------------------------------------
  160. # ● オブジェクト初期化
  161. #--------------------------------------------------------------------------
  162. def initialize
  163.    super(38, 60, 156, 70)
  164.    self.contents = Bitmap.new(width - 32, height - 32)
  165.    self.contents.font.name = $fontface
  166.    self.contents.font.size = $fontsize
  167.    refresh
  168. end
  169.   def refresh
  170.    self.contents.clear
  171.     self.contents.font.color = system_color
  172.      self.contents.font.color = normal_color
  173.    self.contents.draw_text(30, 5, 100, 30, "菜单")
  174. end
  175. end
  176. #--------------------------------
  177. class Scene_Menu
  178. #--------------------------------------------------------------------------
  179. # ● オブジェクト初期化
  180. #     menu_index : コマンドのカーソル初期位置
  181. #--------------------------------------------------------------------------
  182. def initialize(menu_index = 0)
  183.   @menu_index = menu_index
  184. end
  185. #--------------------------------------------------------------------------
  186. # ● メイン処理
  187. #--------------------------------------------------------------------------
  188. def main
  189.        # ステータスウィンドウを作成
  190.   @scene_menu = Window_Title.new
  191.   @scene_menu.x = 6
  192.   @scene_menu.y = 0
  193.   @scene_menu.back_opacity = 160
  194.   # コマンドウィンドウを作成
  195.   @sprite = Spriteset_Map.new
  196.     s1 = "背包"
  197.     s2 = "仙术"
  198.     s3 = "装备"
  199.     s4 = "状态"
  200.     s5 = "存档"
  201.     s6 = "读档"
  202.     s7 = "任务"
  203.     s8 = "结束"
  204.   @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7, s8, "","","",""])
  205.   @command_window.index = @menu_index
  206.   @command_window.x = 5
  207.   @command_window.y = 66
  208.   @command_window.back_opacity = 160
  209.   # パーティ人数が 0 人の場合
  210.   if $game_party.actors.size == 0
  211.     # アイテム、スキル、装備、ステータスを無効化
  212.     @command_window.disable_item(0)
  213.     @command_window.disable_item(1)
  214.     @command_window.disable_item(2)
  215.     @command_window.disable_item(3)
  216.   end
  217.   # セーブ禁止の場合
  218.   if $game_system.save_disabled
  219.     # セーブを無効にする
  220.     @command_window.disable_item(4)
  221.   end
  222.   # プレイ時間ウィンドウを作成
  223.   @playtime_window = Window_PlayTime.new
  224.   @playtime_window.x = 320
  225.   @playtime_window.y = 0
  226.   @playtime_window.back_opacity = 160
  227.   # 歩数ウィンドウを作成
  228.   @steps_window = Window_MapName.new
  229.   @steps_window.x = 480
  230.   @steps_window.y = 0
  231.   @steps_window.back_opacity = 160
  232.   # ゴールドウィンドウを作成
  233.   @gold_window = Window_Gold.new
  234.   @gold_window.x = 162
  235.   @gold_window.y = 0
  236.   @gold_window.back_opacity = 160
  237.   # ステータスウィンドウを作成
  238.   @status_window = Window_MenuStatus.new
  239.   @status_window.x = 160
  240.   @status_window.y = 65
  241.   @status_window.back_opacity = 160
  242.     # トランジション実行
  243.      Graphics.transition
  244.   # メインループ
  245.   loop do
  246.     # ゲーム画面を更新
  247.     Graphics.update
  248.     # 入力情報を更新
  249.     Input.update
  250.     # フレーム更新
  251.     update
  252.     # 画面が切り替わったらループを中断
  253.     if $scene != self
  254.       break
  255.     end
  256.   end
  257.   # トランジション準備
  258.   Graphics.freeze
  259.   # ウィンドウを解放
  260.   @command_window.dispose
  261.   @playtime_window.dispose
  262.   @steps_window.dispose
  263.   @gold_window.dispose
  264.   @status_window.dispose
  265.   @scene_menu.dispose
  266.   @sprite.dispose
  267. end
  268. #--------------------------------------------------------------------------
  269. # ● フレーム更新
  270. #--------------------------------------------------------------------------
  271. def update
  272.   # ウィンドウを更新
  273.   @command_window.update
  274.   @playtime_window.update
  275.   @steps_window.update
  276.   @gold_window.update
  277.   @status_window.update
  278.   # コマンドウィンドウがアクティブの場合: update_command を呼ぶ
  279.   if @command_window.active
  280.     update_command
  281.     return
  282.   end
  283.   # ステータスウィンドウがアクティブの場合: update_status を呼ぶ
  284.   if @status_window.active
  285.     update_status
  286.     return
  287.   end
  288. end
  289. #--------------------------------------------------------------------------
  290. # ● フレーム更新 (コマンドウィンドウがアクティブの場合)
  291. #--------------------------------------------------------------------------
  292. def update_command
  293.   # B ボタンが押された場合
  294.   if Input.trigger?(Input::B)
  295.     # キャンセル SE を演奏
  296.     $game_system.se_play($data_system.cancel_se)
  297.     # マップ画面に切り替え
  298.     $scene = Scene_Map.new
  299.     return
  300.   end
  301.   # C ボタンが押された場合
  302.   if Input.trigger?(Input::C)
  303.     # パーティ人数が 0 人で、セーブ、ゲーム終了以外のコマンドの場合
  304.     if $game_party.actors.size == 0 and @command_window.index < 4
  305.       # ブザー SE を演奏
  306.       $game_system.se_play($data_system.buzzer_se)
  307.       return
  308.     end
  309.     # コマンドウィンドウのカーソル位置で分岐
  310.       case @command_window.index
  311.       when 0  # アイテム
  312.         $game_system.se_play($data_system.decision_se)
  313.         # 切换到物品画面
  314.         $scene = Scene_Item.new
  315.       when 1  # スキル
  316.         $game_system.se_play($data_system.decision_se)
  317.         # 激活状态窗口
  318.         @command_window.active = false
  319.         @status_window.active = true
  320.         @status_window.index = 0
  321.       when 2  # 装備
  322.         $game_system.se_play($data_system.decision_se)
  323.         # 激活状态窗口
  324.         @command_window.active = false
  325.         @status_window.active = true
  326.         @status_window.index = 0
  327.       when 3  # ステータス
  328.         $game_system.se_play($data_system.decision_se)
  329.         # 激活状态窗口
  330.         @command_window.active = false
  331.         @status_window.active = true
  332.         @status_window.index = 0
  333.         
  334.       when 4  # セーブ
  335.         # セーブ禁止の場合
  336.         if $game_system.save_disabled
  337.           # 演奏冻结 SE
  338.           $game_system.se_play($data_system.buzzer_se)
  339.           return
  340.         end
  341.         # 演奏确定 SE
  342.         $game_system.se_play($data_system.decision_se)
  343.         # 切换到存档画面
  344.         $scene = Scene_Save.new
  345.       when 5  # ロード
  346.         Input.update
  347.         # 決定 SE を演奏
  348.         $game_system.se_play($data_system.decision_se)
  349.         # セーブ画面に切り替え
  350.         $scene = Scene_Load.new
  351.       when 6
  352.         $game_system.se_play($data_system.decision_se)
  353.         $scene=Scene_Task.new
  354.       when 7  # ゲーム終了
  355.         # 決定 SE を演奏
  356.         $game_system.se_play($data_system.decision_se)
  357.         # ゲーム終了画面に切り替え
  358.         $scene = Scene_End.new
  359.       else
  360.         
  361.       end
  362.       return
  363.   end
  364. end
  365. #--------------------------------------------------------------------------
  366. # ● フレーム更新 (ステータスウィンドウがアクティブの場合)
  367. #--------------------------------------------------------------------------
  368. def update_status
  369.   # B ボタンが押された場合
  370.   if Input.trigger?(Input::B)
  371.     # キャンセル SE を演奏
  372.     $game_system.se_play($data_system.cancel_se)
  373.     # コマンドウィンドウをアクティブにする
  374.     @command_window.active = true
  375.     @status_window.active = false
  376.     @status_window.index = -1
  377.     return
  378.   end
  379.   # C ボタンが押された場合
  380.   if Input.trigger?(Input::C)
  381.     # コマンドウィンドウのカーソル位置で分岐
  382.     case @command_window.index
  383.     when 1  # スキル
  384.       # このアクターの行動制限が 2 以上の場合
  385.       if $game_party.actors[@status_window.index].restriction >= 2
  386.         # ブザー SE を演奏
  387.         $game_system.se_play($data_system.buzzer_se)
  388.         return
  389.       end
  390.       # 決定 SE を演奏
  391.       $game_system.se_play($data_system.decision_se)
  392.       # スキル画面に切り替え
  393.       $scene = Scene_Skill.new(@status_window.index)
  394.     when 2  # 装備
  395.       # 決定 SE を演奏
  396.       $game_system.se_play($data_system.decision_se)
  397.       # 装備画面に切り替え
  398.       $scene = Scene_Equip.new(@status_window.index)
  399.     when 3  # ステータス
  400.       # 決定 SE を演奏
  401.       $game_system.se_play($data_system.decision_se)
  402.       # ステータス画面に切り替え
  403.       $scene = Scene_Status.new(@status_window.index)
  404.     end
  405.     return
  406.   end
  407. end
  408. end

  409. #超级菜单脚本(完全重写)
  410. =begin
  411. --------------------------------------------------------------------------
  412. 详尽任务显示界面 v2.1
  413. --------------------------------------------------------------------------
  414. By 叶子

  415. 日期与更新
  416. 3-29-2006 -v1.0
  417. 4-3-2006  -v2.0
  418. -可以改变文字颜色,显示变量,显示图标,显示图片
  419. -大幅简化了编写任务内容的过程,加入自动换行功能
  420. -精简了窗口,使其还可以用作图鉴系统、日记系统等等
  421. 4-6-2006  -v2.1
  422. -增加了获得全部任务与删除全部任务命令
  423. -改正通假字,修改了示例任务3
  424. --------------------------------------------------------------------------
  425. 顾名思义,就是显示任务资料的界面
  426. 任务资料要预先在这里设定好
  427. 下载范例工程,能帮助你更快更好地掌握使用方法
  428. --------------------------------------------------------------------------
  429. 使用方法:

  430. 1、召唤任务显示界面:$scene = Scene_Task.new

  431. 可以在事件中的“脚本”指令加入这段东西,又或者修改 Scene_Menu 来增加一个显示
  432. 任务的选项。如果是修改 Scene_Menu 增加选项的话,在脚本倒数第30行左右,
  433. 把 $scene = Scene_Map.new 修改成 $scene = Scene_Menu.new(任务界面index)

  434. 2、设置任务资料

  435.   2.1、相关内容解析
  436.   
  437.   所有内容文字必须用双引号括住
  438.   
  439.   名称:任务的名字(显示在左边窗口中),大小为208×32,如果全部为文字的话,
  440.         够放九个全角字符
  441.         
  442.   简介:任务的介绍(显示在右边窗口中),宽368,高不限
  443.   
  444.         文字可以自动换行
  445.   
  446.    2.1.1、控制码解析
  447.    
  448.    名称和内容均可用控制码,注意两条反斜线都要打!
  449.    
  450.    \\v[n] 显示n号变量
  451.    \\c[n] 改变字体颜色。
  452.           n=1~7 时同“显示文章”的\c[n],n=8 时为半透明色,n=9 时为系统色(青色)
  453.    \\n[i] 显示i号角色名字
  454.    \\i[文件名] 显示图标
  455.    \\p[文件名] 显示图片
  456.    
  457.    2.1.2、高级:内嵌表达式
  458.         
  459.    请参考帮助-脚本入门-字符串-内嵌表达式相关内容。
  460.    它可以用来在任务的名称和简介那里显示变量。
  461.    常用的表达式(注意不要漏了井号和大括号):
  462.    #{$game_variables[n]}       ——插入n号变量的值
  463.    #{$game_party.item_number(n)}  ——插入持有n号物品数量
  464.                                       同理还有weapon_number,armor_number
  465.    还可以预先定义一个变量,再插入(例子见示例任务3-灵魂线)
  466.    
  467.   2.2、注意事项
  468.   
  469.    2.2.1、括号、逗号和双引号 [ ] , " 必须使用半角符号(英文输入),
  470.           引号内的内容则没有关系
  471.          
  472.    2.2.2、单引号 ' 和双引号 " 的区别:
  473.           为了不出错误,全部用双引号吧!当然如果你对Ruby很熟悉,那就没所谓了
  474.   
  475.   2.3、开始设置吧!
  476.   从107行开始设置任务资料,可以参考示例任务来设置,请仔细阅读附加讲解
  477.   
  478. 3、接受任务

  479. 事件里的“脚本”指令输入:get_task(任务ID)
  480. 例如 get_task(1) 就是接受1号任务

  481.   3.1、获得全部任务
  482.   
  483.   事件里的“脚本”指令输入:get_all_task
  484.   这个功能基本上是用来在编写好所有任务资料后测试排版的
  485.   

  486. 4、完成/删除任务

  487. 事件里的“脚本”指令输入:finish_task(任务ID)
  488. 例如 finish_task(1) 就是完成1号任务

  489. 注意:本脚本不负责完成任务后的奖励之类的东西,请自行在事件中判断,
  490.        这里的完成任务指的是从任务列表中删去此任务

  491.   4.1、删除全部任务
  492.   
  493.   事件里的“脚本”指令输入:finish_all_task
  494.   作为获得全部任务的对应功能存在,似乎不会怎么用到
  495. =end

  496. class Scene_Task
  497.   # 这里设置任务内容翻页音效
  498.   CHANGE_PAGE_SE = "Audio/SE/046-Book01"
  499. end

  500. class Game_Party
  501.   #--------------------------------------------------------------------------
  502.   # ● 设置任务资料
  503.   #--------------------------------------------------------------------------
  504.   def get_tasks_info
  505.     @tasks_info = []
  506.     名称 = "\\c[6]与群鬼的首领战斗"
  507.     简介 = "\\c[6]与群鬼的首领战斗
  508.    
  509.     \\c[9]任务目标:
  510.     找到群鬼的首领,与其战斗一次
  511.    
  512.     \\c[0]与群鬼的首领的战斗次数:0/1"
  513.     @tasks_info[1] = Game_Task.new(名称, 简介)
  514.     名称 = "\\c[6]出去接客(李大娘)"
  515.     简介 = "\\c[6]出去接客(李大娘)
  516.    
  517.     \\c[9]任务目标:
  518.     李逍遥这个混小子,不知又去哪里玩了。我得赶紧出去接待各位客官
  519.    
  520.     \\c[0]接待客官次数:0/1"
  521.     @tasks_info[2] = Game_Task.new(名称, 简介)
  522.   end
  523. end
  524.    
  525. #==============================================================================
  526. # ■ Interpreter
  527. #------------------------------------------------------------------------------
  528. #  执行事件命令的解释器。本类在 Game_System 类
  529. # 与 Game_Event 类的内部使用。
  530. #==============================================================================

  531. class Interpreter
  532.   #--------------------------------------------------------------------------
  533.   # ● 接受任务
  534.   #--------------------------------------------------------------------------
  535.   def get_task(id)
  536.     task = $game_party.tasks_info[id]
  537.     return true if (task.nil? or $game_party.current_tasks.include?(task.id))
  538.     $game_party.current_tasks.unshift(task.id)
  539.     return true
  540.   end
  541.   #--------------------------------------------------------------------------
  542.   # ● 获得全部任务
  543.   #--------------------------------------------------------------------------
  544.   def get_all_task
  545.     # 清空当前任务
  546.     $game_party.current_tasks.clear
  547.     for task in $game_party.tasks_info
  548.       next if task.nil?
  549.       $game_party.current_tasks.unshift(task.id)
  550.     end
  551.     return true
  552.   end
  553.   #--------------------------------------------------------------------------
  554.   # ● 完成/放弃任务
  555.   #--------------------------------------------------------------------------
  556.   def finish_task(id)
  557.     task = $game_party.tasks_info[id]
  558.     return true if task.nil?
  559.     $game_party.current_tasks.delete(task.id)
  560.     return true
  561.   end
  562.   #--------------------------------------------------------------------------
  563.   # ● 删除全部任务
  564.   #--------------------------------------------------------------------------
  565.   def finish_all_task
  566.     $game_party.current_tasks.clear
  567.     return true
  568.   end
  569. end

  570. #==============================================================================
  571. # ■ Game_Party
  572. #------------------------------------------------------------------------------
  573. #  处理同伴的类。包含金钱以及物品的信息。本类的实例
  574. # 请参考 $game_party。
  575. #==============================================================================

  576. class Game_Party
  577.   #--------------------------------------------------------------------------
  578.   # ● 定义实例变量
  579.   #--------------------------------------------------------------------------
  580.   attr_writer     :latest_task                  # 上次查看的任务
  581.   #--------------------------------------------------------------------------
  582.   # ● 取得任务资料
  583.   #--------------------------------------------------------------------------
  584.   def tasks_info
  585.     if @tasks_info.nil?
  586.       get_tasks_info
  587.     end
  588.     return @tasks_info
  589.   end
  590.   #--------------------------------------------------------------------------
  591.   # ● 取得当前任务
  592.   #--------------------------------------------------------------------------
  593.   def current_tasks
  594.     if @current_tasks.nil?
  595.       @current_tasks = []
  596.     end
  597.     return @current_tasks
  598.   end
  599.   #--------------------------------------------------------------------------
  600.   # ● 上次查看的任务
  601.   #--------------------------------------------------------------------------
  602.   def latest_task
  603.     if !current_tasks.include?(@latest_task)
  604.       @latest_task = current_tasks[0]
  605.     end
  606.     return @latest_task
  607.   end
  608. end

  609. #==============================================================================
  610. # ■ Game_Task
  611. #------------------------------------------------------------------------------
  612. #  处理任务的类。包含任务的信息。
  613. #==============================================================================

  614. class Game_Task
  615.   attr_accessor   :name                   # 名称
  616.   attr_accessor   :briefing               # 简介
  617.   def initialize(name, briefing)
  618.     @name = name
  619.     @briefing = briefing
  620.   end
  621.   def height
  622.     text = @briefing.clone
  623.     x = 0
  624.     y = 64
  625.     min_y = 0
  626.     # 限制文字处理
  627.     begin
  628.       last_text = text.clone
  629.       text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  630.     end until text == last_text
  631.     text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  632.       $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  633.     end
  634.     # 为了方便、将 "\\\\" 变换为 "\000"
  635.     text.gsub!(/\\\\/) { "\000" }
  636.     # "\C" 变为 "\001"
  637.     text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  638.     # "\I" 变为 "\002"
  639.     text.gsub!(/\\[Ii]/) { "\002" }
  640.     # "\P" 变为 "\003"
  641.     text.gsub!(/\\[Pp]/) { "\003" }
  642.     # c 获取 1 个字 (如果不能取得文字就循环)
  643.     while ((c = text.slice!(/./m)) != nil)
  644.       # \\ 的情况下
  645.       if c == "\000"
  646.         # 还原为本来的文字
  647.         c = "\\"
  648.       end
  649.       # \C[n] 的情况下
  650.       if c == "\001"
  651.         # 更改文字色
  652.         text.sub!(/\[([0-9]+)\]/, "")
  653.         # 下面的文字
  654.         next
  655.       end
  656.       # 图标的情况下
  657.       if c == "\002"
  658.         icon_name = ''
  659.         while ((cha = text.slice!(/./m)) != ']')
  660.           next if cha == '['
  661.           icon_name += cha
  662.         end
  663.         icon = RPG::Cache.icon(icon_name)
  664.         if x + icon.width > 368
  665.           x = 0
  666.           y += [32, min_y].max
  667.           min_y = 0
  668.         end
  669.         x += 28
  670.         next
  671.       end
  672.       # 图片的情况下
  673.       if c == "\003"
  674.         pic_name = ''
  675.         while ((cha = text.slice!(/./m)) != ']')
  676.           next if cha == '['
  677.           pic_name += cha
  678.         end
  679.         pic = RPG::Cache.picture(pic_name)
  680.         if x + pic.width > 368
  681.           x = 0
  682.           y += [32, min_y].max
  683.           min_y = 0
  684.         end
  685.         x += pic.width
  686.         min_y = [pic.height, 32].max
  687.         next
  688.       end
  689.       # 另起一行文字的情况下
  690.       if c == "\n"
  691.         y += [32, min_y].max
  692.         min_y = 0
  693.         x = 0
  694.         # 下面的文字
  695.         next
  696.       end
  697.       # 自动换行处理
  698.       if x + 22 > 368
  699.         y += [32, min_y].max
  700.         min_y = 0
  701.         x = 0
  702.       end
  703.       # x 为要描绘文字的加法运算
  704.       x += 22
  705.     end
  706.     return (y + [32, min_y].max)
  707.   end
  708.   def id
  709.     return $game_party.tasks_info.index(self)
  710.   end
  711. end

  712. #==============================================================================
  713. # ■ Window_Task_Name
  714. #------------------------------------------------------------------------------
  715. #  任务名称显示窗口。
  716. #==============================================================================

  717. class Window_Task_Name < Window_Selectable
  718.   #--------------------------------------------------------------------------
  719.   # ● 初始化对像
  720.   #--------------------------------------------------------------------------
  721.   def initialize(tasks)
  722.     super(0, 0, 240, 480)
  723.     @tasks = []
  724.     for id in tasks
  725.       @tasks.push($game_party.tasks_info[id])
  726.     end
  727.     @item_max = tasks.size
  728.     self.contents = Bitmap.new(
  729.     self.width - 32, @item_max == 0 ? 32 : @item_max * 32)
  730.     refresh
  731.     self.index = 0
  732.   end
  733.   #--------------------------------------------------------------------------
  734.   # ● 刷新
  735.   #--------------------------------------------------------------------------
  736.   def refresh
  737.     self.contents.clear
  738.     if @tasks != []
  739.       for task in @tasks
  740.         draw_item(task)
  741.       end
  742.     else
  743.       draw_blank
  744.     end
  745.   end
  746.   #--------------------------------------------------------------------------
  747.   # ● 描绘项目
  748.   #--------------------------------------------------------------------------
  749.   def draw_item(task)
  750.     text = task.name.clone
  751.     x = 0
  752.     y = @tasks.index(task) * 32
  753.     # 限制文字处理
  754.     begin
  755.       last_text = text.clone
  756.       text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  757.     end until text == last_text
  758.     text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  759.       $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  760.     end
  761.     # 为了方便、将 "\\\\" 变换为 "\000"
  762.     text.gsub!(/\\\\/) { "\000" }
  763.     # "\\C" 变为 "\001"
  764.     text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  765.     # "\I" 变为 "\002"
  766.     text.gsub!(/\\[Ii]/) { "\002" }
  767.     # "\P" 变为 "\003"
  768.     text.gsub!(/\\[Pp]/) { "\003" }
  769.     # c 获取 1 个字 (如果不能取得文字就循环)
  770.     while ((c = text.slice!(/./m)) != nil)
  771.       # \\ 的情况下
  772.       if c == "\000"
  773.         # 还原为本来的文字
  774.         c = "\\"
  775.       end
  776.       # \C[n] 的情况下
  777.       if c == "\001"
  778.         # 更改文字色
  779.         text.sub!(/\[([0-9]+)\]/, "")
  780.         color = $1.to_i
  781.         if color >= 0 and color <= 7
  782.           self.contents.font.color = text_color(color)
  783.         elsif color == 8
  784.           self.contents.font.color = disabled_color
  785.         elsif color == 9
  786.           self.contents.font.color = system_color
  787.         end
  788.         # 下面的文字
  789.         next
  790.       end
  791.       # 图标的情况下
  792.       if c == "\002"
  793.         icon_name = ''
  794.         while ((cha = text.slice!(/./m)) != ']')
  795.           next if cha == '['
  796.           icon_name += cha
  797.         end
  798.         icon = RPG::Cache.icon(icon_name)
  799.         if x + icon.width > self.contents.width
  800.           x = 0
  801.           y += [32, min_y].max
  802.           min_y = 0
  803.         end
  804.         self.contents.blt(x + 4, y + 4, icon, Rect.new(0, 0, 24, 24))
  805.         x += 28
  806.         next
  807.       end
  808.       # 图片的情况下
  809.       if c == "\003"
  810.         pic_name = ''
  811.         while ((cha = text.slice!(/./m)) != ']')
  812.           next if cha == '['
  813.           pic_name += cha
  814.         end
  815.         pic = RPG::Cache.picture(pic_name)
  816.         if x + pic.width > self.contents.width
  817.           x = 0
  818.           y += [32, min_y].max
  819.           min_y = 0
  820.         end
  821.         self.contents.blt(x + 4, y, pic, Rect.new(0, 0, pic.width, pic.height))
  822.         x += pic.width
  823.         next
  824.       end
  825.       # 描绘文字
  826.       self.contents.draw_text(4 + x, y, 40, 32, c)
  827.       # x 为要描绘文字的加法运算
  828.       x += self.contents.text_size(c).width
  829.     end
  830.   end
  831.   #--------------------------------------------------------------------------
  832.   # ● 描绘空行
  833.   #--------------------------------------------------------------------------
  834.   def draw_blank
  835.     self.contents.font.color = disabled_color
  836.     rect = Rect.new(4, 0, self.contents.width - 8, 32)
  837.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  838.     self.contents.draw_text(rect, '当前没有任何任务')
  839.   end
  840.   #--------------------------------------------------------------------------
  841.   # ● 获取任务
  842.   #--------------------------------------------------------------------------
  843.   def task
  844.     return @tasks[self.index]
  845.   end
  846. end
  847.   
  848. #==============================================================================
  849. # ■ Window_Task
  850. #------------------------------------------------------------------------------
  851. #  任务内容显示窗口。
  852. #==============================================================================

  853. class Window_Task < Window_Base
  854.   #--------------------------------------------------------------------------
  855.   # ● 初始化对像
  856.   #--------------------------------------------------------------------------
  857.   def initialize(task_id)
  858.     super(240, 0, 400, 480)
  859.     refresh(task_id)
  860.   end
  861.   #--------------------------------------------------------------------------
  862.   # ● 刷新内容
  863.   #--------------------------------------------------------------------------
  864.   def refresh(task_id)
  865.     self.oy = 0
  866.     self.visible = true
  867.     return if task_id.nil?
  868.     task = $game_party.tasks_info[task_id]
  869.     if !task.nil?
  870.       self.contents = Bitmap.new(self.width - 32, task.height)
  871.     else
  872.       self.contents = Bitmap.new(self.width - 32, self.height - 32)
  873.       return
  874.     end
  875.     self.contents.font.color = normal_color
  876.     # 描绘任务内容
  877.     draw_task_info(task)
  878.   end
  879.   #--------------------------------------------------------------------------
  880.   # ● 描绘任务内容
  881.   #--------------------------------------------------------------------------
  882.   def draw_task_info(task)
  883.     # 记录文字x坐标
  884.     x = 0
  885.     # 记录文字y坐标
  886.     y = 0
  887.     # 记录换行时y坐标最小加值
  888.     min_y = 0
  889.     self.contents.font.color = normal_color
  890.     # 描绘任务简介
  891.     text = task.briefing.clone
  892.     # 限制文字处理
  893.     begin
  894.       last_text = text.clone
  895.       text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  896.     end until text == last_text
  897.     text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  898.       $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  899.     end
  900.     # 为了方便、将 "\\\\" 变换为 "\000"
  901.     text.gsub!(/\\\\/) { "\000" }
  902.     # "\C" 变为 "\001"
  903.     text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  904.     # "\I" 变为 "\002"
  905.     text.gsub!(/\\[Ii]/) { "\002" }
  906.     # "\P" 变为 "\003"
  907.     text.gsub!(/\\[Pp]/) { "\003" }
  908.     # c 获取 1 个字 (如果不能取得文字就循环)
  909.     while ((c = text.slice!(/./m)) != nil)
  910.       # \\ 的情况下
  911.       if c == "\000"
  912.         # 还原为本来的文字
  913.         c = "\\"
  914.       end
  915.       # \C[n] 的情况下
  916.       if c == "\001"
  917.         # 更改文字色
  918.         text.sub!(/\[([0-9]+)\]/, "")
  919.         color = $1.to_i
  920.         if color >= 0 and color <= 7
  921.           self.contents.font.color = text_color(color)
  922.         elsif color == 8
  923.           self.contents.font.color = disabled_color
  924.         elsif color == 9
  925.           self.contents.font.color = system_color
  926.         end
  927.         # 下面的文字
  928.         next
  929.       end
  930.       # 图标的情况下
  931.       if c == "\002"
  932.         icon_name = ''
  933.         while ((cha = text.slice!(/./m)) != ']')
  934.           next if cha == '['
  935.           icon_name += cha
  936.         end
  937.         icon = RPG::Cache.icon(icon_name)
  938.         if x + icon.width > self.contents.width
  939.           x = 0
  940.           y += [32, min_y].max
  941.           min_y = 0
  942.         end
  943.         self.contents.blt(x + 4, y + 4, icon, Rect.new(0, 0, 24, 24))
  944.         x += 28
  945.         next
  946.       end
  947.       # 图片的情况下
  948.       if c == "\003"
  949.         pic_name = ''
  950.         while ((cha = text.slice!(/./m)) != ']')
  951.           next if cha == '['
  952.           pic_name += cha
  953.         end
  954.         pic = RPG::Cache.picture(pic_name)
  955.         if x + pic.width > self.contents.width
  956.           x = 0
  957.           y += [32, min_y].max
  958.           min_y = 0
  959.         end
  960.         self.contents.blt(x + 4, y, pic, Rect.new(0, 0, pic.width, pic.height))
  961.         x += pic.width
  962.         min_y = [pic.height, 32].max
  963.         next
  964.       end
  965.       # 另起一行文字的情况下
  966.       if c == "\n"
  967.         y += [32, min_y].max
  968.         min_y = 0
  969.         x = 0
  970.         # 下面的文字
  971.         next
  972.       end
  973.       # 自动换行处理
  974.       if x + self.contents.text_size(c).width > self.contents.width
  975.         y += [32, min_y].max
  976.         min_y = 0
  977.         x = 0
  978.       end
  979.       # 描绘文字
  980.       self.contents.draw_text(4 + x, y, 40, 32, c)
  981.       # x 为要描绘文字的加法运算
  982.       x += self.contents.text_size(c).width
  983.     end
  984.   end
  985. end

  986. #==============================================================================
  987. # ■ Scene_Task
  988. #------------------------------------------------------------------------------
  989. #  处理任务画面的类。
  990. #==============================================================================

  991. class Scene_Task
  992.   #--------------------------------------------------------------------------
  993.   # ● 主处理
  994.   #--------------------------------------------------------------------------
  995.   def main
  996.     # 刷新任务资料
  997.     $game_party.get_tasks_info
  998.     # 生成任务名称窗口
  999.     @task_names_window = Window_Task_Name.new($game_party.current_tasks)
  1000.     @task_names_window.active = true
  1001.     if $game_party.current_tasks != []
  1002.       @task_names_window.index = $game_party.current_tasks.index($game_party.latest_task)
  1003.     end
  1004.     # 生成任务内容窗口
  1005.     @task_info_window = Window_Task.new($game_party.latest_task)
  1006.     @task_info_window.active = true
  1007.     # 执行过渡
  1008.     Graphics.transition
  1009.     # 主循环
  1010.     loop do
  1011.       # 刷新游戏画面
  1012.       Graphics.update
  1013.       # 刷新输入信息
  1014.       Input.update
  1015.       # 刷新画面
  1016.       update
  1017.       # 如果画面被切换的话就中断循环
  1018.       if $scene != self
  1019.         break
  1020.       end
  1021.     end
  1022.     # 准备过渡
  1023.     Graphics.freeze
  1024.     # 释放窗口
  1025.     @task_names_window.dispose
  1026.     @task_info_window.dispose
  1027.   end
  1028.   #--------------------------------------------------------------------------
  1029.   # ● 刷新画面
  1030.   #--------------------------------------------------------------------------
  1031.   def update
  1032.     # 刷新窗口
  1033.     @task_names_window.update
  1034.     @task_info_window.update
  1035.     update_task_names_window
  1036.   end
  1037.   #--------------------------------------------------------------------------
  1038.   # ● 刷新任务名称窗口
  1039.   #--------------------------------------------------------------------------
  1040.   def update_task_names_window
  1041.     # 按下 B 键的情况下
  1042.     if Input.trigger?(Input::B)
  1043.       # 演奏取消 SE
  1044.       $game_system.se_play($data_system.cancel_se)
  1045.       # 这里设置返回的场景,返回地图是Scene_Map.new,菜单是Scene_Menu.new(任务界面index)
  1046.       $scene = Scene_Map.new
  1047.       return
  1048.     end
  1049.     # 按下 C 键的情况下
  1050.     if Input.trigger?(Input::C)
  1051.       # 无任务可显示的话
  1052.       if @task_names_window.task == nil
  1053.         # 演奏冻结 SE
  1054.         $game_system.se_play($data_system.buzzer_se)
  1055.         return
  1056.       end
  1057.       # 如果光标没有移动的话,翻页
  1058.       if $game_party.latest_task == @task_names_window.task.id
  1059.         if @task_info_window.oy + @task_info_window.height - 32 > @task_info_window.contents.height
  1060.           @task_info_window.oy = 0
  1061.         else
  1062.           @task_info_window.oy += 480-32
  1063.         end
  1064.         if @task_info_window.contents.height > @task_info_window.height - 32
  1065.           # 演奏翻页 SE
  1066.           Audio.se_play(CHANGE_PAGE_SE)
  1067.         end
  1068.       else
  1069.         @task_info_window.refresh(@task_names_window.task.id)
  1070.         $game_party.latest_task = @task_names_window.task.id
  1071.         # 演奏确定 SE
  1072.         $game_system.se_play($data_system.decision_se)
  1073.       end
  1074.     end
  1075.   end
  1076. end
  1077. #==============================================================================
  1078. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  1079. #==============================================================================
复制代码
用本脚本替换Scene_Menu全部内容即可
作者: bb2132960    时间: 2011-10-8 13:36
我不是字母君 发表于 2011-10-8 10:33
用本脚本替换Scene_Menu全部内容即可

感谢了 不知解决了我的任务问题 还让我领悟了一些其他的东西。。。

会在这个脚本上慢慢摸索的~~再次感谢




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