赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 170015 |
最后登录 | 2020-5-5 |
在线时间 | 2 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 55
- 在线时间
- 2 小时
- 注册时间
- 2006-11-10
- 帖子
- 931
|
以下引用阁中人于2007-8-4 9:23:17的发言:
是的,就是这种效果- -
虽然说MO2里面还在左右两边加了五角星- -不过这个没所谓啦
好强啊,怎么实现的?
PS...我是先看小说的
所以...唉,怎么世界就死了……喜欢世界……
游戏居然是影片型的- -怪不得有7.76G
如果愿意的话加个五角星也可以{/gg}
backlog对话倒没什么复杂的,在Window_Message那里打劫到$game_temp.message_text的内容,然后push到一个数组里去就行了。选项上色那里稍微有点麻烦,因为要把$game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }变成
$game_temp.choice_proc = Proc.new do |n|
@branch[current_indent] = n # 默认的处理
才好单独处理……其实之前我想了另种方法,都没这个直接。
以下是我的做法:
1、在Game_System22行以下加入
attr_accessor :backlog # 回想模式
attr_accessor :backlog_line # 回想行数
创建两个可读可写,可以理解为创建两个对象$game_system.backlog $game_system.backlog_line。然后在Game_System39行以下加入
@backlog = []
@backlog_line = 0
初始化两个对象。从这里可以看到@backlog是数组,@backlog_line是行数。
2、在Window_Message78行text = $game_temp.message_text以下加入
backlog = text.clone ——把显示的文字clone下来,不然$game_temp.message_text一清backlog就跟着没了= =
$game_system.backlog_line += backlog.split(/\n/).size ——数数要显示的文字里有多少个分行符号,有一个符号就有一行,然后把它加到总行数里面
$game_system.backlog.push(backlog) ——把对话内容push到backlog中
以上劫持工作完毕- -。原本打算在interpreter 3里劫的,后来发现这里更方便……
3、就可以开始写脚本了……比Status界面那一套还简单的脚本,由1个窗口与不超过50行的scene构成 囧
- class Window_Backlog < Window_Selectable
- #--------------------------------------------------------------------------
- # ● 初始化目标
- #--------------------------------------------------------------------------
- def initialize
- super(0, 0, 480, 480)
- self.contents = Bitmap.new(width - 32, height - 32)
- refresh
- self.active = false
- self.index = 0
- end
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- self.contents.clear
- self.contents.font.color = normal_color
- #——以下直接搬WindowMessage里的来就行……把显示金钱窗口功能去掉了而已 囧
- x = y = 0
- @item_max = $game_system.backlog_line #——这里就看出行数的有用了……
- self.contents = Bitmap.new(width - 32, row_max * 32)
- for i in 0...$game_system.backlog.size #——逐个单元描绘这个数组的内容
- text = $game_system.backlog[i].clone
- 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
- # 为了方便、将 "\\\\" 变换为 "\000"
- text.gsub!(/\\\\/) { "\000" }
- # "\\C" 变为 "\001" に、"\\G" 变为 "\002"
- text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
- text.gsub!(/\\[Gg]/) { "" }
- # c 获取 1 个字 (如果不能取得文字就循环)
- while ((c = text.slice!(/./m)) != nil)
- # \\ 的情况下
- if c == "\000"
- # 还原为本来的文字
- c = "\\"
- end
- # \C[n] 的情况下
- 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 == "\n"
- # 刷新选择项及光标的高
- if y >= $game_temp.choice_start
- @cursor_width = [@cursor_width, x].max
- end
- # y 加 1
- y += 1
- x = 0
- # 移动到选择项的下一行
- if y >= $game_temp.choice_start
- x = 8
- end
- # 下面的文字
- next
- end
- # 描绘文字
- self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
- # x 为要描绘文字的加法运算
- x += self.contents.text_size(c).width
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 刷新光标矩形
- #--------------------------------------------------------------------------
- # def update_cursor_rect
- # if @index < 0
- # self.cursor_rect.empty
- # else
- # self.cursor_rect.set(0, @index * 116, self.width - 32, 96)
- # end
- # end
- end
- class Scene_Backlog
- #--------------------------------------------------------------------------
- # ● 主处理
- #--------------------------------------------------------------------------
- def main
- # 获取角色
- # 生成状态窗口
- @backlog_window = Window_Backlog.new
- @backlog_window.active = true
- @spriteset = Spriteset_Map.new
- # 执行过渡
- Graphics.transition
- # 主循环
- loop do
- # 刷新游戏画面
- Graphics.update
- # 刷新输入信息
- Input.update
- # 刷新画面
- update
- # 如果画面被切换的话就中断循环
- if $scene != self
- break
- end
- end
- # 准备过渡
- Graphics.freeze
- # 释放窗口
- @backlog_window.dispose
- @spriteset.dispose
- end
- #--------------------------------------------------------------------------
- # ● 刷新画面
- #--------------------------------------------------------------------------
- def update
- @backlog_window.update
- # 按下 B 键的情况下
- if Input.trigger?(Input::B)
- # 演奏取消 SE
- $game_system.se_play($data_system.cancel_se)
- # 切换到菜单画面
- $scene = Scene_Map.new
- return
- end
- end
- end
复制代码
以上,一个简单的Backlog系统就做好了。要给被选项加些特效就到第四步……
4、找到Interpreter 1里的setup_choices方法,把$game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }变成以下内容:
$game_temp.choice_proc = Proc.new do |n|
@branch[current_indent] = n # 默认的处理,一句拆成两句
# 添加选择项文字
str = "" #——初始化一下选择项文字的局部变量
choice = $game_system.backlog[$game_system.backlog.size - 1].split(/\n/) #——取得$game_system.backlog这数组的最后一项。因为新的文字还没有传进来,所以最后一项一定是刚才的选择项。这个choice是形如["是","否"]的一个数组。
for i in 0...parameters[0].size #——按照选择项的个数循环
if i == n #——当i选项就是刚才的选项时
str += "\\c[2]" + choice + "\\c[0]" + "\n" #——组成选项内容字符串,是颜色+被选择的选项内容+颜色变回去+换行符,要加星星的话像加换色符号加在两边就好。
else
str += choice + "\n" #——如果不符合,则只是选项内容+换行符
end
end
#——这样循环了一圈下来,str就成为了重组后的最后一项,用它替换掉原本的最后一项
$game_system.backlog[$game_system.backlog.size - 1] = str
这样就完成了。附范例一个
http://rpg.blue/upload_program/files/backlog.rar
————————————————————————————————————————
目前这个系统还有一个小缺憾,就是它是光标类的窗口,选项条一次选一行看起来不怎么自然。
我想了两种解决办法,一种是每段文字强制4行,这样光标也固定4行的高度;再一种就是干脆把光标除去,在旁边弄一个标志着快进快退和进一行退一行的小窗口,通过选项来滚窗口内容。 |
|