设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: tranpol
打印 上一主题 下一主题

AVG华丽丽效果报告研究AVG·3跳出菜单完美版成功了!

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
1
发表于 2007-7-31 18:38:55 | 显示全部楼层
以下引用阁中人于2007-7-31 10:19:29的发言:

那个对话时叫菜单出来的话
如果用并行事件写脚本
$随便什么 = Scene_menu.new
然后在MAP和MESSAGE还有MENU这几个里面动一点手脚
使叫出菜单的时候,因为那个手脚的缘故
无效掉MESSAGE中C键过对话的功能
不知道这样可不可以

叫出菜单简单,跟第二种隐藏对话框效果类似,不过叫出之后还要回到中断的事件中。
其实没楼上的楼上说那么难,就是很麻烦……= = 等我放假弄来看看= =
……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
2
发表于 2007-8-1 23:34:58 | 显示全部楼层
以下引用tranpol于2007-8-1 5:06:25的发言:
你啥时放假.......

如果今晚十二点后我还活着的话就明天。不活着的话……也算放了个大假{/gg}

NS好啊,我NS上手两天左右,RM花了一整个月才弄明白一半脚本OTL
KR比NS稍微复杂一些,不过功能很多,不需要特别复杂功能的话NS也没差,月姬,日西月东,夜明前的琉璃色这类商业游戏都是NS做的。非商业游戏的……青鸟之虚像,青空之想……
……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
3
发表于 2007-8-3 22:43:04 | 显示全部楼层
呀,来晚了……改行做这个

还需要完善一下……{/fd}

……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
4
发表于 2007-8-4 03:02:23 | 显示全部楼层
以下引用阁中人于2007-8-3 18:06:10的发言:
额!!这个不是SCHOOL DAYS么!
7.76G的游戏好怨念啊……
这么看来对话回忆系统也有着落了……
不知道这个回忆系统能不能将选择项也很好的显示出来?甚至用特殊的字体标出当时所选的选项……?

选项还没弄,有需要的话等会我看一下。
用张MO系列的信纸格skin就很有感觉了,要应用到游戏中的话最好美化一些
School Days挺不错的(茶),强烈推荐有硬盘空间的人玩下。

……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
5
发表于 2007-8-4 03:06:43 | 显示全部楼层
以下引用?????于2007-8-3 19:04:47的发言:

School Days的杀人结局好啊..美啊..
自杀结局更美...

会这么说的人一般都没玩过这游戏或只看过网上流传的视频(茶)
不跑题了,撤......
……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
6
发表于 2007-8-4 08:25:25 | 显示全部楼层

唔……选过的选项染色是这个效果么……

谢小夏师傅给偶讲Proc这个冬冬{/hx}顺便踢飞吸收小夏师傅的雷子{/fn}

