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

Project1

 找回密码
 注册会员
搜索
Project1 查看内容

随机生成地图

2006-1-3 00:00| 发布者: 柳柳| 查看: 14801| 评论: 0|原作者: 66RPG

摘要:    作者 原作者:日本 tonbi 完全汉化:66rpg bbschat  版本与更新 2006年1月  相关网址  点此进入讨论贴  范例工程  点击下载范例工程 (必须下载……) 脚本功
 

 作者

原作者:日本 tonbi

完全汉化:66rpg bbschat

 版本与更新

2006年1月

 相关网址

 点此进入讨论贴

 范例工程

 点击下载范例工程 (必须下载……)



脚本功能

来自:http://www.mc.ccnw.ne.jp/sarada/toshi/rgss.html

目前支持7种类型的地图随机绘制工具,大家再也不用为绘制迷宫地图而发愁了。

使用方法

设计模式运行游戏后关闭RMXP,再进入可以得到上次随机绘制的地图。(地图ID:999)

具体使用方法参见脚本注释,偶已经全部汉化了(bbschat: MS又改行做翻译的说)

总之是非常有实用价值的工具。

相关截图

 

 
 

 脚本内容


#
#     随机地图生成脚本 v0.80   by tonbi
#
#     汉化修改 66RPG bbschat(2006.1.2)
#
#     随机地图自动生成脚本。
#
#     ●使用方法  
#
#     首先,设定随机地图名称
#
#     地图名称请按照「XXXXX,随机,YYY,ZZZ」的样式来命名。
#     XXXXX 地图名,随便起自己喜欢的名字。
#     YYY   随机类型编号,参考样例。
#     ZZZ   障碍物数量,参考样例。
#
#     接下来,参考样例在地图上按照一定的规则画上地图元件
#     画的时候注意一下层。参考样例把地图元件画在对应的层上。
#
#     最后设定以下事件
#
#     中继点设定方法:
#     事件名称为「XXXXX,中继点」或事件执行内容的第一行加上「◆注释 : 中继点」。
#
#     随机地图将按照中继点事件产生随机道路,并按照事件ID顺序依次通过数个中继点
#    (当然肯定不是直线通过)
#     一般请在地图的两端设定中继点事件。
#     两个中继点之间请保留适当空间,少于5个地图元件的话就没有墙壁了。
#     不过就算没有中继点,也能生成随机地图。
#     增加中继点会减少墙壁的数量,所以不要太多,有几个中继点就可以了。
#     通常按照三角形的方位来设置3个中继点。
#
#     中继点以外的事件如果没有特别指定将随机放置在地图的道路上。
#
#     固定事件设定方法:
#     事件名称为「XXXXX,固定」或事件执行内容的第一行加上「◆注释 : 固定」。
#    
#     该事件将被放置在离该事件位置最近的道路上。
#
#     完全固定事件设定方法:
#     事件名称为「XXXXX,完全固定」或事件执行内容的第一行加上「◆注释 : 完全固定」
#
#     该事件位置将保持不变。
#     自动执行和并行处理的事件或者希望放在地图边缘方便查找的事件可以使用完全固定。
#
#     墙壁事件设定方法:
#     事件执行内容的第一行为「◆注释 : 壁设置」
#     该事件将随机出现在地图的墙壁上。
#     门,火把之类的事件专用。注释形式类似「壁设置,1」这样,后面要跟一个数字,
#     数字为了保证可以添加类似于[横幅]这样的事件。(横幅1元件为0,3个元件为1。)
#     这样的话就可以使用一些较大的事件了。
#
#     墙壁固定事件设定方法:
#     事件页第一行为「◆注释 : 壁设置固定」
#     这是同时具有上述固定事件和墙壁事件两个性质的事件。
#     也就是放置在离该事件位置最近的墙壁上的事件。
#     如果使用「壁设置固定,1」这种形式,也可以使用较大的事件。
#
#     还有使用之前请按照自己的需要设定下面的参数。

#========================================================================

#========================================================================
#★Clipping距离指定(搞不懂什么意思的话就不要改。)
class Game_Character
 
  DRAWRANGEX = 1920     # 地图角色的Sprite更新距离
  DRAWRANGEY = 1664     # 使用较大CharChip?时请适当增加。
                        # 指定的是X:15 Y:13乘128的数值。
                        # 上面是X坐标(横)下面是Y坐标(纵)。
end
                     
#========================================================================
#========================================================================
#★是否保存。(并不准备使用随机地图、只是为了节约制作时间。)
# 保存下来的地图可以复制到其他地方以节省制作时间。

class Game_Map
 
  AUTO_MAP_SAVE = true    # 是否保存为地图ID:999。
                          # true 保存 false 不保存
                         
                          # 游戏做完发布后请设定为false。
                         
end
                       

