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

Project1

 找回密码
 注册会员
搜索
查看: 1291|回复: 3
打印 上一主题 下一主题

[已经解决] 一个朋友写的标题特效脚本 出现了BUG

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
99 小时
注册时间
2014-5-2
帖子
66
跳转到指定楼层
1
发表于 2014-11-9 19:49:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 涵影_博 于 2014-11-9 19:52 编辑

@cinderelmini 这个问题有点严重
RUBY 代码复制
  1. class Window_TitleLogo < Window_Base
  2.  
  3.  
  4.   CLEAR_FILE = '通关存档名字.格式'
  5.   SLIDE_COUNT = {:chn => 60.0, :eng => 90.0}
  6.   POS_TEXT = -10
  7.   POS_LINE = -50
  8.  
  9.   def initialize
  10.     super(0, 0, 24, 24)
  11.     self.visible = false
  12.  
  13.     @logo = {}
  14.     @logo[:那份] = Sprite.new
  15.     @logo[:那份].x = 0
  16.     @logo[:那份].y = POS_TEXT
  17.     @logo[:泪水] = Sprite.new
  18.     @logo[:泪水].x = 0
  19.     @logo[:泪水].y = POS_TEXT
  20.     @logo[:竟是永恒] = Sprite.new
  21.     @logo[:竟是永恒].x = 0
  22.     @logo[:竟是永恒].y = POS_TEXT
  23.  
  24.     @logo[:横线] = Sprite.new
  25.     @logo[:横线].x = POS_LINE
  26.     @logo[:横线].y = 0
  27.  
  28.     @logo[:that] = Sprite.new
  29.     @logo[:that].x = POS_TEXT
  30.     @logo[:that].y = 0
  31.     @logo[:tear] = Sprite.new
  32.     @logo[:tear].x = POS_TEXT
  33.     @logo[:tear].y = 0
  34.     @logo[:last_forever] = Sprite.new
  35.     @logo[:last_forever].x = POS_TEXT
  36.     @logo[:last_forever].y = 0
  37.  
  38.     @logo[:copyright] = Sprite.new
  39.     @logo[:ver] = Sprite.new
  40.  
  41.     @logo.each_key{|key|; @logo[key].opacity = 0; get_logo_bitmap(key)}
  42.   end
  43.  
  44.   def dispose
  45.     super
  46.     @logo.each_value{|a| a.dispose}
  47.   end
  48.  
  49.   def clear?
  50.     return !Dir.glob(CLEAR_FILE).empty?
  51.   end
  52.  
  53.   def get_logo_bitmap(key)
  54.     case key
  55.     when :那份
  56.       bitmap = Cache.picture("TLS-Title-01")
  57.     when :泪水
  58.       bitmap = Cache.picture("TLS-True-Title-01")
  59.     when :竟是永恒
  60.       bitmap = Cache.picture("TLS-Title-02")
  61.     when :横线
  62.       bitmap = Cache.picture("TLS-Title-Line")
  63.     when :that
  64.       bitmap = Cache.picture("TLS-Title-03")
  65.     when :tear
  66.       bitmap = Cache.picture("TLS-True-Title-02")
  67.     when :last_forever
  68.       bitmap = Cache.picture("TLS-Title-04")
  69.     when :copyright
  70.       bitmap = Cache.picture("TLS-Title-C")
  71.     when :ver
  72.       bitmap = Cache.picture("TLS-Title-Alpha")
  73.     end
  74.     @logo[key].bitmap = bitmap
  75.   end
  76.  
  77.   def calc_target(start_val, end_val, percent)
  78.     return start_val + ((end_val - start_val) * percent)
  79.   end
  80.  
  81.   def refresh
  82.     d = SLIDE_COUNT[:chn]
  83.     count = 0
  84.     loop do
  85.       percent = count / d
  86.       @logo[:那份].y = calc_target(POS_TEXT, 0, percent)
  87.       @logo[:那份].opacity = calc_target(0, 255, percent)
  88.       count += 1
  89.       Graphics.update
  90.       break if count >= d
  91.     end
  92.     wait(60)
  93.  
  94.     if clear?
  95.       count = 0
  96.       loop do
  97.         percent = count / d
  98.         @logo[:泪水].y = calc_target(POS_TEXT, 0, percent)
  99.         @logo[:泪水].opacity = calc_target(0, 255, percent)
  100.         count += 1
  101.         Graphics.update
  102.         break if count >= d
  103.       end
  104.       wait(60)
  105.     end
  106.  
  107.     count = 0
  108.     loop do
  109.       percent = count / d
  110.       @logo[:竟是永恒].y = calc_target(POS_TEXT, 0, percent)
  111.       @logo[:竟是永恒].opacity = calc_target(0, 255, percent)
  112.       count += 1
  113.       Graphics.update
  114.       break if count >= d
  115.     end
  116.     wait(60)
  117.  
  118.     count = 0
  119.     loop do
  120.       percent = count / d
  121.       @logo[:横线].x = calc_target(POS_LINE, 0, percent)
  122.       @logo[:横线].opacity = calc_target(0, 255, percent)
  123.       count += 1
  124.       Graphics.update
  125.       break if count >= d
  126.     end
  127.     wait(60)
  128.  
  129.     d = SLIDE_COUNT[:eng]
  130.     count = 0
  131.     loop do
  132.       percent = count / d
  133.       @logo[:that].x = calc_target(POS_TEXT, 0, percent)
  134.       @logo[:that].opacity = calc_target(0, 255, percent)
  135.       count += 1
  136.       Graphics.update
  137.       break if count >= d
  138.     end
  139.     wait(30)
  140.  
  141.     if clear?
  142.       count = 0
  143.       loop do
  144.         percent = count / d
  145.         @logo[:tear].x = calc_target(POS_TEXT, 0, percent)
  146.         @logo[:tear].opacity = calc_target(0, 255, percent)
  147.         count += 1
  148.         Graphics.update
  149.         break if count >= d
  150.       end
  151.       wait(30)
  152.     end
  153.  
  154.     count = 0
  155.     loop do
  156.       percent = count / d
  157.       @logo[:last_forever].x = calc_target(POS_TEXT, 0, percent)
  158.       @logo[:last_forever].opacity = calc_target(0, 255, percent)
  159.       count += 1
  160.       Graphics.update
  161.       break if count >= d
  162.     end
  163.     wait(30)
  164.  
  165.     count = 0
  166.     loop do
  167.       percent = count / d
  168.       @logo[:copyright].opacity = calc_target(0, 255, percent)
  169.       count += 1
  170.       Graphics.update
  171.       break if count >= d
  172.     end
  173.  
  174.     count = 0
  175.     loop do
  176.       percent = count / d
  177.       @logo[:ver].opacity = calc_target(0, 255, percent)
  178.       count += 1
  179.       Graphics.update
  180.       break if count >= d
  181.     end
  182.     wait(60)
  183.  
  184.   end
  185.  
  186.   def wait(count)
  187.     count.times{|i| Graphics.update}
  188.   end
  189.  
  190. end

RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_TitleCommand
  4. #------------------------------------------------------------------------------
  5. #  标题画面中,选择“开始游戏/继续游戏”的窗口。
  6. #==============================================================================
  7.  
  8. class Window_TitleCommand < Window_Command
  9.  
  10.   COUNT = 30.0
  11.  
  12.   def make_command
  13.     @command = []
  14.     for i in 0...item_max
  15.       @command[i] = Window_TitleSub.new(command_name(i), false)
  16.     end
  17.   end
  18.  
  19.   def refresh_command
  20.     @command.each{|a|
  21.     count = 0
  22.     loop do
  23.       percent = count / COUNT
  24.       a.x = calc_target(-30, 0, percent)
  25.       a.opacity = calc_target(0, 255, percent)
  26.       count += 1
  27.       SceneManager.scene.update
  28.       if count >= COUNT
  29.         a.open = true
  30.         break
  31.       end
  32.     end
  33.     }
  34.   end
  35.  
  36.   def dispose
  37.     super
  38.     @command.each{|a| a.dispose}
  39.   end
  40.  
  41.   def select(index)
  42.     @command[self.index].refresh(false) if @command
  43.     wait(15, self.index) if @command
  44.     super(index)
  45.     @command[self.index].refresh(true) if @command
  46.   end
  47.  
  48.   def update
  49.     super
  50.     return unless @command
  51.     @command.each{|a| a.update}
  52.   end
  53.  
  54.   def wait(count, index = nil)
  55.     count.times{|i| @command[index].update if index; SceneManager.scene.update}
  56.   end
  57.  
  58.   def calc_target(start_val, end_val, percent)
  59.     return start_val + ((end_val - start_val) * percent)
  60.   end
  61.  
  62.   #--------------------------------------------------------------------------
  63.   # ● 初始化对象
  64.   #--------------------------------------------------------------------------
  65.   def initialize
  66.     super(0, 0)
  67.     self.visible = false
  68.     select_symbol(:continue) if continue_enabled
  69.   end
  70.  
  71.   def draw_item(i)
  72.  
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # ● 生成指令列表
  76.   #--------------------------------------------------------------------------
  77.   def make_command_list
  78.     add_command(Vocab::new_game, :new_game)
  79.     add_command(Vocab::continue, :continue, continue_enabled)
  80.     add_command(Vocab::shutdown, :shutdown)
  81.  
  82.     make_command
  83.   end
  84. end