PS 坚定的言叶控~
……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
7
发表于 2007-8-4 19:29:58 | 显示全部楼层
以下引用阁中人于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构成 囧
  1. class Window_Backlog < Window_Selectable
  2.   #--------------------------------------------------------------------------
  3.   # ● 初始化目标
  4.   #--------------------------------------------------------------------------
  5.   def initialize
  6.     super(0, 0, 480, 480)
  7.     self.contents = Bitmap.new(width - 32, height - 32)
  8.     refresh
  9.     self.active = false
  10.     self.index = 0
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● 刷新
  14.   #--------------------------------------------------------------------------
  15.   def refresh
  16.     self.contents.clear
  17.     self.contents.font.color = normal_color
  18. #——以下直接搬WindowMessage里的来就行……把显示金钱窗口功能去掉了而已 囧
  19.     x = y = 0
  20.     @item_max = $game_system.backlog_line #——这里就看出行数的有用了……
  21.    self.contents = Bitmap.new(width - 32, row_max * 32)
  22.    for i in 0...$game_system.backlog.size #——逐个单元描绘这个数组的内容
  23.     text = $game_system.backlog[i].clone
  24.       begin
  25.         last_text = text.clone
  26.         text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  27.       end until text == last_text
  28.       text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  29.         $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  30.       end
  31.       # 为了方便、将 "\\\\" 变换为 "\000"
  32.       text.gsub!(/\\\\/) { "\000" }
  33.       # "\\C" 变为 "\001" に、"\\G" 变为 "\002"
  34.       text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  35.       text.gsub!(/\\[Gg]/) { "" }
  36.       # c 获取 1 个字 (如果不能取得文字就循环)
  37.       while ((c = text.slice!(/./m)) != nil)
  38.         # \\ 的情况下
  39.         if c == "\000"
  40.           # 还原为本来的文字
  41.           c = "\\"
  42.         end
  43.         # \C[n] 的情况下
  44.         if c == "\001"
  45.           # 更改文字色
  46.           text.sub!(/\[([0-9]+)\]/, "")
  47.           color = $1.to_i
  48.           if color >= 0 and color <= 7
  49.             self.contents.font.color = text_color(color)
  50.           end
  51.           # 下面的文字
  52.           next
  53.         end
  54.         # 另起一行文字的情况下
  55.         if c == "\n"
  56.           # 刷新选择项及光标的高
  57.           if y >= $game_temp.choice_start
  58.             @cursor_width = [@cursor_width, x].max
  59.           end
  60.           # y 加 1
  61.           y += 1
  62.           x = 0
  63.           # 移动到选择项的下一行
  64.           if y >= $game_temp.choice_start
  65.             x = 8
  66.           end
  67.           # 下面的文字
  68.           next
  69.         end
  70.         # 描绘文字
  71.         self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
  72.         # x 为要描绘文字的加法运算
  73.         x += self.contents.text_size(c).width
  74.       end
  75.     end
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 刷新光标矩形
  79.   #--------------------------------------------------------------------------
  80. #  def update_cursor_rect
  81. #    if @index < 0
  82. #      self.cursor_rect.empty
  83. #    else
  84. #      self.cursor_rect.set(0, @index * 116, self.width - 32, 96)
  85. #    end
  86. #  end
  87. end
  88. class Scene_Backlog
  89.   #--------------------------------------------------------------------------
  90.   # ● 主处理
  91.   #--------------------------------------------------------------------------
  92.   def main
  93.     # 获取角色
  94.     # 生成状态窗口
  95.     @backlog_window = Window_Backlog.new
  96.     @backlog_window.active = true
  97.     @spriteset = Spriteset_Map.new
  98.     # 执行过渡
  99.     Graphics.transition
  100.     # 主循环
  101.     loop do
  102.       # 刷新游戏画面
  103.       Graphics.update
  104.       # 刷新输入信息
  105.       Input.update
  106.       # 刷新画面
  107.       update
  108.       # 如果画面被切换的话就中断循环
  109.       if $scene != self
  110.         break
  111.       end
  112.     end
  113.     # 准备过渡
  114.     Graphics.freeze
  115.     # 释放窗口
  116.     @backlog_window.dispose
  117.     @spriteset.dispose
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 刷新画面
  121.   #--------------------------------------------------------------------------
  122.   def update
  123.     @backlog_window.update
  124.     # 按下 B 键的情况下
  125.     if Input.trigger?(Input::B)
  126.       # 演奏取消 SE
  127.       $game_system.se_play($data_system.cancel_se)
  128.       # 切换到菜单画面
  129.       $scene = Scene_Map.new
  130.       return
  131.     end
  132.   end
  133. 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行的高度;再一种就是干脆把光标除去,在旁边弄一个标志着快进快退和进一行退一行的小窗口,通过选项来滚窗口内容。
……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
8
发表于 2007-8-4 20:04:47 | 显示全部楼层
以下引用阁中人于2007-8-4 11:59:51的发言:

那个不想显示那个框框的话,还可以这样做,定义那个WINDOW的SKIN,不用SKIN或者用空SKIN就可以了

这个我知道,不过如果一个选项框没有的话不容易知道光标走到哪里了……如果没差就这么用也OK。
……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
9
发表于 2007-8-4 20:38:46 | 显示全部楼层
以下引用小真·爱舞于2007-8-4 12:22:07的发言:

小贝啊...
你的这个好多瑕疵啊..
和这个教程本身就冲突....
你没考虑再次显示,而且使用6r加强版对话框name调用你该怎么解决?
这个里面的对话时调出菜单,回到地图又显示一次,你这个就再记录一次。
你如果没时间的话..我正在完善...
你的这个效果很好..
虽然我更喜欢其他AVG那种在对话框里面显示的样子...
换个更完善的也不错。

光标那个倒无所谓,不过你连z都没改..会被图片压住的...

对话框里显示backlog是很多AVG引擎自带的功能,NS本身就提供大约15句左右的回放。
秋二和schooldays还有月狂病之类的游戏是全屏显示,单独一个界面,我这个也是那种模式。

要避免再显示一次的话,每次check一下后两项是否相同好了。(so麻烦,再想想ing)
\name的话,可以把\name切出来替换成[]里的字符串,然后再像处理选项文字染色那样加到前面去。
这个是个单独的scene哎,Scene_Map的显示图片到不了这里来。

啊啊……说起来都是些小问题不过好懒得动手(/-0-)/

PS 这个是用默认工程改的,因为考虑到,如果照LZ的想法做AVG的话,不必用66加强对话框,自带的功能完全够用;除了\p功能之外,其他基本上是想要什么移植进去就可以了……
……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
10
发表于 2007-8-5 17:19:38 | 显示全部楼层
以下引用tranpol于2007-8-5 3:24:24的发言:
那个Benavii
俺试的没问题再小修改一下
就直接引用你的原文加入俺的研究里没问题吧

还有那个CG系统...俺还有一堆问题没解决...
唉用现成的开关OR物品类都有问题啊
只能加个新类了~~

用吧,不过注意一下小真提出的问题,我是直接在默认工程里改的,照这楼的方法跳出菜单的话会多写一次。
可以跳出的时候打开一个开关,在往backlog里写数据那里加个判定,开关打开的时候就不push,然后把开关关闭。
……………………啊咧?
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-11 19:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表