#-------------------------------------------------------------------
# ●Game_Temp
#--------------------------------------------------------------------

class Game_Temp
  alias initialize_tonbi1 initialize
  def initialize
    initialize_tonbi1
    $onscreen = []                        # Sprite是否画面内标志
  end
end


#--------------------------------------------------------------------------
# ● Game_Character
#--------------------------------------------------------------------------

class Game_Character
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  alias update_tonbi1 update
  def update
   
    # 画面上的位置
    sx = @real_x - $game_map.display_x - 1280
    sy = @real_y - $game_map.display_y - 960
    # 画面位置的绝对值
    abs_sx = sx > 0 ? sx : -sx
    abs_sy = sy > 0 ? sy-3 : -sy
     
    # 纵横坐标超出 DRAWRANGE 元件的情况下
    if abs_sx > DRAWRANGEX or abs_sy > DRAWRANGEY
      # Sprite不更新
      $onscreen[@id]=false
    else
      # Sprite更新
      $onscreen[@id]=true
    end
   
    update_tonbi1
  end
end

class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  attr_accessor :character_sprites
  def initialize
   
    $onscreen = []
    # 生成显示端口
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
   
    # 生成元件地图
    @tilemap = Tilemap.new(@viewport1)
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
    end
    @tilemap.map_data = $game_map.data
    @tilemap.priorities = $game_map.priorities

    # 生成远景平面
    @panorama = Plane.new(@viewport1)
    @panorama.z = -1000
   
    # 生成雾平面
    @fog = Plane.new(@viewport1)
    @fog.z = 3000
   
    #########################################################★改变
    # 角色活动块
    # 将Party和Event区分开。
    @character_sprites = []
    @party_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites[i]=sprite
      $onscreen[i] = true
    end
    @party_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    #########################################################
   
    # 生成天气
    @weather = RPG::Weather.new(@viewport1)
    # 生成图片
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
    # 生成计时器块
    @timer_sprite = Sprite_Timer.new
    # 刷新画面
    update
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    # 释放元件地图
    @tilemap.tileset.dispose
    for i in 0..6
      @tilemap.autotiles[i].dispose
    end
    @tilemap.dispose
    # 释放远景平面
    @panorama.dispose
    # 释放雾平面
    @fog.dispose
    ############################################################★改变
    # 释放角色活动块
    # nil 的话不释放
    for i in @character_sprites
      if i != nil
        i.dispose
      end
    end
    for i in @party_sprites
      if i != nil
        i.dispose
      end
    end
    ############################################################
    # 释放天候
    @weather.dispose
    # 释放图片
    for sprite in @picture_sprites
      sprite.dispose
    end
    # 释放计时器块
    @timer_sprite.dispose
    # 释放显示端口
    @viewport1.dispose
    @viewport2.dispose
    @viewport3.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 远景与现在的情况有差异发情况下
    if @panorama_name != $game_map.panorama_name or
       @panorama_hue != $game_map.panorama_hue
      @panorama_name = $game_map.panorama_name
      @panorama_hue = $game_map.panorama_hue
      if @panorama.bitmap != nil
        @panorama.bitmap.dispose
        @panorama.bitmap = nil
      end
      if @panorama_name != ""
        @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
      end
      Graphics.frame_reset
    end
    # 雾与现在的情况有差异的情况下
    if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
      @fog_name = $game_map.fog_name
      @fog_hue = $game_map.fog_hue
      if @fog.bitmap != nil
        @fog.bitmap.dispose
        @fog.bitmap = nil
      end
      if @fog_name != ""
        @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      end
      Graphics.frame_reset
    end
    # 刷新元件地图
    @tilemap.ox = $game_map.display_x / 4
    @tilemap.oy = $game_map.display_y / 4
    @tilemap.update
    # 刷新远景平面
    @panorama.ox = $game_map.display_x / 8
    @panorama.oy = $game_map.display_y / 8
    # 刷新雾平面
    @fog.zoom_x = $game_map.fog_zoom / 100.0
    @fog.zoom_y = $game_map.fog_zoom / 100.0
    @fog.opacity = $game_map.fog_opacity
    @fog.blend_type = $game_map.fog_blend_type
    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
    @fog.tone = $game_map.fog_tone
   
    #####################################################★改变
    # 刷新角色活动块
    # 画面外的角色活动块不更新
    for i in $game_map.events.keys
      if $onscreen[i]
        @character_sprites[i].update
      end
    end
    # 玩家角色更新
    for i in @party_sprites
      i.update
    end
   
    #####################################################
 
    # 刷新天候图形
    @weather.type = $game_screen.weather_type
    @weather.max = $game_screen.weather_max
    @weather.ox = $game_map.display_x / 4
    @weather.oy = $game_map.display_y / 4
    @weather.update
    # 刷新图片
    for sprite in @picture_sprites
      sprite.update
    end
    # 刷新计时器块
    @timer_sprite.update
    # 设置画面的色调与震动位置
    @viewport1.tone = $game_screen.tone
    @viewport1.ox = $game_screen.shake
    # 设置画面的闪烁色
    @viewport3.color = $game_screen.flash_color
    # 刷新显示端口
    @viewport1.update
    @viewport3.update
  end
