Project1

标题: 如何让脚本循环时判定按键? [打印本页]

作者: Password    时间: 2014-5-29 19:53
标题: 如何让脚本循环时判定按键?
这个问题自己研究了俩礼拜……最后还是这个结果:{:8_437:} {:8_438:}
脚本在loop do 中加入按键判定,但是按键不能判定(就像自动执行的事件里加入条件分歧的按键判定差不多 = =)
其实不一定要达到标题的目的,
这次主要的目的是让下面这段脚本在第一段循环后不继续进行,而是判定确定键是否按下,然后按下就执行第二段循环。
其实这段脚本就是:显示战斗胜利效果 → 等待确定键按下 → 淡出(就做到congrat.dispose 就可以了)
RUBY 代码复制
  1. def show_congrat
  2.     congrat = Sprite.new
  3.     congrat.bitmap = Bitmap.new("Graphics/System/战斗胜利")
  4.     congrat.opacity = 0
  5.     wait1 = 0
  6.     wait2 = 72
  7.     panding = 0
  8.     a = 0
  9.     @ani_sprite = Sprite_Base.new
  10.     @animation = $data_animations[159]
  11.     @ani_sprite.start_animation(@animation)
  12.     loop do
  13.       Audio.bgm_play("Audio/BGM/" + "Victory_Fanfare", a, 100) unless a == 100
  14.       if a < 100 and panding < 2
  15.         a += 4
  16.       end
  17.       if wait1 > 72 and panding == 0
  18.         @animation = nil
  19.         @ani_sprite.dispose
  20.         @ani_sprite = nil
  21.         panding = 1
  22.       elsif wait1 <= 72 and panding == 0
  23.         @ani_sprite.update unless @ani_sprite.nil?
  24.       end
  25.       congrat.opacity += 10 if wait1 < 40
  26.       Graphics.update
  27.       $game_map.update
  28.       @spriteset.update
  29.       wait1 += 1 unless wait1 > 72
  30.       break if wait1 == 73
  31.     end
  32.     if Input.trigger?(Input::C)
  33.       loop do
  34.         Audio.bgm_play("Audio/BGM/" + "Victory_Fanfare", a, 100) unless panding == 3
  35.         if a > 0
  36.           a -= 4
  37.           if a == 0
  38.             Audio.bgm_stop
  39.             panding = 3
  40.           end
  41.         end
  42.         congrat.opacity -= 10 if wait2 > 72
  43.         wait2 += 1
  44.         break if wait2 == 100
  45.       end
  46.     end
  47.     congrat.dispose
  48.   end

@protosssonny @P叔
顺便求相关的知识……  
作者: 王硕    时间: 2014-5-29 20:21
料想对于方法show_congrat的调用不是在update西面的吧。如果不是,请不要在这里加入判定,而是在Scene_Battle的update下面加入按键判定。具体还得看你的游戏是怎么设置战斗结束后的淡出的。
作者: 皮卡星    时间: 2014-5-29 20:31
本帖最后由 皮卡星 于 2014-5-29 13:35 编辑

因为你没有Input.update
就好像你画面没有graphics.update就不会动
所以在loop do下面添加Input.update就行了吧
作者: Password    时间: 2014-5-29 20:43
王硕 发表于 2014-5-29 20:21
料想对于方法show_congrat的调用不是在update西面的吧。如果不是,请不要在这里加入判定,而是在Scene_Batt ...

某种意义上……如果在update里呢? = =
作者: Password    时间: 2014-5-29 20:51
皮卡星 发表于 2014-5-29 20:31
因为你没有Input.update
就好像你画面没有graphics.update就不会动
所以在loop do下面添加Input.update就行 ...

试了下,
如果if Input.trigger?(Input::C) 套在 loop do 上面的话,直接就会淡出了,
如果 loop do 套在 if Input.trigger?(Input::C) 上面的话,加在loop do 下也没有作用。
作者: 皮卡星    时间: 2014-5-29 20:56
本帖最后由 皮卡星 于 2014-5-29 14:02 编辑

