Project1

标题: 【原创】va任务系统 [打印本页]

作者: 韩云溪    时间: 2011-12-22 01:57
标题: 【原创】va任务系统
本帖最后由 韩云溪 于 2011-12-24 16:02 编辑

脚本:
  1. class Task
  2.   attr_reader :desc
  3.   attr_reader :finished
  4.   def initialize(origin_name,desc)
  5.     @origin_name = origin_name
  6.     @desc = desc
  7.     @finished = false
  8.   end
  9.   def name
  10.     if @finished
  11.       return @origin_name + "(完成)"
  12.     else
  13.       return @origin_name
  14.     end
  15.   end
  16.   def finish
  17.     @finished = true
  18.   end
  19.    
  20. end

  21. class Game_Party < Game_Unit
  22.   alias old_init initialize
  23.   def initialize
  24.     old_init
  25.     @tasks = {}
  26.   end
  27.   def get_task(i,name,desc)
  28.     @tasks[i]=Task.new(name,desc)
  29.   end
  30.   def have_task?(i)
  31.     @tasks[i] != nil
  32.   end
  33.   def finish_task(i)
  34.     @tasks[i].finish if have_task?(i)
  35.   end
  36.   def unfinished_tasks
  37.     n = []
  38.     for i in @tasks.values
  39.       next if i.finished
  40.       n.push(i)
  41.     end
  42.     return n
  43.   end
  44.   def finished_tasks
  45.     n = []
  46.     for i in @tasks.values
  47.       next unless i.finished
  48.       n.push(i)
  49.     end
  50.     return n
  51.   end
  52. end

  53. class Window_Task_Type < Window_HorzCommand
  54.   #--------------------------------------------------------------------------
  55.   # ● オブジェクト初期化
  56.   #--------------------------------------------------------------------------
  57.   def initialize
  58.     super(0, 0)
  59.     activate
  60.   end
  61.   def window_width
  62.     return Graphics.width
  63.   end
  64.   def col_max
  65.     return 3
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● コマンドリストの作成
  69.   #--------------------------------------------------------------------------
  70.   def make_command_list
  71.     add_command("未完成任务",  :unfinished_task)
  72.     add_command("已完成任务", :finished_task)
  73.     add_command("取消", :cancel)
  74.   end
  75. end

  76. class Window_TaskLeft < Window_Selectable
  77.   attr_reader :finished
  78.   def initialize
  79.     super(0,48,160,Graphics.height - 48)
  80.     create_contents
  81.     @finished = false
  82.     @index = 0
  83.     refresh
  84.     deactivate
  85.   end
  86.   def set_finish(finish)
  87.     @finished = finish
  88.     set_item_max
  89.   end
  90.   def item_max
  91.     return @item_max != nil ? @item_max : 0
  92.   end
  93.   def set_item_max
  94.     if @finished
  95.       @item_max = $game_party.finished_tasks.size
  96.     else
  97.       @item_max = $game_party.unfinished_tasks.size
  98.     end
  99.   end

  100.   def refresh
  101.     set_item_max
  102.     super
  103.   end
  104.   #--------------------------------------------------------------------------
  105.   # ● 項目の描画
  106.   #--------------------------------------------------------------------------
  107.   def draw_item(index)
  108.     text = ""
  109.     unless @finished
  110.       if $game_party.unfinished_tasks[index] != nil
  111.         text = $game_party.unfinished_tasks[index].name
  112.       end
  113.     else
  114.       if $game_party.finished_tasks[index] != nil
  115.         text = $game_party.finished_tasks[index].name  
  116.       end
  117.     end
  118.     draw_text(item_rect_for_text(index), text)
  119.   end

  120. end

  121. class Window_TaskRight < Window_Base
  122.   attr_reader :left_index
  123.   def initialize
  124.     super(160,48,Graphics.width - 160,Graphics.height - 48)
  125.     create_contents
  126.     @left_index = 0
  127.     @finished = false
  128.     refresh
  129.   end
  130.   def set_index(i)
  131.     @left_index = i
  132.     refresh
  133.   end
  134.   def set_finish(i)
  135.     @finished = i
  136.   end
  137.   
  138.   def refresh
  139.     contents.clear
  140.     draw_desc
  141.   end
  142.   def draw_desc
  143.     if @finished
  144.       if $game_party.finished_tasks[@left_index] != nil
  145.         draw_text_ex(0,0,$game_party.finished_tasks[@left_index].desc)
  146.       end
  147.     else
  148.       if $game_party.unfinished_tasks[@left_index] != nil
  149.         draw_text_ex(0,0,$game_party.unfinished_tasks[@left_index].desc)
  150.       end
  151.     end
  152.   end
  153.   
  154. end

  155. class Scene_Task < Scene_Base
  156.   def start
  157.     super
  158.     create_task_type_window
  159.     create_left_window
  160.     create_right_window
  161.   end
  162.   def update
  163.     super
  164.     if @left_window.active
  165.       if Input.trigger?(:B)
  166.         @left_window.deactivate
  167.         @task_type_window.activate
  168.       end
  169.       if Input.trigger?(:UP) || Input.trigger?(:DOWN)
  170.         @right_window.set_finish(@left_window.finished)
  171.         @right_window.set_index(@left_window.index)
  172.       end
  173.     end
  174.   end
  175.   
  176.   def terminate
  177.     super
  178.   end
  179.   def create_task_type_window
  180.     @task_type_window = Window_Task_Type.new
  181.     @task_type_window.set_handler(:unfinished_task,method(:view_unfinished_task))
  182.     @task_type_window.set_handler(:finished_task,method(:view_finished_task))
  183.     @task_type_window.set_handler(:cancel,method(:return_scene))
  184.   end
  185.   def create_left_window
  186.     @left_window = Window_TaskLeft.new
  187.     @left_window.set_finish(false)
  188.     @left_window.refresh
  189.   end
  190.   def create_right_window
  191.     @right_window = Window_TaskRight.new
  192.     @right_window.refresh
  193.   end
  194.   def view_unfinished_task
  195.     @left_window.set_finish(false)
  196.     @left_window.refresh
  197.     @left_window.activate
  198.     @task_type_window.deactivate
  199.     @right_window.set_finish(false)
  200.     @right_window.set_index(@left_window.index)
  201.   end
  202.   def view_finished_task
  203.     @left_window.set_finish(true)
  204.     @left_window.refresh
  205.     @left_window.activate
  206.     @task_type_window.deactivate
  207.     @right_window.set_finish(true)
  208.     @right_window.set_index(@left_window.index)
  209.   end
  210.   
  211. end