end


#==============================================================================
# ■ Game_Map
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # ● 设置
  #     map_id : 地图 ID
  #--------------------------------------------------------------------------
  def setup(map_id)
    # 地图 ID 记录到 @map_id
    @map_id = map_id
    # 地图文件装载后、设置到 @map
    @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
    # 定义实例变量设置地图元件信息
    tileset = $data_tilesets[@map.tileset_id]
    @tileset_name = tileset.tileset_name
    @autotile_names = tileset.autotile_names
    @panorama_name = tileset.panorama_name
    @panorama_hue = tileset.panorama_hue
    @fog_name = tileset.fog_name
    @fog_hue = tileset.fog_hue
    @fog_opacity = tileset.fog_opacity
    @fog_blend_type = tileset.fog_blend_type
    @fog_zoom = tileset.fog_zoom
    @fog_sx = tileset.fog_sx
    @fog_sy = tileset.fog_sy
    @battleback_name = tileset.battleback_name
    @passages = tileset.passages
    @priorities = tileset.priorities
    @terrain_tags = tileset.terrain_tags
    # 初始化显示坐标
    @display_x = 0
    @display_y = 0
   
    check_special_map #★检查随机地图
   
    # 清除刷新要求标志
    @need_refresh = false
    # 设置地图事件数据
    @events = {}
    for i in @map.events.keys
      @events[i] = Game_Event.new(@map_id, @map.events[i])
    end
    # 设置公共事件数据
    @common_events = {}
    for i in 1...$data_common_events.size
      @common_events[i] = Game_CommonEvent.new(i)
    end
    # 初始化雾的各种信息
    @fog_ox = 0
    @fog_oy = 0
    @fog_tone = Tone.new(0, 0, 0, 0)
    @fog_tone_target = Tone.new(0, 0, 0, 0)
    @fog_tone_duration = 0
    @fog_opacity_duration = 0
    @fog_opacity_target = 0
    # 初始化滚动信息
    @scroll_direction = 2
    @scroll_rest = 0
    @scroll_speed = 4
  end
 
  #--------------------------------------------------------------------------
  # ● 紧接读入地图之后的处理
  #--------------------------------------------------------------------------
  def check_special_map
    # 取得地图名称
    mapinfo  = load_data("Data/MapInfos.rxdata")
   
    # 地图名称包含“随机”的场合
    if mapinfo[@map_id].subname == "随机"
      if mapinfo[@map_id].subname(3)=="" or mapinfo[@map_id].subname(3) == nil
        p3 = 0
      else
        p3 = mapinfo[@map_id].subname(3).to_i
      end
      if mapinfo[@map_id].subname(4)=="false"
        p4 = false
      end
     
      make_random_map(2,mapinfo[@map_id].subname(2).to_i,p3,p4)
    end
  end
 
  #--------------------------------------------------------------------------
  # ● 生成随机地图
  #     wall = 墙壁的高 >> 现在无效
  #     type = 墙壁制作类型 >> 0以外没制作(汗 指定方法也未定) (<-- bbschat注:汗~原来日本人也会用汗)
  #     thoughplayer = 玩家在中继点中包含吗?
  #     connect = 中继点的连接方法 >> true=连续 false=2个各自独立
  #
  #     ※所有参数全部省略   可以使用下面的例子
  #     ex. make_random_map(2,0,,true)
  #--------------------------------------------------------------------------
  def make_random_map(wall = 2, type = 0, objcnt = 0, connect = true)
   
    # 非法参数处理
    wall = 0 if wall == nil
    type = 0 if type == nil
    objcnt = 0 if objcnt == nil
    unless objcnt.is_a?(Numeric)
      objcnt = 0
    end
    if objcnt < 0
      objcnt = 0
    end
    connect = true if connect != false
   
    # 高度数据表
    @heightdata = Table.new(@map.width,@map.height)
    # 地形数据表
    @maskdata = Table.new(@map.width,@map.height)
    # 事件数据表
    @oneventdata = Table.new(@map.width,@map.height)
    # 遮照设定数组
    @masksetting = []
    # 制作方法数组
    @makedata = []
   
    # 演算方法初始化
    @targettype=0
    @chgtype=0
   
    time = -1
    # 数据初始化
    for i in [email protected]
      for j in [email protected]
        time += 1
        if time%2000 == 0
          Graphics.update
        end
        @heightdata[i,j] = 0
        @maskdata[i,j] = 0
      end
    end
    for i in 0...100
      @masksetting[i] = true
    end
   
    # 取得中继点情报
    needposx = []
    needposy = []
    # 增加中继点事件
    for i in @map.events.keys.sort
      time += 1
      if time%200 == 0
        Graphics.update
      end
      if event_settype(i) == 1
        if connect == true
          needposx.push(@map.events[i].x)
          needposy.push(@map.events[i].y)
          needposx.push(@map.events[i].x)
          needposy.push(@map.events[i].y)
        else
          needposx.push(@map.events[i].x)
          needposy.push(@map.events[i].y)
        end
      end
    end
    if connect == true
      needposx.shift
      needposy.shift
    end
    loop do
      if needposx.size <= 2
        needposx.push(rand(@map.width))
        needposy.push(rand(@map.height))
      else
        break
      end
    end
   
    # 这里设定制作方法数组
    case type
    when 0
      # 类型0 >> 2层自然类型
      @makedata.push([0,1,0])
      @makedata.push([5,1])
      for i in 0...(needposx.size/2)
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
        @makedata.push([3,0,-15,4,0])
        @makedata.push([1,1,1,1,1])
        @makedata.push([6,0,needposx[i*2],needposy[i*2]])
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]])
      end
     
      @makedata.push([4,0,1,1,1])
      @makedata.push([4,0,1,1,1])
      @makedata.push([4,1,1,1,1])
     
      @makedata.push([0,0,0])
      @makedata.push([2,0,2])
      @makedata.push([5,0])
      @makedata.push([2,1,2])
      @makedata.push([5,1])
    when 1
      # 类型1 >> 2层人工类型
      @makedata.push([0,1,0])
      @makedata.push([5,1])
      for i in 0...(needposx.size/2)
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
        @makedata.push([3,0,-6,4,1,10])
        @makedata.push([1,1,1,1,1])
        @makedata.push([6,0,needposx[i*2],needposy[i*2]])
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]])
      end
     
      @makedata.push([4,0,2,3,1])
      @makedata.push([4,1,2,2,1])
      @makedata.push([4,0,1,1,1])
     
      @makedata.push([0,0,0])
      @makedata.push([2,0,2])
      @makedata.push([5,0])
      @makedata.push([2,1,2])
      @makedata.push([5,1])
    when 2
      # 类型2 >> 2层自然凸类型
      @makedata.push([0,1,0])
      @makedata.push([5,1])
      for i in 0...(needposx.size/2)
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
        @makedata.push([3,0,-15,4,0])
        @makedata.push([1,1,1,1,1])
        @makedata.push([6,0,needposx[i*2],needposy[i*2]])
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]])
      end
     
      @makedata.push([4,0,2,2,1])
      @makedata.push([4,1,1,1,1])
     
      @makedata.push([0,0,0])
      @makedata.push([2,0,2])
      @makedata.push([5,0])
      @makedata.push([2,1,2])
      @makedata.push([5,-1])
    when 3
      # 类型3 >> 2层人工凸类型
      @makedata.push([0,1,0])
      @makedata.push([5,1])
      for i in 0...(needposx.size/2)
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
        @makedata.push([3,0,-15,4,1,10])
        @makedata.push([1,1,1,1,1])
        @makedata.push([6,0,needposx[i*2],needposy[i*2]])
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]])
      end
     
      @makedata.push([4,0,2,2,1])
      @makedata.push([4,1,1,1,1])
     
      @makedata.push([0,0,0])
      @makedata.push([2,0,2])
      @makedata.push([5,0])
      @makedata.push([2,1,2])
      @makedata.push([5,-1])
    when 4
      # 类型4 >> 2层自然类型 之一
      # 地形[0:洞 1:地面 2:墙壁]
     
      # 基本设定
      @makedata.push([0,1,0])
      @makedata.push([5,0])
      # 放置墙
      @makedata.push([1,0,0,-1,0])
      @makedata.push([3,2,-6,1,0])
      @makedata.push([1,-1,0,-1,-1])
      @makedata.push([3,2,-6,1,0])
      @makedata.push([1,-1,-1,0,-1])
      @makedata.push([3,2,-6,1,0])
      @makedata.push([1,0,-1,0,0])
      @makedata.push([3,2,-6,1,0])
      @makedata.push([4,2,2,2,1])
      # 随机放置洞
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40))
        @makedata.push([1,3,3,8,8])
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5])
      end
      # 生成周围的墙
      @makedata.push([7,2])
      @makedata.push([4,2,1,1,1])
      # 生成道路
      for i in 0...(needposx.size/2)
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
        @makedata.push([3,1,-8,4,0,5])
        @makedata.push([1,1,1,1,1])
        @makedata.push([6,1,needposx[i*2],needposy[i*2]])
        @

7

鲜花

刚表态过的朋友 (7 人)

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