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

Project1

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

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
帖子
541
跳转到指定楼层
1
发表于 2013-5-17 09:42:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

RUBY 代码复制
  1. #XXOO如果敌人刀剑伤害判定
  2.     for i in 1..5
  3.       next if $game_map.events[i+5].character_name == "" or $game_map.events[i+5].character_name == "敌人尸体"
  4.       if $game_switches[105+i] == true and $game_switches[20] == false
  5.         for j in 11..14
  6.           next if $game_map.events[j].character_name == ""
  7.           a = $game_map.events[i+5].screen_x
  8.           b = $game_map.events[j].screen_x
  9.           c = $game_map.events[i+5].screen_y
  10.           d = $game_map.events[j].screen_y
  11.           if $game_map.events[i+5].direction == 4
  12.             if a-b <= 40 and a-b > 0 and (c-d).abs <= 24 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
  13.               $game_switches[105+i] = false
  14.               $game_map.events[j].animation_id = 300
  15.               $game_map.events[j].move_backward
  16.               $game_map.events[j].damage = 78
  17.               $game_map.events[j].critical = false
  18.               $game_map.events[j].damage_pop = true
  19.               #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
  20.               name = $game_map.events[j].name
  21.               pet_sn = j.to_s
  22.               data = name.split(/,/)
  23.               data[1]=data[1].to_i-$game_map.events[j].damage
  24.               $game_variables[j] -= 78
  25.               $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
  26.               if data[1].to_i <= 0
  27.                 data[1] = 0
  28.                 $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
  29.                 $game_self_switches[[$game_map.map_id, j, "D"]] = true
  30.                 $game_self_switches[[$game_map.map_id, j, "C"]] = false
  31.                 $game_map.need_refresh = true
  32.                 $game_map.events[j].refresh
  33.               end
  34.             end
  35.           elsif $game_map.events[i+5].direction == 6
  36.             if a-b >= -40 and a-b < 0 and (c-d).abs <= 24 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
  37.               $game_switches[105+i] = false
  38.               $game_map.events[j].animation_id = 300
  39.               $game_map.events[j].move_backward
  40.               $game_map.events[j].damage = 78
  41.               $game_map.events[j].critical = false
  42.               $game_map.events[j].damage_pop = true
  43.               #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
  44.               name = $game_map.events[j].name
  45.               pet_sn = j.to_s
  46.               data = name.split(/,/)
  47.               data[1]=data[1].to_i-$game_map.events[j].damage
  48.               $game_variables[j] -= 78
  49.               $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
  50.               if data[1].to_i <= 0
  51.                 data[1] = 0
  52.                 $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
  53.                 $game_self_switches[[$game_map.map_id, j, "D"]] = true
  54.                 $game_self_switches[[$game_map.map_id, j, "C"]] = false
  55.                 $game_map.need_refresh = true
  56.                 $game_map.events[j].refresh
  57.               end
  58.             end
  59.           end
  60.         end
  61.       end
  62.     end