复制代码
用法:
领取任务:$game_party.get_task(任意数字,任务名称,任务描述)
完成任务:$game_party.finish_task(领取任务时设定的数字)
如:前面有事件$game_party.get_task(1,"测试","只是测试")
后面完成任务的脚本就是$game_party.finish_task(1)

召唤任务界面:SceneManager.call(Scene_Task)


作者: 1243852    时间: 2011-12-22 03:17
真快啊。。
作者: lyttmonkey    时间: 2011-12-22 09:23
收下了,回头研究
作者: wsmyzc    时间: 2011-12-22 11:37
图挂了?……
作者: 韩云溪    时间: 2011-12-22 11:52
现在我用360安全浏览器上传截图不能
作者: diablo2x    时间: 2011-12-22 23:37
很簡單易懂
是RGSS3讓這腳本變簡單的嗎
總覺得RGSS2時代的任務系統超長的....
作者: sai90306    时间: 2011-12-23 20:08
真的好神速!
作者: lonely1216    时间: 2011-12-24 11:04
有沒有完整版的
作者: 小传子    时间: 2011-12-24 11:17
这个是转载的还是原创?说明一下
作者: 韩云溪    时间: 2011-12-24 16:01
这是原创的
作者: xuzhengchi    时间: 2011-12-25 15:49
话说是否支持变量的调用?
比如调用1号变量的号在Ace的脚本里应该怎么写?$game_variables[1]?
作者: 韩云溪    时间: 2011-12-25 22:33
这个任务系统支持\v[1],\n[1]这样的符号
如可以写成$game_party.get_task(1,"测试变量","\v[1]")
作者: xuzhengchi    时间: 2011-12-26 07:58
韩云溪 发表于 2011-12-25 22:33
这个任务系统支持\v[1],\n[1]这样的符号
如可以写成$game_party.get_task(1,"测试变量","\v[1]") ...

