查看: 3277|回复: 3

[已经解决] 求教帮忙看下这个任务脚本

[复制链接]
梦石
0
星屑
2019
在线时间
940 小时
注册时间
2015-10-26
回帖
293

开拓者

发表于 2019-7-30 20:12:13 | 显示全部楼层 |阅读模式
悬赏100星屑已解决
这个任务脚本简单实用,我也比较满意,唯一的缺陷就是右边那个任务内容的窗口,任务的内容字数一多或者追加2个任务说明就会有内容显示不出来了
有木有大神看看怎么改装一下,让右侧任务内容的窗口可以翻页或者上下滚动显示内容。
应该是Window_TaskRight这个窗口吧……

TIM图片20190730201050.png

脚本地址在这
https://rpg.blue/thread-221055-1-1.html
下面是脚本代码
[pre lang="ruby"]=begin
领取任务:$game_party.get_task(任意数字,任务名称,任务描述)
完成任务:$game_party.finish_task(领取任务时设定的数字)
对已有任务追加说明:$game_party.add_task(任务编号,任务追加描述)

如:
前面有事件$game_party.get_task(1,"测试","只是测试")

此时任务1的说明为

>只是测试

后面完成任务的脚本就是$game_party.finish_task(1)

追加说明$game_party.add_task(1,"真的只是测试哦")

此时任务1的说明为:
>只是测试
>真的只是测试哦

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

该脚本来自66rpg,发布者:韩云溪
改进:工藤由纪(论坛ID:zyyczp)
=end

#===========================================================
#●任务系统
#===========================================================
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 desc=(desc)
    @desc = desc
  end
  
  def finish
    @finished = true
  end
   
end

class Game_Party < Game_Unit
  alias old_init initialize
  def initialize
    old_init
    @tasks = {}
  end
  def add_task(i,desc)
    @tasks.desc = @tasks.desc + "\n" + desc
  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,160,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(160,48,Graphics.width - 160,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[/pre]

最佳答案

查看完整内容

头像竟然是绿坝娘 好评 顺便换行可以用\n 这脚本也不加个注释 看着挺费劲【 [line]1[/line] [pre lang="ruby"]=begin 领取任务:$game_party.get_task(任意数字,任务名称,任务描述) 完成任务:$game_party.finish_task(领取任务时设定的数字) 对已有任务追加说明:$game_party.add_task(任务编号,任务追加描述) 如: 前面有事件$game_party.get_task(1,"测试","只是测试") 此时任务1的说明为 >只是测试 后面完成任务的 ...
梦石
0
星屑
4209
在线时间
1870 小时
注册时间
2010-12-21
回帖
2166
发表于 2019-7-30 20:12:14 | 显示全部楼层
本帖最后由 黄亦天 于 2019-12-11 03:36 编辑

头像竟然是绿坝娘 好评
顺便换行可以用\n

这脚本也不加个注释 看着挺费劲【




[pre lang="ruby"]=begin
领取任务:$game_party.get_task(任意数字,任务名称,任务描述)
完成任务:$game_party.finish_task(领取任务时设定的数字)
对已有任务追加说明:$game_party.add_task(任务编号,任务追加描述)

如:
前面有事件$game_party.get_task(1,"测试","只是测试")

此时任务1的说明为

>只是测试

后面完成任务的脚本就是$game_party.finish_task(1)

追加说明$game_party.add_task(1,"真的只是测试哦")

此时任务1的说明为:
>只是测试
>真的只是测试哦

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

该脚本来自66rpg,发布者:韩云溪
改进:工藤由纪(论坛ID:zyyczp)
=end

#●最大行数(窗口行数14)
MAX_LINE = 20


#===========================================================
#●任务系统
#===========================================================
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 desc=(desc)
    @desc = desc
  end
  
  def finish
    @finished = true
  end
   
end

class Game_Party < Game_Unit
  alias old_init initialize
  def initialize
    old_init
    @tasks = {}
  end
  def add_task(i,desc)
    @tasks.desc = @tasks.desc + "\n" + desc
  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,160,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(160,48,Graphics.width - 160,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
    @draw_desc_line = 0
    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
  #=========================
  #  文字段上滚动
  #=========================
  def draw_desc_up
    if @finished
      if $game_party.finished_tasks[@left_index] != nil
        if @draw_desc_line != 0
          @draw_desc_line += 32
        end
        contents.clear
        draw_text_ex(0,@draw_desc_line,$game_party.finished_tasks[@left_index].desc)
      end
    else
      if $game_party.unfinished_tasks[@left_index] != nil
        if @draw_desc_line != 0
          @draw_desc_line += 32
        end
        contents.clear
        draw_text_ex(0,@draw_desc_line,$game_party.unfinished_tasks[@left_index].desc)
      end
    end
  end
  #=========================
  #  文字段下滚动
  #=========================
  def draw_desc_down
    if @finished
      if $game_party.finished_tasks[@left_index] != nil
        if @draw_desc_line != (MAX_LINE-14) * -32
          @draw_desc_line -= 32
        end
        contents.clear
        draw_text_ex(0,@draw_desc_line,$game_party.finished_tasks[@left_index].desc)
      end
    else
      if $game_party.unfinished_tasks[@left_index] != nil
        if @draw_desc_line != (MAX_LINE-14) * -32
          @draw_desc_line -= 32
        end
        contents.clear
        draw_text_ex(0,@draw_desc_line,$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
      # 按下确认的时候
      if Input.trigger?(:C)
        Sound.play_ok
        @left_window.deactivate
        @right_window_roll = true
      end
    end
    if @right_window_roll == true
      if Input.press?(:UP)
        @right_window.draw_desc_up
      end
      if Input.press?(:DOWN)
        @right_window.draw_desc_down
      end
      if Input.trigger?(:B)
        Sound.play_cancel
        @left_window.active = true
        @right_window_roll = false
      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

[/pre]


半个多小时改完了 在脚本注释下面可以设置最多行数 有点懒得智能判断有多少行了





顺便一说 这个任务文本是支持对话框的特殊带入符的
就是输入\v[10]就会带入变量数值 输入\c[2]就会改成二号颜色什么的
不过不同的是 要两个\才行  例如\\c[2] 后面的字就会变颜色

不过这也是文字会出框的元凶
如果用的是普通绘制文字的方法 就会限制文字范围 一行内容过多就会压扁文字而不会出框



@踢腿水上飘

主要是这个脚本看着眼晕,所以我就设置成固定翻多少行,翻过头也无所谓的设定了。
你要觉得不够就添加最大行数,总之是没上限的。
毕竟阅读只需要向下翻页,后面都是空白也不会有必要翻了。

点评

大佬,我想要的就是智能判断有多少行呀~~~  发表于 2019-11-20 09:12
黄大大辛苦啦QwQ  发表于 2019-8-1 21:09
绿坝娘素材库企划

素材库获取方法:暂时中止,需求者私聊。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部