RUBY 代码复制
  1. class Window_TitleSub < Window_Base
  2.  
  3.   POS = [-35, 35]
  4.   COUNT = 30.0
  5.  
  6.   attr_accessor :open
  7.  
  8.   def initialize(item = nil, on = false)
  9.     super(0, 0, 24, 24)
  10.     [url=home.php?mod=space&uid=257928]@open[/url] = false
  11.     @on = on
  12.     @ani_count = COUNT
  13.     @command = []
  14.     @command[0] = Sprite.new
  15.     @command[1] = Sprite.new
  16.     case item
  17.     when Vocab::new_game
  18.       bitmap = "TLS-Title-Start-"
  19.     when Vocab::continue
  20.       bitmap = "TLS-Title-Continue-"
  21.     when Vocab::shutdown
  22.       bitmap = "TLS-Title-Exit-"
  23.     end
  24.     @command[0].bitmap = Cache.picture(bitmap + "0")
  25.     @command[0].opacity = 0
  26.     @command[1].bitmap = Cache.picture(bitmap + "1")
  27.     @command[1].opacity = 0
  28.     self.visible = false
  29.     self.x = -30
  30.   end
  31.  
  32.   def x=(n)
  33.     super(0)
  34.     @command[0].x = n
  35.     @command[1].x = n
  36.   end
  37.  
  38.   def opacity=(n)
  39.     super(n)
  40.     @command[0].opacity = n
  41.   end
  42.  
  43.   def dispose
  44.     super
  45.     @command.each{|a| a.dispose}
  46.   end
  47.  
  48.   def refresh(on = @on)
  49.     @on = on
  50.     @ani_count = 0
  51.   end
  52.  
  53.   def calc_target(start_val, end_val, percent)
  54.     return start_val + ((end_val - start_val) * percent)
  55.   end
  56.  
  57.   def update
  58.     super
  59.     update_command
  60.   end
  61.  
  62.   def _open?
  63.     return @open
  64.   end
  65.  
  66.   def update_command
  67.     return unless _open?
  68.     if @on
  69.       if @ani_count < COUNT
  70.         percent = @ani_count / COUNT
  71.         @command[0].x = calc_target(0, POS[1], percent)
  72.         @command[0].opacity = calc_target(255, 0, percent)
  73.         @command[1].x = calc_target(POS[0], 0, percent)
  74.         @command[1].opacity = calc_target(0, 255, percent)
  75.         @ani_count += 1
  76.       else
  77.         @command[0].x = POS[0]
  78.         @command[0].opacity = 0
  79.         @command[1].x = 0
  80.         @command[1].opacity = 255
  81.       end
  82.     else
  83.       if @ani_count < COUNT
  84.         percent = @ani_count / COUNT
  85.         @command[1].x = calc_target(0, POS[1], percent)
  86.         @command[1].opacity = calc_target(255, 0, percent)
  87.         @command[0].x = calc_target(POS[0], 0, percent)
  88.         @command[0].opacity = calc_target(0, 255, percent)
  89.         @ani_count += 1
  90.       else
  91.         @command[1].x = POS[0]
  92.         @command[1].opacity = 0
  93.         @command[0].x = 0
  94.         @command[0].opacity = 255
  95.       end
  96.     end
  97.   end
  98.  
  99. end

RUBY 代码复制
  1. class Scene_Title < Scene_Base
  2.  
  3.   def post_start
  4.     super
  5.     @logo.refresh
  6.     @command_window.refresh_command
  7.   end
  8.  
  9.   alias shiina_c_c_w create_command_window
  10.   def create_command_window
  11.     @logo = Window_TitleLogo.new
  12.     shiina_c_c_w
  13.   end
  14. end