我的意思是在脚本里添加任务时变量应该怎么写?
比如要求杀一只怪,没杀之前显示是0/1,杀了之后显示1/1。
作者: 韩云溪    时间: 2011-12-26 15:41
那就在战斗中调用事件,变量+1,自然这个数值就变了。
作者: xuzhengchi    时间: 2011-12-28 17:01
在事件的脚本框里编辑任务内容的话有字数限制,而且不支持自动换行,能否改成像VX的任务脚本那样在脚本里编辑任务内容?
作者: 韩云溪    时间: 2011-12-28 18:05
那就试试以下脚本:
s = “line1”
s += “\nline2”
s +=“\nline3”
$game_party.get_task(1,"test",s)
作者: 幻倾城    时间: 2011-12-28 18:46
能做个范列吗?
作者: 口袋-比克酱    时间: 2011-12-28 21:29
谢谢分享,我先去试试,任务系统很给力{:nm_4:}
作者: 韩云溪    时间: 2011-12-28 21:36
本帖最后由 韩云溪 于 2011-12-28 21:37 编辑
幻倾城 发表于 2011-12-28 18:46
能做个范列吗?


效果图如下
设置事件(看灰色部分,此为脚本)

效果

作者: 幻倾城    时间: 2012-1-2 01:30
不行啊,他说我
脚本“Game_Interpreter”第1411行:发生 NameError  。
作者: a886qqsd    时间: 2012-1-13 21:40
怎么用啊?

作者: 林间御风    时间: 2012-1-13 21:52
额……表示怎么改和看都弄不明白啊
作者: aaalbx    时间: 2012-1-27 14:56
本帖最后由 aaalbx 于 2012-1-28 20:59 编辑

之前的问题....终于成功解决了!{:nm_8:} 太兴奋了!{:nm_2:} 激动啊!第一次改对脚本
作者: 李光兆    时间: 2012-1-28 14:45
有爱的楼主~我想在菜单去掉整队换成任务如何做到~VX我还会VA就白了啊
作者: 001585100    时间: 2012-1-29 16:53
這跟VX版的任務系統不太一樣呢?
請問要怎麼新增任務啊?




問題已解決!



──001585100于2012-1-29 17:27补充以上内容’
作者: xmheart    时间: 2012-1-30 23:24
脚本“Game_Interpreter”第1411行:发生 NameError  。
这怎么弄?哪里设置不对了?
作者: rjterry    时间: 2012-2-3 12:14

。。。。我点测试游戏 就这样儿了   什么情况?  如何修改?

作者: 嗨。猪头    时间: 2012-2-15 22:00
我想在菜单去掉整队换成任务如何做到~VX我还会VA就白了啊
作者: z13979811166    时间: 2012-2-18 10:26
用用看好不好用
作者: 布里蓝    时间: 2012-3-9 21:05
谢谢楼主,很有用!
作者: hcm    时间: 2012-3-9 21:07
类似问题。

未命名.jpg (65.19 KB, 下载次数: 59)

未命名.jpg

作者: neverwind    时间: 2012-3-10 15:50
脚本"Game_Interpreter" 第1411行:发生NoMethodError