RUBY 代码复制
  1. #XXOO如果敌人长枪戳刺伤害判定
  2.     for i in 1..5
  3.       next if $game_map.events[i+5].character_name == "" or $game_map.events[i+5].character_name == "敌人尸体"
  4.       if $game_switches[115+i] == true and $game_switches[20] == false
  5.         for j in 11..14
  6.           next if $game_map.events[j].character_name == ""
  7.           a = $game_map.events[i+5].screen_x
  8.           b = $game_map.events[j].screen_x
  9.           c = $game_map.events[i+5].screen_y
  10.           d = $game_map.events[j].screen_y
  11.           if $game_map.events[i+5].direction == 4
  12.             if a-b <= 72 and a-b > 0 and (c-d).abs <= 16 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
  13.               $game_switches[115+i] = false
  14.               $game_map.events[j].animation_id = 300
  15.               $game_map.events[j].move_backward
  16.               $game_map.events[j].damage = 46
  17.               $game_map.events[j].critical = false
  18.               $game_map.events[j].damage_pop = true
  19.               #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
  20.               name = $game_map.events[j].name
  21.               pet_sn = j.to_s
  22.               data = name.split(/,/)
  23.               data[1]=data[1].to_i-$game_map.events[j].damage
  24.               $game_variables[j] -= 46
  25.               $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
  26.               if data[1].to_i <= 0
  27.                 data[1] = 0
  28.                 $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
  29.                 $game_self_switches[[$game_map.map_id, j, "D"]] = true
  30.                 $game_self_switches[[$game_map.map_id, j, "C"]] = false
  31.                 $game_map.need_refresh = true
  32.                 $game_map.events[j].refresh
  33.               end
  34.             end
  35.           elsif $game_map.events[i+5].direction == 6
  36.             if a-b >= -72 and a-b < 0 and (c-d).abs <= 16 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
  37.               $game_switches[115+i] = false
  38.               $game_map.events[j].animation_id = 300
  39.               $game_map.events[j].move_backward
  40.               $game_map.events[j].damage = 46
  41.               $game_map.events[j].critical = false
  42.               $game_map.events[j].damage_pop = true
  43.               #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
  44.               name = $game_map.events[j].name
  45.               pet_sn = j.to_s
  46.               data = name.split(/,/)
  47.               data[1]=data[1].to_i-$game_map.events[j].damage
  48.               $game_variables[j] -= 46
  49.               $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
  50.               if data[1].to_i <= 0
  51.                 data[1] = 0
  52.                 $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
  53.                 $game_self_switches[[$game_map.map_id, j, "D"]] = true
  54.                 $game_self_switches[[$game_map.map_id, j, "C"]] = false
  55.                 $game_map.need_refresh = true
  56.                 $game_map.events[j].refresh
  57.               end
  58.             end
  59.           end
  60.         end
  61.       end
  62.     end

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

2
发表于 2013-5-17 12:12:11 | 只看该作者
老兄···这个已经优化过了···再优化这脚本就废掉了
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
帖子
541
3
 楼主| 发表于 2013-5-17 12:42:07 | 只看该作者
chd114 发表于 2013-5-17 12:12
老兄···这个已经优化过了···再优化这脚本就废掉了


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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

4
发表于 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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
帖子
541
5
 楼主| 发表于 2013-5-17 12:58:40 | 只看该作者
chd114 发表于 2013-5-17 12:49
不是一个变量你怎么合···

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


