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

Project1

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

[已经解决] 如何让脚本循环时判定按键?

[复制链接]

Lv4.逐梦者

送快递的水表员

梦石
10
星屑
4852
在线时间
3303 小时
注册时间
2012-6-27
帖子
7160

开拓者贵宾

跳转到指定楼层
1
发表于 2014-5-29 19:53:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
这个问题自己研究了俩礼拜……最后还是这个结果:{: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叔
顺便求相关的知识……  

Lv1.梦旅人

星君

梦石
0
星屑
83
在线时间
2980 小时
注册时间
2011-10-9
帖子
2317

贵宾短篇七萝莉正太组冠军

来自 6楼
发表于 2014-5-29 20:56:52 | 只看该作者
本帖最后由 皮卡星 于 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
复制代码

评分

参与人数 2星屑 +320 收起 理由
Luciffer + 100 认可答案
Password + 220 认可答案

查看全部评分


回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
108 小时
注册时间
2014-3-29
帖子
125
2
发表于 2014-5-29 20:21:17 | 只看该作者
料想对于方法show_congrat的调用不是在update西面的吧。如果不是,请不要在这里加入判定,而是在Scene_Battle的update下面加入按键判定。具体还得看你的游戏是怎么设置战斗结束后的淡出的。

点评

在loop do下面放update_basic的话是不会定格的啦一般  发表于 2014-5-29 21:30
就算不是在update里面,update也是用loop执行的,所以你这里用loop是没问题的  发表于 2014-5-29 21:04

评分

参与人数 1星屑 +150 收起 理由
Password + 150 辛苦了

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

星君

梦石
0
星屑
83
在线时间
2980 小时
注册时间
2011-10-9
帖子
2317

贵宾短篇七萝莉正太组冠军

3
发表于 2014-5-29 20:31:40 | 只看该作者
本帖最后由 皮卡星 于 2014-5-29 13:35 编辑

因为你没有Input.update
就好像你画面没有graphics.update就不会动
所以在loop do下面添加Input.update就行了吧

点评

我推荐他加在update是因为生怕他在update执行过程中,因为这个loop产生画面定格。  发表于 2014-5-29 21:17

回复 支持 反对

使用道具 举报

Lv4.逐梦者

送快递的水表员

梦石
10
星屑
4852
在线时间
3303 小时
注册时间
2012-6-27
帖子
7160

开拓者贵宾

4
 楼主| 发表于 2014-5-29 20:43:55 | 只看该作者
王硕 发表于 2014-5-29 20:21
料想对于方法show_congrat的调用不是在update西面的吧。如果不是,请不要在这里加入判定,而是在Scene_Batt ...

某种意义上……如果在update里呢? = =

点评

如果在def show_congrat里加入p 1后只显示一次“1”,那么就应该在update加判定,如果无限显示,那就可以在这里加入判定。我估计是只显示一次。  发表于 2014-5-29 20:54
回复 支持 反对

使用道具 举报

Lv4.逐梦者

送快递的水表员

梦石
10
星屑
4852
在线时间
3303 小时
注册时间
2012-6-27
帖子
7160

开拓者贵宾

5
 楼主| 发表于 2014-5-29 20:51:28 | 只看该作者
皮卡星 发表于 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 下也没有作用。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
108 小时
注册时间
2014-3-29
帖子
125
7
发表于 2014-5-29 21:35:50 | 只看该作者
皮卡星 发表于 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
复制代码

点评

星君言之有理,我只是看到这个现象没有想过去探究其本质。想想的确是这样~  发表于 2014-5-29 21:56
当然如果你只update画面肯定会的吧,spriteset什么的,还有window什么的都是在update_basic里有的,你可以去看看  发表于 2014-5-29 21:38
回复 支持 反对

使用道具 举报

Lv4.逐梦者

送快递的水表员

梦石
10
星屑
4852
在线时间
3303 小时
注册时间
2012-6-27
帖子
7160

开拓者贵宾

8
 楼主| 发表于 2014-5-31 11:41:57 | 只看该作者
皮卡星 发表于 2014-5-29 20:56
因为你要一直按才会执行吧……
你应该这样写

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 12:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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