Project1

标题: 请问如何在区域内将事件的位置随机化? [打印本页]

作者: 888000    时间: 2014-5-16 12:14
标题: 请问如何在区域内将事件的位置随机化?
想让宝箱的位置随机出现,但怕随机到墙里面或者堵住路,故打算设定某一区域内随机。
但是不知道具体怎样操作……希望尽量不要用到脚本。
同时,也想防止两个事件同时随机到一个位置。
作者: H·H·Y    时间: 2014-5-16 13:12
本帖最后由 H·H·Y 于 2014-5-16 13:14 编辑

使用随机数变量,在设置事件位置里面设置事件XY坐标的时候用这个变量

学校电脑没有RM。。范例回家再做吧
作者: moy    时间: 2014-5-16 14:48
本帖最后由 moy 于 2014-5-16 15:26 编辑

[pre lang="ruby" line="1"]#==============================================================================
# ★ Custom Adventure 区域随机事件定位
# -- Last Updated: 2014.5.16
# -- by Moy
# -- 转载请保留以上信息
#==============================================================================
#==============================================================================
# ■ Game_Map
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # ● 获取区域内的随机(空闲)坐标
  #--------------------------------------------------------------------------
  def get_region_xy(region)
    @region_map = Hash.new if @region_map.nil?
    if @region_map[region].nil?
      @region_map[region] = Array.new
      index = 0
      for x in 0..width
        for y in 0..height
          if region_id(x,y) == region
            @region_map[region][index]= [x,y]
            index += 1
          end
        end
      end
    else
      index = @region_map[region].length
    end
    if index > 0
      x,y = @region_map[region][rand(index)]
      return x,y if events_xy(x, y).empty?
    end
    return -1,-1
  end
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 将本事件放入某区域的随机位置上
  #--------------------------------------------------------------------------
  def put_in_region(region)
    x,y = $game_map.get_region_xy(region)
    if x != -1 && y != -1
      get_character(0).moveto(x,y)
    end
  end
end[/pre]
在地图上划定区域后,在事件的自动运行页中加入脚本put_in_region(n)就可以,n是区域的编号
正好自己的坑也要用到,就贴出来了。不过我只是初步测试了一下,有没有隐患我不知道
作者: 888000    时间: 2014-5-16 17:12
本帖最后由 888000 于 2014-5-16 17:14 编辑
moy 发表于 2014-5-16 14:48
#==============================================================================
# ★ Custom Adventu ...


O(∩_∩)O谢谢~但是如果有多个事件在同一区域随机位置,可以防止极偶然的随机到同一坐标上的情况么?(因为出现几率较低,测试的话也不太现实的样子……)

啊啊……(锤头!)是我有点表达不清……比如某个位置本来是空闲的,但是可能出现两个随机位置的事件都随机到这里了的情况么?
作者: 喵呜喵5    时间: 2014-5-16 17:47
https://rpg.blue/thread-297473-1-1.html
作者: 888000    时间: 2014-5-17 22:28
本帖最后由 888000 于 2014-5-17 22:31 编辑
moy 发表于 2014-5-16 14:48
#==============================================================================
# ★ Custom Adventu ...


还是有一些问题……
关于多个事件随机到同一地点……
为了增加重叠几率,4个事件4个坑,理想情况应该是4个坑被填满,但是……
(, 下载次数: 74)
(, 下载次数: 79)
目测应该是随机的地点已有事件的话,不会过去,但也不会重新随机一个。
(, 下载次数: 76)
目前的克服方法是给每个事件一个单独的区域……但是如果能修改下脚本的话就更好了。

另外随机地点可能随机到主角所处的坐标。

作者: moy    时间: 2014-5-18 02:14
本帖最后由 moy 于 2014-5-18 02:20 编辑
888000 发表于 2014-5-17 22:28
还是有一些问题……
关于多个事件随机到同一地点……
为了增加重叠几率,4个事件4个坑,理想情况应该是4 ...


关于不重新随机,其实,我本来就没打算让他重新随机。。。。除非你每个事件都是堆在可视地图外的区域,只靠随机传进来,不然完全没有必要。。我既然设置了4个坑,为什么一开始一定要把事件放在坑外?让他先占一个,其他的随机去不就好了…没有必要非要在意在这4个坑的出现概率或者什么的吧。
毕竟只是“可能出现在其他位置”这样的初衷……而不是“有相同的概率出现在数个位置”这么精确吧?
非要循环的话,把31~33的
  1.       x,y = @region_map[region][rand(index)]
  2.       return x,y if events_xy(x, y).empty?
复制代码
换成

  1. return -1,-1 if index <= 0 #找遍位置都不行你还是留在原地吧- -b
  2. loc_map = @region_map[region].dup
  3. begin
  4.   loc_num = rand(index)
  5.   x,y = loc_map[loc_num]
  6. end while not events_xy(x, y).empty?
  7. loc_map.delete(loc_num)
  8. index -= 1
  9. return x,y
复制代码
单纯循环虽然方便,但是这样会造成频繁的从4个位置中挑那1个空位的事情,你知道那个位置在哪,但你就是得用四分之一的概率去蒙……所以我的解决办法是,复制那个数组,并在每次成功时删掉对应的点。
不过这样的代码我木有测试,会不会出现其他问题我不知道 。

至于随机转移可以出现在主角的位置我是知道的- -b,因为这个脚本我在用的时候只是为了怪物和宝箱或者某些物品位置的初始化,所以根本不需要考虑主角的坐标。反正我也不会在刚进图的时候就把主角扔到怪物或者宝箱头上
如果你真的非常介意。把上面的events_xy(x, y).empty?换成
[pre lang="ruby" line="1"]( events_xy(x,y).empty? && !$game_player.pos?(x,y) )[/pre]
就可以了。。。(虽然我觉得这是地图设计问题




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