RUBY 代码复制
  1. for i in 1..5
  2.       next if $game_map.events[i+5].character_name == "" or $game_map.events[i+5].character_name == "敌人尸体"
  3.       #XXOO如果敌人刀剑伤害判定
  4.       if $game_switches[105+i] == true and $game_switches[20] == false
  5.         for j in 11..14
  6.           next if $game_map.events[j].character_name == ""
  7.           a = $game_map.events[i+5].screen_x
  8.           b = $game_map.events[j].screen_x
  9.           c = $game_map.events[i+5].screen_y
  10.           d = $game_map.events[j].screen_y
  11.           if $game_map.events[i+5].direction == 4
  12.             if a-b <= 40 and a-b > 0 and (c-d).abs <= 24 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
  13.               $game_switches[105+i] = false
  14.               $game_map.events[j].animation_id = 300
  15.               $game_map.events[j].move_backward
  16.               $game_map.events[j].damage = 78
  17.               $game_map.events[j].critical = false
  18.               $game_map.events[j].damage_pop = true
  19.               #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
  20.               name = $game_map.events[j].name
  21.               pet_sn = j.to_s
  22.               data = name.split(/,/)
  23.               data[1]=data[1].to_i-$game_map.events[j].damage
  24.               $game_variables[j] -= 78
  25.               $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
  26.               if data[1].to_i <= 0
  27.                 data[1] = 0
  28.                 $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
  29.                 $game_self_switches[[$game_map.map_id, j, "D"]] = true
  30.                 $game_self_switches[[$game_map.map_id, j, "C"]] = false
  31.                 $game_map.need_refresh = true
  32.                 $game_map.events[j].refresh
  33.               end
  34.             end
  35.           elsif $game_map.events[i+5].direction == 6
  36.             if a-b >= -40 and a-b < 0 and (c-d).abs <= 24 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
  37.               $game_switches[105+i] = false
  38.               $game_map.events[j].animation_id = 300
  39.               $game_map.events[j].move_backward
  40.               $game_map.events[j].damage = 78
  41.               $game_map.events[j].critical = false
  42.               $game_map.events[j].damage_pop = true
  43.               #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
  44.               name = $game_map.events[j].name
  45.               pet_sn = j.to_s
  46.               data = name.split(/,/)
  47.               data[1]=data[1].to_i-$game_map.events[j].damage
  48.               $game_variables[j] -= 78
  49.               $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
  50.               if data[1].to_i <= 0
  51.                 data[1] = 0
  52.                 $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
  53.                 $game_self_switches[[$game_map.map_id, j, "D"]] = true
  54.                 $game_self_switches[[$game_map.map_id, j, "C"]] = false
  55.                 $game_map.need_refresh = true
  56.                 $game_map.events[j].refresh
  57.               end
  58.             end
  59.           end
  60.         end
  61.       end
  62.       #XXOO如果敌人长枪戳刺伤害判定
  63.       if $game_switches[115+i] == true and $game_switches[20] == false
  64.         for j in 11..14
  65.           next if $game_map.events[j].character_name == ""
  66.           a = $game_map.events[i+5].screen_x
  67.           b = $game_map.events[j].screen_x
  68.           c = $game_map.events[i+5].screen_y
  69.           d = $game_map.events[j].screen_y
  70.           if $game_map.events[i+5].direction == 4
  71.             if a-b <= 72 and a-b > 0 and (c-d).abs <= 16 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
  72.               $game_switches[115+i] = false
  73.               $game_map.events[j].animation_id = 300
  74.               $game_map.events[j].move_backward
  75.               $game_map.events[j].damage = 46
  76.               $game_map.events[j].critical = false
  77.               $game_map.events[j].damage_pop = true
  78.               #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
  79.               name = $game_map.events[j].name
  80.               pet_sn = j.to_s
  81.               data = name.split(/,/)
  82.               data[1]=data[1].to_i-$game_map.events[j].damage
  83.               $game_variables[j] -= 46
  84.               $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
  85.               if data[1].to_i <= 0
  86.                 data[1] = 0
  87.                 $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
  88.                 $game_self_switches[[$game_map.map_id, j, "D"]] = true
  89.                 $game_self_switches[[$game_map.map_id, j, "C"]] = false
  90.                 $game_map.need_refresh = true
  91.                 $game_map.events[j].refresh
  92.               end
  93.             end
  94.           elsif $game_map.events[i+5].direction == 6
  95.             if a-b >= -72 and a-b < 0 and (c-d).abs <= 16 and $game_self_switches[[$game_map.map_id, j, "D"]] == false
  96.               $game_switches[115+i] = false
  97.               $game_map.events[j].animation_id = 300
  98.               $game_map.events[j].move_backward
  99.               $game_map.events[j].damage = 46
  100.               $game_map.events[j].critical = false
  101.               $game_map.events[j].damage_pop = true
  102.               #XXOO开始改宠物事件名字并根据事件名的变化判定是否死亡
  103.               name = $game_map.events[j].name
  104.               pet_sn = j.to_s
  105.               data = name.split(/,/)
  106.               data[1]=data[1].to_i-$game_map.events[j].damage
  107.               $game_variables[j] -= 46
  108.               $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
  109.               if data[1].to_i <= 0
  110.                 data[1] = 0
  111.                 $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
  112.                 $game_self_switches[[$game_map.map_id, j, "D"]] = true
  113.                 $game_self_switches[[$game_map.map_id, j, "C"]] = false
  114.                 $game_map.need_refresh = true
  115.                 $game_map.events[j].refresh
  116.               end
  117.             end
  118.           end
  119.         end
  120.       end
  121.     end
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
帖子
541
6
 楼主| 发表于 2013-5-20 08:23:57 | 只看该作者
就这么淹没了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
280
在线时间
1374 小时
注册时间
2005-10-16
帖子
5113

贵宾

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
帖子
541
8
 楼主| 发表于 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循环脚本多达三十几个的话?  如果区别不大的话我就不用纠结这一点了。。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
280
在线时间
1374 小时
注册时间
2005-10-16
帖子
5113

贵宾

9
发表于 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

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
帖子
541
10
 楼主| 发表于 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之间,那么这样的时间影响就可以忽略不计了?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 07:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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