因为你要一直按才会执行吧……
你应该这样写
  1.   def show_congrat
  2.     congrat = Sprite.new
  3.     congrat.bitmap = Bitmap.new("Graphics/System/战斗胜利")
  4.     congrat.opacity = 0
  5.     wait1 = 0
  6.     wait2 = 72
  7.     panding = 0
  8.     a = 0
  9.     @ani_sprite = Sprite_Base.new
  10.     @animation = $data_animations[159]
  11.     @ani_sprite.start_animation(@animation)
  12.     loop do
  13.       Audio.bgm_play("Audio/BGM/" + "Victory_Fanfare", a, 100) unless a == 100
  14.       if a < 100 and panding < 2
  15.         a += 4
  16.       end
  17.       if wait1 > 72 and panding == 0
  18.         @animation = nil
  19.         @ani_sprite.dispose
  20.         @ani_sprite = nil
  21.         panding = 1
  22.       elsif wait1 <= 72 and panding == 0
  23.         @ani_sprite.update unless @ani_sprite.nil?
  24.       end
  25.       congrat.opacity += 10 if wait1 < 40
  26.       Graphics.update
  27.       $game_map.update
  28.       @spriteset.update
  29.       wait1 += 1 unless wait1 > 72
  30.       break if wait1 == 73
  31.     end
  32.     bgm_on = false
  33.     loop do
  34.       Input.update
  35.       bgm_on = true if Input.trigger?(Input::C)
  36.       if bgm_on
  37.         Audio.bgm_play("Audio/BGM/" + "Victory_Fanfare", a, 100) unless panding == 3
  38.         if a > 0
  39.           a -= 4
  40.           if a == 0
  41.             Audio.bgm_stop
  42.             panding = 3
  43.           end
  44.         end
  45.         congrat.opacity -= 10 if wait2 > 72
  46.         wait2 += 1
  47.         break if wait2 == 100
  48.       end
  49.       congrat.dispose      
  50.     end
复制代码

作者: 王硕    时间: 2014-5-29 21:35
皮卡星 发表于 2014-5-29 20:56
因为你要一直按才会执行吧……
你应该这样写


从下面这个得失物品的脚本中得出的结论,下面这个脚本第68-76行的写法会导致战斗画面定格
  1.   def show_gain_window(type, value, string=nil)
  2.     snstar2006_66rpg_item = $data_armors[@params[0]] if string == nil and type != 0
  3.     snstar2006_66rpg = Window_Base.new((S_WIDTH-312)/2,(S_HEIGHT-132)/2,312,132)
  4.     snstar2006_66rpg.contents = Bitmap.new(snstar2006_66rpg.width - 32, snstar2006_66rpg.height - 32)
  5.     if value >= 0
  6.       gain_text = "获得"   
  7.     else
  8.       gain_text = "失去"
  9.     end
  10.    
  11.     case type
  12.     when 0
  13.       gain_type = "金钱"
  14.       if value >=0
  15.         Audio.se_play(Gain_gold_se,80,100)
  16.       else
  17.         Audio.se_play(Loss_gold_se,80,100)
  18.       end
  19.     when 1
  20.       gain_type = "物品"
  21.       string = $data_items[@params[0]] if string == nil
  22.       if value >=0
  23.         Audio.se_play(Gain_item_se,80,100)
  24.       else
  25.         Audio.se_play(Loss_item_se,80,100)
  26.       end
  27.     when 2
  28.       gain_type = "武器"
  29.       string = $base_weapons[@params[0]] if string == nil
  30.       if value >=0
  31.         Audio.se_play(Gain_weapon_se,80,100)
  32.       else
  33.         Audio.se_play(Loss_weapon_se,80,100)
  34.       end
  35.     when 3
  36.       unless @params[0] == PA::CRYSTAL
  37.         gain_type = "防具"
  38.       else
  39.         gain_type = "物品"
  40.       end  
  41.       string = $base_armors[@params[0]] if string == nil
  42.       if value >=0
  43.         Audio.se_play(Gain_armor_se,80,100)
  44.       else
  45.         Audio.se_play(Loss_armor_se,80,100)
  46.       end
  47.     when 4
  48.       gain_type = "防具"  
  49.       string = $base_armors[@params[0]] if string == nil
  50.       if value >=0
  51.         Audio.se_play(Gain_armor_se,80,100)
  52.       else
  53.         Audio.se_play(Loss_armor_se,80,100)
  54.       end
  55.     end
  56.    
  57.     snstar2006_66rpg.contents.draw_text(0,0,160,32,gain_text+gain_type+":")
  58.    
  59.     unless type == 0
  60.       snstar2006_66rpg.draw_item_name(string, 28, 32, true)
  61.       snstar2006_66rpg.contents.draw_text(0, 64, 150, 32, "×"+value.abs.to_s, 2)
  62.     else
  63.       snstar2006_66rpg.contents.draw_text(32,32,240,32,value.abs.to_s + "  "+ Vocab::gold)
  64.     end
  65.    
  66.     snstar2006_66rpg.opacity = 160
  67.    
  68.     for i in 0..30
  69.       Graphics.update
  70.     end
  71.    
  72.     for i in 0..10
  73.       snstar2006_66rpg.opacity -= 30
  74.       snstar2006_66rpg.contents_opacity -= 30
  75.       Graphics.update
  76.     end
  77.    
  78.     snstar2006_66rpg.dispose
  79.   end
复制代码

作者: Password    时间: 2014-5-31 11:41
皮卡星 发表于 2014-5-29 20:56
因为你要一直按才会执行吧……
你应该这样写

我错了……前两天被抓去写数学了……
这段很好地达到了效果,非常感谢!
P.S.:一开始用的时候会直接退出战斗,后来才发现是各种update没加到第二个循环里
看来刷新的确是个重要的事情呢……之前一直没听过Input.update(又学到新姿势了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1