undefined method '[]=' for nil:NilClass
作者: zhangchi5    时间: 2012-3-18 19:37
其实。。。在很久很久以前。。。我做了一个。。。
http://rpg.blue/forum.php?mod=vi ... p;page=1&extra=
作者: ohyee    时间: 2012-3-24 21:22
貌似很强大诶
作者: 秘鲁草    时间: 2012-4-13 17:24
插在哪儿呀?
作者: ppww5ahjh245    时间: 2012-4-14 13:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: yeyaowei    时间: 2012-4-15 14:52
正在用着,非常好!!
作者: 夏侬    时间: 2012-4-17 21:54
拿下来看看怎么改的
作者: ysybuli520    时间: 2012-4-21 09:24
我还是不知道怎么用···········
作者: 把盘龙做成单机    时间: 2012-5-1 23:29
这个难道要用事件调动任务窗口,不能直接按个按钮调出任务窗口吗?


‘‘──把盘龙做成单机于2012-5-2 01:47补充以下内容

额。刚才犯2了,把任务框直接加入主菜单就OK了也没必要增加按钮了,多谢LZ了
’’
作者: 霸王蟹    时间: 2012-5-11 01:21
做到后面发现一个BUG,任务列表超过15个以下的就无法显示任务标题。
作者: 562305484    时间: 2012-5-23 19:43
没明白怎么使用啊谁能教教我,怎么打开任务界面啊
作者: swbxhlh    时间: 2012-5-30 23:15
求详细图解,
作者: a827594998    时间: 2012-7-12 16:32
我添加到菜单里,可是打不开呀。。。。
作者: 咚小黑    时间: 2012-7-21 00:54
$game_party.get_task(1,"任务1","描述)
接收此任务(注意符号全小写半角)

$game_party.finish_task(1)
完成(1)中的的任务。

SceneManager.call(Scene_Task)
查看任务菜单


这些都写在事件指令 第3页 最下面:脚本
作者: 咚小黑    时间: 2012-7-21 00:57
把这个东西放进菜单里面也是个不错的选择
  1. #用法:
  2. #领取任务:$game_party.get_task(任意数字,任务名称,任务描述)
  3. #完成任务:$game_party.finish_task(领取任务时设定的数字)
  4. #如:前面有事件$game_party.get_task(1,"测试","只是测试")
  5. #后面完成任务的脚本就是$game_party.finish_task(1)

  6. #召唤任务界面:SceneManager.call(Scene_Task)




  7. class Task
  8.   attr_reader :desc
  9.   attr_reader :finished
  10.   def initialize(origin_name,desc)
  11.     @origin_name = origin_name
  12.     @desc = desc
  13.     @finished = false
  14.   end
  15.   def name
  16.     if @finished
  17.       return @origin_name + "(完成)"
  18.     else
  19.       return @origin_name
  20.     end
  21.   end
  22.   def finish
  23.     @finished = true
  24.   end
  25.    
  26. end

  27. class Game_Party < Game_Unit
  28.   alias old_init initialize
  29.   def initialize
  30.     old_init
  31.     @tasks = {}
  32.   end
  33.   def get_task(i,name,desc)
  34.     @tasks[i]=Task.new(name,desc)
  35.   end
  36.   def have_task?(i)
  37.     @tasks[i] != nil
  38.   end
  39.   def finish_task(i)
  40.     @tasks[i].finish if have_task?(i)
  41.   end
  42.   def unfinished_tasks
  43.     n = []
  44.     for i in @tasks.values
  45.       next if i.finished
  46.       n.push(i)
  47.     end
  48.     return n
  49.   end
  50.   def finished_tasks
  51.     n = []
  52.     for i in @tasks.values
  53.       next unless i.finished
  54.       n.push(i)
  55.     end
  56.     return n
  57.   end
  58. end

  59. class Window_Task_Type < Window_HorzCommand
  60.   #--------------------------------------------------------------------------
  61.   # ● オブジェクト初期化
  62.   #--------------------------------------------------------------------------
  63.   def initialize
  64.     super(0, 0)
  65.     activate
  66.   end
  67.   def window_width
  68.     return Graphics.width
  69.   end
  70.   def col_max
  71.     return 3
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● コマンドリストの作成
  75.   #--------------------------------------------------------------------------
  76.   def make_command_list
  77.     add_command("未完成任务",  :unfinished_task)
  78.     add_command("已完成任务", :finished_task)
  79.     add_command("取消", :cancel)
  80.   end
  81. end

  82. class Window_TaskLeft < Window_Selectable
  83.   attr_reader :finished
  84.   def initialize
  85.     super(0,48,160,Graphics.height - 48)
  86.     create_contents
  87.     @finished = false
  88.     @index = 0
  89.     refresh
  90.     deactivate
  91.   end
  92.   def set_finish(finish)
  93.     @finished = finish
  94.     set_item_max
  95.   end
  96.   def item_max
  97.     return @item_max != nil ? @item_max : 0
  98.   end
  99.   def set_item_max
  100.     if @finished
  101.       @item_max = $game_party.finished_tasks.size
  102.     else
  103.       @item_max = $game_party.unfinished_tasks.size
  104.     end
  105.   end

  106.   def refresh
  107.     set_item_max
  108.     super
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ● 項目の描画
  112.   #--------------------------------------------------------------------------
  113.   def draw_item(index)
  114.     text = ""
  115.     unless @finished
  116.       if $game_party.unfinished_tasks[index] != nil
  117.         text = $game_party.unfinished_tasks[index].name
  118.       end
  119.     else
  120.       if $game_party.finished_tasks[index] != nil
  121.         text = $game_party.finished_tasks[index].name  
  122.       end
  123.     end
  124.     draw_text(item_rect_for_text(index), text)
  125.   end

  126. end

  127. class Window_TaskRight < Window_Base
  128.   attr_reader :left_index
  129.   def initialize
  130.     super(160,48,Graphics.width - 160,Graphics.height - 48)
  131.     create_contents
  132.     @left_index = 0
  133.     @finished = false
  134.     refresh
  135.   end
  136.   def set_index(i)
  137.     @left_index = i
  138.     refresh
  139.   end
  140.   def set_finish(i)
  141.     @finished = i
  142.   end
  143.   
  144.   def refresh
  145.     contents.clear
  146.     draw_desc
  147.   end
  148.   def draw_desc
  149.     if @finished
  150.       if $game_party.finished_tasks[@left_index] != nil
  151.         draw_text_ex(0,0,$game_party.finished_tasks[@left_index].desc)
  152.       end
  153.     else
  154.       if $game_party.unfinished_tasks[@left_index] != nil
  155.         draw_text_ex(0,0,$game_party.unfinished_tasks[@left_index].desc)
  156.       end
  157.     end
  158.   end
  159.   
  160. end

  161. class Scene_Task < Scene_Base
  162.   def start
  163.     super
  164.     create_task_type_window
  165.     create_left_window
  166.     create_right_window
  167.   end
  168.   def update
  169.     super
  170.     if @left_window.active
  171.       if Input.trigger?(:B)
  172.         @left_window.deactivate
  173.         @task_type_window.activate
  174.       end
  175.       if Input.trigger?(:UP) || Input.trigger?(:DOWN)
  176.         @right_window.set_finish(@left_window.finished)
  177.         @right_window.set_index(@left_window.index)
  178.       end
  179.     end
  180.   end
  181.   
  182.   def terminate
  183.     super
  184.   end
  185.   def create_task_type_window
  186.     @task_type_window = Window_Task_Type.new
  187.     @task_type_window.set_handler(:unfinished_task,method(:view_unfinished_task))
  188.     @task_type_window.set_handler(:finished_task,method(:view_finished_task))
  189.     @task_type_window.set_handler(:cancel,method(:return_scene))
  190.   end
  191.   def create_left_window
  192.     @left_window = Window_TaskLeft.new
  193.     @left_window.set_finish(false)
  194.     @left_window.refresh
  195.   end
  196.   def create_right_window
  197.     @right_window = Window_TaskRight.new
  198.     @right_window.refresh
  199.   end
  200.   def view_unfinished_task
  201.     @left_window.set_finish(false)
  202.     @left_window.refresh
  203.     @left_window.activate
  204.     @task_type_window.deactivate
  205.     @right_window.set_finish(false)
  206.     @right_window.set_index(@left_window.index)
  207.   end
  208.   def view_finished_task
  209.     @left_window.set_finish(true)
  210.     @left_window.refresh
  211.     @left_window.activate
  212.     @task_type_window.deactivate
  213.     @right_window.set_finish(true)
  214.     @right_window.set_index(@left_window.index)
  215.   end
  216.   
  217. end

  218. class Window_MenuCommand < Window_Command
  219.   alias add_original_commands_task_zabing add_original_commands
  220.   def add_original_commands
  221.     add_original_commands_task_zabing
  222.     add_command("任务", :maphint)
  223.   end
  224. end
  225. class Scene_Menu < Scene_MenuBase
  226.   alias create_command_window_task_zabing create_command_window
  227.   def create_command_window
  228.     create_command_window_task_zabing
  229.     @command_window.set_handler(:maphint,   method(:command_maphint))
  230.   end
  231.   def command_maphint
  232.     SceneManager.call(Scene_Task)
  233.   end
  234. end
复制代码

作者: luoyuan800    时间: 2012-7-30 19:37
这个很实用,
另外谢谢楼上的说明
我成功将任务窗口加到菜单栏里面了
作者: tantian    时间: 2013-8-5 18:08
弱弱地问一句!这个脚本怎么用……

作者: 夜飞尔-流星    时间: 2013-12-13 22:14
原创竟然是日文注释?是我眼瞎了?
作者: 小喵喵喵    时间: 2013-12-15 10:58
幻倾城 发表于 2012-1-2 01:30
不行啊,他说我
脚本“Game_Interpreter”第1411行:发生 NameError  。

别用以前的存档
作者: 小喵喵喵    时间: 2013-12-15 10:59
xmheart 发表于 2012-1-30 23:24
脚本“Game_Interpreter”第1411行:发生 NameError  。
这怎么弄?哪里设置不对了? ...

别用以前的存档
作者: 小喵喵喵    时间: 2013-12-15 11:00
neverwind 发表于 2012-3-10 15:50
**** 作者被禁止或删除 内容自动屏蔽 ****

别用以前的存档
作者: 1761134902    时间: 2013-12-15 14:59
任务做完了怎么让玩家获得奖励?比如道具。
作者: online20001213    时间: 2014-1-13 15:31
我只想说用法里面的代码打在哪里?
作者: zshuser    时间: 2014-2-11 15:12
那个……简单来说,这个本很给力……就是对伸手党后期的修改要求略高了一点……
首先……那个呼出指令里面的逗号是英文的……其次……后面的两项都必须加上双引号……其三……字符之间不需要空格=- =
我也是研究了好久抓破头皮才想明白的……(表笑!)= =
最大的优点在于……全中文= =,我这里原来有个地球村的日文版……发现完全玩不转……于是才把目光投向图书馆……
结果还真不错~加点事件、变量啊什么的就可以做得比较复杂了,最简单的传个话或者触发任务还是没问题的= =
唉……说这么多楼主也不会看得到……另外也不知是否有人能看到这些话呢= =?
作者: hoeg30    时间: 2015-7-20 10:37

作者: 踢腿水上飘    时间: 2018-5-16 22:10
求教下,这个脚本任务描述那边翻不了页,内容多了就显示不下来,麻烦指导下怎么让描述页面翻页
作者: djs789783    时间: 2024-3-16 12:22
为什么没有工程案例,为什么,为什么,为什么。。。。
作者: djs789783    时间: 2024-3-16 12:32
韩云溪 发表于 2011-12-24 16:01
这是原创的

能不能弄个工程案例啊,唉。。。。。




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