查看: 2422|回复: 10

[已经解决] 求合并优化类似的循环写法

[复制链接]
梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
回帖
384
发表于 2013-5-17 09:42:22 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 stella 于 2013-5-21 23:19 编辑

以下两段脚本是我写在 scene_map 的 def update 下用于地图ARPG战斗伤害判定的,因为此类脚本太多怕影响速度,想优化一下写法,比如几段类似的脚本合并成一段。求如何合并运算的效率最高且不影响彼此之间的判定

[pre lang="ruby" line="1"]    #XXOO如果敌人刀剑伤害判定
    for i in 1..5
      next if $game_map.events[i+5].character_name == "" or $game_map.events[i+5].character_name == "敌人尸体"
      if $game_switches[105+i] == true and $game_switches[20] == false
        for j in 11..14
          next if $game_map.events[j].character_name == ""
          a = $game_map.events[i+5].screen_x
          b = $game_map.events[j].screen_x
          c = $game_map.events[i+5].screen_y
          d = $game_map.events[j].screen_y
          if $game_map.events[i+5].direction == 4
            if a-b <= 40 and a-b > 0 and (c-d).abs <= 24 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
              $game_switches[105+i] = false
              $game_map.events[j].animation_id = 300
              $game_map.events[j].move_backward
              $game_map.events[j].damage = 78
              $game_map.events[j].critical = false
              $game_map.events[j].damage_pop = true
              #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
              name = $game_map.events[j].name
              pet_sn = j.to_s
              data = name.split(/,/)
              data[1]=data[1].to_i-$game_map.events[j].damage
              $game_variables[j] -= 78
              $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
              if data[1].to_i <= 0
                data[1] = 0
                $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
                $game_self_switches[[$game_map.map_id, j, "D"]] = true
                $game_self_switches[[$game_map.map_id, j, "C"]] = false
                $game_map.need_refresh = true
                $game_map.events[j].refresh
              end
            end
          elsif $game_map.events[i+5].direction == 6
            if a-b >= -40 and a-b < 0 and (c-d).abs <= 24 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
              $game_switches[105+i] = false
              $game_map.events[j].animation_id = 300
              $game_map.events[j].move_backward
              $game_map.events[j].damage = 78
              $game_map.events[j].critical = false
              $game_map.events[j].damage_pop = true
              #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
              name = $game_map.events[j].name
              pet_sn = j.to_s
              data = name.split(/,/)
              data[1]=data[1].to_i-$game_map.events[j].damage
              $game_variables[j] -= 78
              $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
              if data[1].to_i <= 0
                data[1] = 0
                $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
                $game_self_switches[[$game_map.map_id, j, "D"]] = true
                $game_self_switches[[$game_map.map_id, j, "C"]] = false
                $game_map.need_refresh = true
                $game_map.events[j].refresh
              end
            end
          end
        end
      end
    end[/pre]


[pre lang="ruby" line="1"]    #XXOO如果敌人长枪戳刺伤害判定
    for i in 1..5
      next if $game_map.events[i+5].character_name == "" or $game_map.events[i+5].character_name == "敌人尸体"
      if $game_switches[115+i] == true and $game_switches[20] == false
        for j in 11..14
          next if $game_map.events[j].character_name == ""
          a = $game_map.events[i+5].screen_x
          b = $game_map.events[j].screen_x
          c = $game_map.events[i+5].screen_y
          d = $game_map.events[j].screen_y
          if $game_map.events[i+5].direction == 4
            if a-b <= 72 and a-b > 0 and (c-d).abs <= 16 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
              $game_switches[115+i] = false
              $game_map.events[j].animation_id = 300
              $game_map.events[j].move_backward
              $game_map.events[j].damage = 46
              $game_map.events[j].critical = false
              $game_map.events[j].damage_pop = true
              #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
              name = $game_map.events[j].name
              pet_sn = j.to_s
              data = name.split(/,/)
              data[1]=data[1].to_i-$game_map.events[j].damage
              $game_variables[j] -= 46
              $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
              if data[1].to_i <= 0
                data[1] = 0
                $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
                $game_self_switches[[$game_map.map_id, j, "D"]] = true
                $game_self_switches[[$game_map.map_id, j, "C"]] = false
                $game_map.need_refresh = true
                $game_map.events[j].refresh
              end
            end
          elsif $game_map.events[i+5].direction == 6
            if a-b >= -72 and a-b < 0 and (c-d).abs <= 16 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
              $game_switches[115+i] = false
              $game_map.events[j].animation_id = 300
              $game_map.events[j].move_backward
              $game_map.events[j].damage = 46
              $game_map.events[j].critical = false
              $game_map.events[j].damage_pop = true
              #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
              name = $game_map.events[j].name
              pet_sn = j.to_s
              data = name.split(/,/)
              data[1]=data[1].to_i-$game_map.events[j].damage
              $game_variables[j] -= 46
              $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
              if data[1].to_i <= 0
                data[1] = 0
                $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
                $game_self_switches[[$game_map.map_id, j, "D"]] = true
                $game_self_switches[[$game_map.map_id, j, "C"]] = false
                $game_map.need_refresh = true
                $game_map.events[j].refresh
              end
            end
          end
        end
      end
    end[/pre]
梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2013-5-17 12:12:11 | 显示全部楼层
老兄···这个已经优化过了···再优化这脚本就废掉了
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
回帖
384
 楼主| 发表于 2013-5-17 12:42:07 | 显示全部楼层
chd114 发表于 2013-5-17 12:12
老兄···这个已经优化过了···再优化这脚本就废掉了


这两大段合并到一个 for 循环里会不会快一些呢?
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2013-5-17 12:49:38 | 显示全部楼层
stella 发表于 2013-5-17 12:42
这两大段合并到一个 for 循环里会不会快一些呢?

不是一个变量你怎么合···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
回帖
384
 楼主| 发表于 2013-5-17 12:58:40 | 显示全部楼层
chd114 发表于 2013-5-17 12:49
不是一个变量你怎么合···

写成这样可以么? 两段全部并到 for i in 1..5 里面,会有冲突么?


[pre lang="ruby" line="1"]    for i in 1..5
      next if $game_map.events[i+5].character_name == "" or $game_map.events[i+5].character_name == "敌人尸体"
      #XXOO如果敌人刀剑伤害判定
      if $game_switches[105+i] == true and $game_switches[20] == false
        for j in 11..14
          next if $game_map.events[j].character_name == ""
          a = $game_map.events[i+5].screen_x
          b = $game_map.events[j].screen_x
          c = $game_map.events[i+5].screen_y
          d = $game_map.events[j].screen_y
          if $game_map.events[i+5].direction == 4
            if a-b <= 40 and a-b > 0 and (c-d).abs <= 24 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
              $game_switches[105+i] = false
              $game_map.events[j].animation_id = 300
              $game_map.events[j].move_backward
              $game_map.events[j].damage = 78
              $game_map.events[j].critical = false
              $game_map.events[j].damage_pop = true
              #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
              name = $game_map.events[j].name
              pet_sn = j.to_s
              data = name.split(/,/)
              data[1]=data[1].to_i-$game_map.events[j].damage
              $game_variables[j] -= 78
              $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
              if data[1].to_i <= 0
                data[1] = 0
                $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
                $game_self_switches[[$game_map.map_id, j, "D"]] = true
                $game_self_switches[[$game_map.map_id, j, "C"]] = false
                $game_map.need_refresh = true
                $game_map.events[j].refresh
              end
            end
          elsif $game_map.events[i+5].direction == 6
            if a-b >= -40 and a-b < 0 and (c-d).abs <= 24 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
              $game_switches[105+i] = false
              $game_map.events[j].animation_id = 300
              $game_map.events[j].move_backward
              $game_map.events[j].damage = 78
              $game_map.events[j].critical = false
              $game_map.events[j].damage_pop = true
              #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
              name = $game_map.events[j].name
              pet_sn = j.to_s
              data = name.split(/,/)
              data[1]=data[1].to_i-$game_map.events[j].damage
              $game_variables[j] -= 78
              $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
              if data[1].to_i <= 0
                data[1] = 0
                $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
                $game_self_switches[[$game_map.map_id, j, "D"]] = true
                $game_self_switches[[$game_map.map_id, j, "C"]] = false
                $game_map.need_refresh = true
                $game_map.events[j].refresh
              end
            end
          end
        end
      end
      #XXOO如果敌人长枪戳刺伤害判定
      if $game_switches[115+i] == true and $game_switches[20] == false
        for j in 11..14
          next if $game_map.events[j].character_name == ""
          a = $game_map.events[i+5].screen_x
          b = $game_map.events[j].screen_x
          c = $game_map.events[i+5].screen_y
          d = $game_map.events[j].screen_y
          if $game_map.events[i+5].direction == 4
            if a-b <= 72 and a-b > 0 and (c-d).abs <= 16 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
              $game_switches[115+i] = false
              $game_map.events[j].animation_id = 300
              $game_map.events[j].move_backward
              $game_map.events[j].damage = 46
              $game_map.events[j].critical = false
              $game_map.events[j].damage_pop = true
              #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
              name = $game_map.events[j].name
              pet_sn = j.to_s
              data = name.split(/,/)
              data[1]=data[1].to_i-$game_map.events[j].damage
              $game_variables[j] -= 46
              $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
              if data[1].to_i <= 0
                data[1] = 0
                $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
                $game_self_switches[[$game_map.map_id, j, "D"]] = true
                $game_self_switches[[$game_map.map_id, j, "C"]] = false
                $game_map.need_refresh = true
                $game_map.events[j].refresh
              end
            end
          elsif $game_map.events[i+5].direction == 6
            if a-b >= -72 and a-b < 0 and (c-d).abs <= 16 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
              $game_switches[115+i] = false
              $game_map.events[j].animation_id = 300
              $game_map.events[j].move_backward
              $game_map.events[j].damage = 46
              $game_map.events[j].critical = false
              $game_map.events[j].damage_pop = true
              #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
              name = $game_map.events[j].name
              pet_sn = j.to_s
              data = name.split(/,/)
              data[1]=data[1].to_i-$game_map.events[j].damage
              $game_variables[j] -= 46
              $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
              if data[1].to_i <= 0
                data[1] = 0
                $game_map.events[j].name="守卫"+pet_sn+","+data[1].to_s+","+data[2].to_s+","+data[3].to_s+","+data[4].to_s+","+data[5].to_s
                $game_self_switches[[$game_map.map_id, j, "D"]] = true
                $game_self_switches[[$game_map.map_id, j, "C"]] = false
                $game_map.need_refresh = true
                $game_map.events[j].refresh
              end
            end
          end
        end
      end
    end[/pre]
