查看: 4697|回复: 4

[已经解决] 求修复va任务系统的BUG

[复制链接]
梦石
0
星屑
50
在线时间
646 小时
注册时间
2011-6-23
回帖
231
发表于 2015-2-10 18:19:05 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 只是逛逛 于 2015-2-10 18:19 编辑

找到了一个任务系统,感觉挺好使的说~
但是!
BUG1!:
截图_2015年02月10日_17时50分28秒_1.png
目前看起来还不错
截图_2015年02月10日_17时50分44秒_1.png
一旦任务数超过14个,就会变得很鬼畜,超出的任务名无法显示↑
截图_2015年02月10日_17时58分13秒_1.png
但只要完成一些任务,使任务数不大于14,就又能正常显示了  (简直了
截图_2015年02月10日_17时58分38秒_1.png
但是同理,一旦“已完成任务”数超过14,又鬼畜了TAT

BUG2!:
截图_2015年02月10日_17时58分58秒_1.png
在“已完成任务”中随便选一个
按Esc
再选择“未完成任务”
截图_2015年02月10日_17时59分02秒_1.png
就会这样↑
反过来,在“未完成任务”中随便选一个,按Esc,再选择“已完成任务”,也会这样

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

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



#========================================================
# * 本体
#========================================================
class Task
  attr_reader :desc
  attr_reader :finished
  def initialize(origin_name,desc)
    @origin_name = origin_name
    @desc = desc
    @finished = false
  end
  def name
    if @finished
      return @origin_name + "(完成)"
    else
      return @origin_name
    end
  end
  def finish
    @finished = true
  end
   
end

class Game_Party < Game_Unit
  alias old_init initialize
  def initialize
    old_init
    @tasks = {}
  end
  def get_task(i,name,desc)
    @tasks=Task.new(name,desc)
  end
  def have_task?(i)
    @tasks != nil
  end
  def finish_task(i)
    @tasks.finish if have_task?(i)
  end
  def unfinished_tasks
    n = []
    for i in @tasks.values
      next if i.finished
      n.push(i)
    end
    return n
  end
  def finished_tasks
    n = []
    for i in @tasks.values
      next unless i.finished
      n.push(i)
    end
    return n
  end
end

#========================================================
# * 任务界面最上面的横向选项区域
#========================================================
class Window_Task_Type < Window_HorzCommand
  #--------------------------------------------------------------------------
  # ● 对象初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0)
    activate
  end
  def window_width
    return Graphics.width
  end
  def col_max
    return 3
  end
  #--------------------------------------------------------------------------
  # ● 生成指令
  #--------------------------------------------------------------------------
  def make_command_list
    add_command("未完成任务",  :unfinished_task)
    add_command("已完成任务", :finished_task)
    add_command("取消", :cancel)
  end
end

#========================================================
# * 任务界面左边的纵向选项区域
#========================================================
class Window_TaskLeft < Window_Selectable
  attr_reader :finished
  def initialize
    super(0,48,200,Graphics.height - 48)
    create_contents
    @finished = false
    @index = 0
    refresh
    deactivate
  end
  def set_finish(finish)
    @finished = finish
    set_item_max
  end
  def item_max
    return @item_max != nil ? @item_max : 0
  end
  def set_item_max
    if @finished
      @item_max = $game_party.finished_tasks.size
    else
      @item_max = $game_party.unfinished_tasks.size
    end
  end

  def refresh
    set_item_max
    super
  end
  #--------------------------------------------------------------------------
  # ● 描绘项目
  #--------------------------------------------------------------------------
  def draw_item(index)
    text = ""
    unless @finished
      if $game_party.unfinished_tasks[index] != nil
        text = $game_party.unfinished_tasks[index].name
      end
    else
      if $game_party.finished_tasks[index] != nil
        text = $game_party.finished_tasks[index].name  
      end
    end
    draw_text(item_rect_for_text(index), text)
  end

end

#========================================================
# * 任务界面右边的任务描述区域
#========================================================
class Window_TaskRight < Window_Base
  attr_reader :left_index
  def initialize
    super(200,48,Graphics.width - 200,Graphics.height - 48)
    create_contents
    @left_index = 0
    @finished = false
    refresh
  end
  def set_index(i)
    @left_index = i
    refresh
  end
  def set_finish(i)
    @finished = i
  end
  
  def refresh
    contents.clear
    draw_desc
  end
  def draw_desc
    if @finished
      if $game_party.finished_tasks[@left_index] != nil
        draw_text_ex(0,0,$game_party.finished_tasks[@left_index].desc)
      end
    else
      if $game_party.unfinished_tasks[@left_index] != nil
        draw_text_ex(0,0,$game_party.unfinished_tasks[@left_index].desc)
      end
    end
  end
  
end

#========================================================
# * 完全看不懂在说什么
#========================================================
class Scene_Task < Scene_Base
  def start
    super
    create_task_type_window
    create_left_window
    create_right_window
  end
  def update
    super
    if @left_window.active
      if Input.trigger?(:B)
        @left_window.deactivate
        @task_type_window.activate
      end
      if Input.trigger?(:UP) || Input.trigger?(:DOWN)
        @right_window.set_finish(@left_window.finished)
        @right_window.set_index(@left_window.index)
      end
    end
  end
  
  def terminate
    super
  end
  def create_task_type_window
    @task_type_window = Window_Task_Type.new
    @task_type_window.set_handler(:unfinished_task,method(:view_unfinished_task))
    @task_type_window.set_handler(:finished_task,method(:view_finished_task))
    @task_type_window.set_handler(:cancel,method(:return_scene))
  end
  def create_left_window
    @left_window = Window_TaskLeft.new
    @left_window.set_finish(false)
    @left_window.refresh
  end
  def create_right_window
    @right_window = Window_TaskRight.new
    @right_window.refresh
  end
  def view_unfinished_task
    @left_window.set_finish(false)
    @left_window.refresh
    @left_window.activate
    @task_type_window.deactivate
    @right_window.set_finish(false)
    @right_window.set_index(@left_window.index)
  end
  def view_finished_task
    @left_window.set_finish(true)
    @left_window.refresh
    @left_window.activate
    @task_type_window.deactivate
    @right_window.set_finish(true)
    @right_window.set_index(@left_window.index)
  end
  
end

#========================================================
# * 在菜单里加入“任务”选项
#========================================================
class Window_MenuCommand < Window_Command
  alias add_original_commands_task_zabing add_original_commands
  def add_original_commands
    add_original_commands_task_zabing
    add_command("任务", :maphint)
  end
end
class Scene_Menu < Scene_MenuBase
  alias create_command_window_task_zabing create_command_window
  def create_command_window
    create_command_window_task_zabing
    @command_window.set_handler(:maphint,   method(:command_maphint))
  end
  def command_maphint
    SceneManager.call(Scene_Task)
  end
end[/pre]

我无耻地@ 了一下 @喵呜喵5  

点评

嘛,不知为何有一种微妙的感觉……  发表于 2015-2-10 22:23
艾特我做甚,闲着没事时我会回答,想摸鱼时指名道姓艾特我回答问题收费……  发表于 2015-2-10 21:31
请叫我RC君
某些过于XX的内容会用白字,所以请多多使用ctrl+a
梦石
0
星屑
3348
在线时间
1120 小时
注册时间
2009-4-15
回帖
761
发表于 2015-2-11 10:24:45 | 显示全部楼层
本帖最后由 tan12345 于 2015-2-11 10:36 编辑

bug2的解决方法:找到def view_unfinished_task和def view_finished_task,在这2个方法的@left_window.set_finish(false)、@left_window.set_finish(true)后面加一句@left_window.select(0)试试
至于bug1,我不知道怎么说才好……

评分

参与人数 2星屑 +15 梦石 +1 收起 理由
taroxd + 1 认可答案
只是逛逛 + 15 感谢哟~BUG2已经完美解除

查看全部评分

回复 1 0

使用道具 举报

梦石
0
星屑
852
在线时间
231 小时
注册时间
2013-10-30
回帖
115
发表于 2015-3-20 01:44:21 | 显示全部楼层
LZ 求教你问题1解决了么?我也用的这任务系统。。不过任务还没做到这么多。 现在换任务系统太复杂了。。
所以同求教这个问题。。
回复

使用道具 举报

梦石
0
星屑
852
在线时间
231 小时
注册时间
2013-10-30
回帖
115
发表于 2015-3-20 14:57:29 | 显示全部楼层
本帖最后由 m328759997 于 2015-3-20 22:25 编辑


大神  问题没解决啊。。
@taroxd
回复

使用道具 举报

梦石
0
星屑
65
在线时间
126 小时
注册时间
2015-6-26
回帖
96
发表于 2015-7-18 17:17:51 | 显示全部楼层
@tan12345 话说BUG1到底怎么办。。。。。。

评分

参与人数 1星屑 -1 收起 理由
taroxd -1 请不要挖坟,如有问题可以重新提问.

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部