赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 170015 |
最后登录 | 2020-5-5 |
在线时间 | 2 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 55
- 在线时间
- 2 小时
- 注册时间
- 2006-11-10
- 帖子
- 931
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
做话题游戏的过程中试着自制了一个带详细说明的任务系统……
这个系统可以将任务编号对应的说明存在system/Questdata.rxdata里。
在做游戏的时候可以随时用事件脚本——添加说明的方法把任务详细说明全都写在某个文件中,游戏做完后将添加详细说明的事件删除即可。只要发布时有将记载说明的文件放在文件夹里即可正常显示各任务的详细说明。
这样即使玩家拆了游戏也不会看到全任务-_-。并且省去了一些事件和脚本,扩大了任务系统的信息容量。
任务分类窗口是拿简单物品分类窗口改造的,所以里面夹杂了很多日文注释-_\\
参考脚本:月光奏鸣曲(布局),66的任务系统教学(架构)
另外,这个版本是整合版而非可以直接使用的版本=v=感兴趣的各位可以照下面步骤逐步整合=v=
1、首先是一个Window_Quest,包括command窗口和questlist窗口。
可以看到某人为了偷工减料,直接把helpwindow用作显示详细说明的窗口了-_\\
- class Window_QuestCommand < Window_Selectable
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- def initialize
- super(10, 10, 130, 195)
- self.contents = Bitmap.new(width - 32, height - 32)
- @item_max = 5
- @commands = ["主线任务", "支线任务", "失效任务", "完成任务", "所有任务"]
- refresh
- self.index = 0
- end
- #--------------------------------------------------------------------------
- # ● リフレッシュ
- #--------------------------------------------------------------------------
- def refresh
- self.contents.clear
- for i in 0...@item_max
- draw_item(i, normal_color)
- end
- end
- #--------------------------------------------------------------------------
- # ● 項目の描画
- # index : 項目番号
- # color : 文字色
- #--------------------------------------------------------------------------
- def draw_item(index, color)
- self.contents.font.color = color
- y = index * 32
- self.contents.draw_text(4, y, 128, 32, @commands[index])
- end
- #--------------------------------------------------------------------------
- # ● ヘルプテキスト更新
- #--------------------------------------------------------------------------
- def update_help
- case self.index
- when 0
- @text = "主线任务。"
- when 1
- @text = "支线任务。"
- when 2
- @text = "失效任务。"
- when 3
- @text = "完成任务。"
- when 4
- @text = "全部任务列表。"
- end
- @help_window.set_text_new(@text,1)
- end
- end
- class Window_QuestList < Window_Selectable
- def initialize
- super(150, 10, 480, 195)
- self.contents = Bitmap.new(width - 32, height - 32)
- refresh
- self.index = 0
- end
- #--------------------------------------------------------------------------
- # ● 获取任务名称
- #--------------------------------------------------------------------------
- def item
- return @data[self.index]
- end
- #--------------------------------------------------------------------------
- # ● 获取任务类别
- #--------------------------------------------------------------------------
- def itemtype
- return @type[self.index]
- end
- #--------------------------------------------------------------------------
- # ● 获取任务说明
- #--------------------------------------------------------------------------
- def itemdesc
- return @desc[self.index]
- end
- #--------------------------------------------------------------------------
- # ● リフレッシュ
- #--------------------------------------------------------------------------
- def refresh
- if self.contents != nil
- self.contents.dispose
- self.contents = nil
- end
- @data = []
- @type = []
- @desc = []
- end
- #--------------------------------------------------------------------------
- # ● アイテム一覧設定
- # command : 選択中のコマンド
- #--------------------------------------------------------------------------
- def set_item(command)
- refresh
- case command
- when 0
- for i in 0...$game_system.list.size
- if ($game_system.type[i] == 0 or $game_system.type[i] == 1 or $game_system.type[i] == 2) and $game_system.contents != nil
- @data.push($game_system.contents[i])
- @type.push($game_system.type[i])
- @desc.push($game_system.desc[i])
- end
- end
- when 1
- for i in 0...$game_system.list.size
- if ($game_system.type[i] == 3 or $game_system.type[i] == 4 or $game_system.type[i] == 5) and $game_system.contents != nil
- @data.push($game_system.contents[i])
- @type.push($game_system.type[i])
- @desc.push($game_system.desc[i])
- end
- end
- when 2
- for i in 0...$game_system.list.size
- if $game_system.type[i] == 5 and $game_system.contents != nil
- @data.push($game_system.contents[i])
- @type.push($game_system.type[i])
- @desc.push($game_system.desc[i])
- end
- end
- when 3
- for i in 0...$game_system.list.size
- if ($game_system.type[i] == 0 or $game_system.type[i] == 3) and $game_system.contents != nil
- @data.push($game_system.contents[i])
- @type.push($game_system.type[i])
- @desc.push($game_system.desc[i])
- end
- end
- when 4
- for i in 0...$game_system.list.size
- if $game_system.contents != nil
- @data.push($game_system.contents[i])
- @type.push($game_system.type[i])
- @desc.push($game_system.desc[i])
- end
- end
- end
- # 項目数が 0 でなければビットマップを作成し、全項目を描画
- @item_max = @data.size
- if @item_max > 0
- self.contents = Bitmap.new(width - 32, row_max * 32)
- self.contents.clear
- for i in 0...@item_max
- draw_item(i)
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 種類別アイテム数の取得
- #--------------------------------------------------------------------------
- def item_number
- return @item_max
- end
- #--------------------------------------------------------------------------
- # ● 項目の描画
- # index : 項目番号
- #--------------------------------------------------------------------------
- def draw_item(index)
- item = @data[index]
- type = @type[index]
- typename = ""
-
- case type
- when 0
- self.contents.font.color = disabled_color
- typename = "[主线]"
- when 1
- self.contents.font.color = system_color
- typename = "[当前]"
- when 2
- self.contents.font.color = normal_color
- typename = "[主线]"
- when 3
- self.contents.font.color = disabled_color
- typename = "[支线]"
- when 4
- self.contents.font.color = normal_color
- typename = "[支线]"
- when 5
- self.contents.font.color = crisis_color
- typename = "[失效]"
- end
-
- x = 4
- y = index * 32
- self.contents.draw_text(x, y, 100, 32, typename, 0)
- self.contents.draw_text(x + 65, y, 212, 32, item, 0)
- end
- #--------------------------------------------------------------------------
- # ● ヘルプテキスト更新
- #--------------------------------------------------------------------------
- def update_help
- if @data == []
- @text = "此项目中没有任务。"
- @help_window.set_text_new(@text,1)
- else
- @help_window.set_text_new(self.itemdesc == nil ? "此任务详细内容不明。" : self.itemdesc)
- end
- end
- end
复制代码
2、其次是一个Scene_Quest,任务系统主界面。
3、在GameSystem里添加以下accessor:
attr_accessor :list # 任务编号
attr_accessor :contents # 任务标题
attr_accessor :type # 任务种类
attr_accessor :desc # 任务详细信息
并且在initialize项里添加以下初始化:
@list = []
@contents = []
@type = []
@desc = []
然后,在GameSystem里添加以下三个方法:
#----------------------
# ● 插入任务
#----------------------
def new_quest(n1,n2,n3)
@list.push(n1)
@contents.push(n2)
@type.push(n3)
end
#----------------------
# ● 添加任务注释
#----------------------
def quest_illust(n1,n4)
for i in [email protected]
if @list == n1
@desc = n4
end
end
file = File.open("system/Questdata.rxdata", "wb")
Marshal.dump($game_system.desc, file)
file.close
end
#----------------------
# ● 完成任务(失效处理或完成处理)
#----------------------
def end_quest(n1,n2,n3)
for i in [email protected]
if @list == n1 and @contents == n2
@type = n3
end
end
end
分别用来插入新任务,给任务添加注释和结束任务。
4、稍微改造一下WindowHelp,使之适合用来显示任务注释。
把WindowHelp默认的initialize用这个替换:
def initialize
if $scene.is_a?(Scene_Quest)
super(10,215,620,255)
else
super(0, 0, 640, 64)
end
self.contents = Bitmap.new(width - 32, height - 32)
end
在WindowHelp的set_text方法下添加新的方法set_text_new,用以给任务说明分段等。
- def set_text_new1(text, align = 0)
- if text != @text or align != @align
- self.contents.clear
- self.contents.font.color = normal_color
- @text = text.clone
- x = y = 0
- begin
- last_text = @text.clone
- @text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
- end until @text == last_text
- @text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
- $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
- end
- # @text.gsub!(/\\\\/) { "\000" }
- # @text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
- @text.gsub!(/\\[Hh]/) { "\002" }
- # @text.gsub!(/\\[Ss]\[([0-9]+)\]/) { "\003[#{$1}]" }
- while ((c = @text.slice!(/./m)) != nil)
- # if c == "\000"
- # c = "\\"
- # end
- # if c == "\001"
- # @text.sub!(/\[([0-9]+)\]/, "")
- # color = $1.to_i
- # if color >= 0 and color <= 7
- # self.contents.font.color = text_color(color)
- # end
- # next
- # end
- if c == "\002"
- y += 1
- x = 0
- next
- end
- # if c == "\003"
- # @text.sub!(/\[([0-9]+)\]/, "")
- # t = RPG::Cache.icon("skill_#{$1}")
- # self.contents.blt(x, 32 * y, t, t.rect)
- # t.dispose
- # next
- # end
- self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
- x += self.contents.text_size(c).width
- if x + self.contents.text_size(c).width >= self.width - 40
- y += 1
- x = 0
- end
- end
- end
- self.visible = true
- end
复制代码
就在这段有个缺陷-_-。因为这段是以前别人给写的我直接拿来用了orz
缺陷就是当注释文字多了时帧数会明显下降,感觉应该是重复刷新helpwindow造成的。
将SceneQuest里的helpwindowupdate加上按键才刷新的条件,问题依旧orz
用以下这段set_text_new就没问题,所以可能是这个方法本身有点问题……orz正则表达式仍然完全不通,请高人指教。
附无错版的set_text_new方法:
def set_text_new(text, align = 0)
# 如果文本和对齐方式的至少一方与上次的不同
if text != @text or align != @align
# 再描绘文本
self.contents.clear
self.contents.font.color = normal_color
x = 4; y = 0
for c in text.scan(/./)
if x + self.contents.text_size(c).width >= self.width - 40
x = 4; y += 32
end
self.contents.draw_text(x, y, 40, 32, c, align)
x += self.contents.text_size(c).width
end
@text = text
@align = align
@actor = nil
end
self.visible = true
end
这个方法可以自动换行,缺点是没法手动换行……
5、默认路径是system/Questdata.rxdata,所以在工程文件夹下建立个system文件夹。如果不想建文件夹,就改quest_illust和SceneQuest里的两个文件路径。
6、完成。
用法:
见范例工程。
http://rpg.blue/upload_program/files/带说明任务系统.rar
添加任务说明:
quest_illust("任务编号","详细说明内容")
附type值对应的任务种类:
0-已完成主线,1-当前主线,2-未完成主线,3-已完成支线,4-未完成支线,5-失效支线。
——————————
修正工程已上传
嗯……改成可排版的就完美了TvT 正则表达式持续不会中…… |
|