Project1

标题: 怎么按照这样子的顺序,把事件id依次写入数组,已解决 [打印本页]

作者: 飞翔的小鸟3    时间: 2017-9-17 21:03
标题: 怎么按照这样子的顺序,把事件id依次写入数组,已解决
本帖最后由 飞翔的小鸟3 于 2017-9-20 11:54 编辑

用图来解释一下:

说明:
从A那边开始==》A那条蓝线的末尾==》B蓝线的头==》B蓝线的末尾==》C蓝线的头==》C蓝线的末尾,以此类推……
按照这种顺序把位于蓝线上的事件的id依次写入数组。

应该说的清楚了吧?有空的大佬想想,给个思路也好,我也去想想。
ps 每次都是我想不到,然后提问,接着我就自己想到了.........
作者: 百里_飞柳    时间: 2017-9-17 21:35
先对x坐标迭代,再对y坐标迭代

从A.x到最右边事件的x .each do |i|
  从A.y到最下面事件的y .each do |j|
    获取 (i, j) 坐标的事件的id,压入数组
  end
end
作者: guoxiaomi    时间: 2017-9-17 23:50
本帖最后由 guoxiaomi 于 2017-9-17 23:54 编辑
  1. $game_map.events.values.sort{|e1, e2| e1.x * 100 + e1.y <=> e2.x * 100 + e2.y}.collect{|e| e.id}
复制代码

作者: 飞翔的小鸟3    时间: 2017-9-19 18:13
本帖最后由 飞翔的小鸟3 于 2017-9-19 18:17 编辑
guoxiaomi 发表于 2017-9-17 23:50




顺便麻烦让指定事件名字的id代下去排列,不要全部事件的
我用的是这个代码找出指定名字的事件id
idArray = $game_map.events.keys.find_all{|id| $game_map.events[id].name == '小明'}
这个,你应该看得懂。
作者: guoxiaomi    时间: 2017-9-19 22:59
本帖最后由 guoxiaomi 于 2017-9-19 23:19 编辑
飞翔的小鸟3 发表于 2017-9-19 18:13
顺便麻烦让指定事件名字的id代下去排列,不要全部事件的
我用的是这个代码找出指定名字的事件id
idArra ...


这个脚本很长,要分行写:


  1. # 先排序再选择
  2. a = $game_map.events.values.sort{|e1, e2|
  3. e1.x * 100 + e1.y <=> e2.x * 100 + e2.y
  4. }.collect{|e|
  5. e.name == '小明' ? e.id : nil
  6. }.compact
  7. p a
复制代码

  1. # 先选择再排序
  2. a = $game_map.events.values.find_all{|e|
  3. e.name == '小明'
  4. }.sort{|e1, e2|
  5. e1.x * 100 + e1.y <=> e2.x * 100 + e2.y
  6. }.collect{|e| e.id}
  7. p a
复制代码


作者: 飞翔的小鸟3    时间: 2017-9-19 23:13
本帖最后由 飞翔的小鸟3 于 2017-9-19 23:15 编辑
guoxiaomi 发表于 2017-9-19 22:59
这个脚本很长,要分行写:


咳咳,不好意思,这里有点问题...
1.之前没说清楚,要排列的是名叫“小明”的事件。
2.需要把我那张图颠倒4个方向。




因为这是用枪的游戏,所以有四个方向,本来想你们给我思路,或我看得懂的脚本,然后,我可以自己改,但是
你这个脚本我搞不懂,不能自己改,只能全部问你了。
是不是多了点?

说明:顺序还是不变
作者: guoxiaomi    时间: 2017-9-19 23:18
本帖最后由 guoxiaomi 于 2017-9-19 23:29 编辑
飞翔的小鸟3 发表于 2017-9-19 23:13
咳咳,不好意思,这里有点问题...
1.之前没说清楚,要排列的是名叫“小明”的事件。
2.需要把我那张图颠 ...


这个最关键的地方是 .sort{} 方法
你改一下里面的公式,就可以按照不同的顺序来扫描了。
比如说竖着扫描,那么就计算每一个事件的 x 坐标*100+ y 坐标,用计算的值来排序。

不要想着“扫描”每一个格子,而是想把事件按照顺序“排列”起来。
如果说 x * 100 + y 不好理解,是不是这样写比较好理解:

  1. ...sort{|e1, e2|
  2. e1.x != e2.x ? e1.x <=> e2.x : e1.y <=> e2.y
  3. }
复制代码

如果两个事件的 x 坐标不相同,按照 x 坐标排序;如果 x 坐标相同,按照 y 坐标排序
作者: 飞翔的小鸟3    时间: 2017-9-19 23:43
本帖最后由 飞翔的小鸟3 于 2017-9-19 23:45 编辑
guoxiaomi 发表于 2017-9-19 23:18
这个最关键的地方是 .sort{} 方法
你改一下里面的公式,就可以按照不同的顺序来扫描了。
比如说竖着扫描 ...


我是这样子想的,列出所有事件的X值,比较,把相同的X和对应id分别存入数组(每个数组里都是X相同的事件及id),然后在每个数组里比较y的大小,更改顺序,最后全部写入一个数组里。结束。




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