回复

使用道具 举报

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
回帖
384
 楼主| 发表于 2013-5-20 08:23:57 | 显示全部楼层
就这么淹没了
回复

使用道具 举报

梦石
0
星屑
275
在线时间
1373 小时
注册时间
2005-10-16
回帖
5038

贵宾

发表于 2013-5-20 09:03:16 | 显示全部楼层
$game_switches[20] == false
对于20号开关的判断可以再优先一些,在循环外面,应该是先决条件吧?
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复

使用道具 举报

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
回帖
384
 楼主| 发表于 2013-5-20 15:12:03 | 显示全部楼层
本帖最后由 stella 于 2013-5-20 15:17 编辑
亿万星辰 发表于 2013-5-20 09:03
$game_switches[20] == false
对于20号开关的判断可以再优先一些,在循环外面,应该是先决条件吧? ...


那么有必要把好几个 for i in 1..5 如五楼那样合并成一个么?如果类似这样的for循环脚本多达三十几个的话?  如果区别不大的话我就不用纠结这一点了。。
回复

使用道具 举报

梦石
0
星屑
275
在线时间
1373 小时
注册时间
2005-10-16
回帖
5038

贵宾

发表于 2013-5-20 23:27:40 | 显示全部楼层
stella 发表于 2013-5-20 15:12
那么有必要把好几个 for i in 1..5 如五楼那样合并成一个么?如果类似这样的for循环脚本多达三十几个的话 ...

尽量还是能借助一个循环,把要搞的事情搞好吧~~

日常工作我涉及到的只是一个纯粹的过程控制,所以数据结构,编程复杂度这方面的知识我是真心都丢了~~

最简单的办法是就是通过下面的方法来看看代码的运行时间

t = Time.now
你的若干代码
……
p Time.now - t

多运行几次,看这个时间,这里可能还涉及到很多其他方面的东西,我的能力也只能解答到这里了。
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复

使用道具 举报

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
回帖
384
 楼主| 发表于 2013-5-21 15:16:31 | 显示全部楼层
亿万星辰 发表于 2013-5-20 23:27
尽量还是能借助一个循环,把要搞的事情搞好吧~~

日常工作我涉及到的只是一个纯粹的过程控制,所以数据结 ...
  1. t = Time.now
  2. 你的若干代码
  3. ……
  4. p Time.now - t
复制代码
这段代码我放在scene_map 的def update 下,把所有自己添加的for 循环移到里面,测试一下,地图上不断跳出的窗口显示是0.016~0.03之间,那么这样的时间影响就可以忽略不计了?
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部