一共是上面四段脚本
我希望出现的效果在事件标题已经做到了 但是现在转到脚本上有点问题
第一是选项滑动开始的时候开始和退出会同时滚动
第二是如果按住上/下键会出现鬼畜效果
选项滑动在事件中有样子已经提供工程附件
跳过标题脚本已经禁用
望大神指点
链接: http://pan.baidu.com/s/1jGA9uLo 密码: 1iow
@taroxd @喵呜喵5 @VIPArcher  

点评

我试了4次,完全没办法下载附件。  发表于 2014-11-9 21:14
<iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=285 height=86 src=&quot;http://music.163.com/outchain/player?type=2&id=33111737&auto=1&height=66&quot;></iframe>

Lv4.逐梦者

「Pemercyia」


Urhurrenna

梦石
0
星屑
9397
在线时间
2748 小时
注册时间
2008-9-5
帖子
3543

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

2
发表于 2014-11-9 20:22:18 | 只看该作者
呵呵呵……………………
反正这组脚本窝写到这里是不想再修惹~
初始居然会select一下最后一项简直WTF~暂时找不到原因中~
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21621
在线时间
9413 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

3
发表于 2014-11-10 17:06:30 | 只看该作者
cinderelmini 发表于 2014-11-9 20:22
呵呵呵……………………
反正这组脚本窝写到这里是不想再修惹~
初始居然会select一下最后一项简直WTF~暂时 ...

Window_TitleCommand
  1.   def select(index)   
  2.     @command[self.index].refresh(false) if @command   
  3.     wait(15, self.index) if @command
  4.     super(index)
  5.     @command[self.index].refresh(true) if @command
  6.   end
复制代码
问题出在这个方法的第一句:
  1. @command[self.index].refresh(false) if @command
复制代码
当一个command窗口载入的时候,其self.index被设置成了-1,而数组中使用负数作为索引实际上等于倒着往前,于是于是第一次执行select方法的时候所做的事情就是:

  1.     结束游戏.refresh(false) if @command   
  2.     wait(15, self.index) if @command
  3.     super(1)
  4.     开始游戏.refresh(true) if @command
复制代码
而refresh方法将结束游戏的@ani_count设置成了0,于是结束游戏自然就会开始update了……

解决方法有很多,例如修改initialize方法变成这个样子:
  1.   def initialize
  2.     super(0, 0)   
  3.     self.visible = false
  4.     select_symbol(:continue) if continue_enabled
  5.     @command[-1].instance_variable_set(:@ani_count, 30000)
  6.   end
复制代码
同理,select_symbol(:continue) if continue_enabled 这句代码也将造成上面提到的问题,不过既然已经知道问题的来源了修改这个应该不难吧


至于选项鬼畜抖动的……

类似这样把下面这段代码扔进Scene_Title里面,强制等待特效结束后才允许玩家按键就好了(或者玩家每次按键结束后强制等待一段时间也可以)
  1. class Window_TitleCommand
  2.   def cursor_movable?
  3.     result = super
  4.     return false unless result
  5.     @command.each{|c| return false if c.m5_effect?}   
  6.     true
  7.   end  
  8. end
  9. class Window_TitleSub  
  10.   def m5_effect?
  11.     return @ani_count < COUNT   
  12.   end
  13. end
复制代码

点评

顺带一提,这个感觉是title急死人的典范,如果还是会不停地死掉返回title的游戏我绝对怒删……  发表于 2014-11-10 17:08

评分

参与人数 1梦石 +2 收起 理由
VIPArcher + 2 怒删游戏

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
99 小时
注册时间
2014-5-2
帖子
66
4
 楼主| 发表于 2014-11-10 17:35:33 | 只看该作者
喵呜喵5 发表于 2014-11-10 17:06
Window_TitleCommand问题出在这个方法的第一句:当一个command窗口载入的时候,其self.index被设置成了-1 ...

感谢喵5前辈啦 而且这个标题特效只会出现两次啦…… @cinderelmini

点评

→_→  发表于 2014-11-10 21:55
哒嘎啦乃一早就去戳M5触触不就好惹?→_→  发表于 2014-11-10 21:05
<iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=285 height=86 src=&quot;http://music.163.com/outchain/player?type=2&id=33111737&auto=1&height=66&quot;></iframe>
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 05:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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