66RPG
本站首页
制作教程
文章作品
制作素材
原创游戏区
周边下载
本站论坛
 ※ 站内搜索
栏 目:
方 式:
关键词:
  
 ※ 教程分类
 RMXP 图文教学
 初级教学
 中级教学
 高级教学
 个人创意与研究
 RMXP 录像教学
 新人入门录像
 零散录像教学
 商业素材使用录像 ★
 周边教学
 美工 与 音乐
 RMXP 脚本发布
 游戏系统修改
 地图效果类
 战斗系统相关
 全新系统类
 API与高难度类
 RMVX 制作教学
 RMVX 初级教学
 RMVX 中级教程
 RMVX 高级教程
 RMVX 综合制作展
 ※ 无图目录 (按点击量横排序)


-- 66RPG全内容文字目录 --


 ※ 近期特色教学
我要造房子!修改地图元件 ( 66RPG, RPG MAKER XP教程 )
 本站首页→制作教程→地图效果类

我要造房子!修改地图元件


教程作者:yangff
首发网址:点此进入本教学的原始帖
适宜用户:比如暴风的龙

 教学正文:

2008年6.1更新发现:
RMXP的数据库实际支持宽度,高度〉500的地图,只是编辑器作了限制。
使用newmap可以建立宽度,高度〉500的地图
但是系统自动为他们涂上背景,要循环500*500次,所以很正常的失败了 {/hx}
2008年6.1再次更新
to:暴风龙,错误修正了 
范例更新:
http://bbs.66rpg.com/upload_program/files/Save_Map!Yes!_92755880.rar

冲突较大
如:
四处留情(一个改事件,一个改地图,能不冲突吗?)
股票(债券系统)
(涉及
Scene_Load
Scene_Save
修改)
本脚本用处:
    比如您想在地图的2*2到5*5的地方造一个房子,一般只能用事件.很卡.
使用这个脚本只需要:
                  edit(mapid,x,y,lv,dat)
就可以修改任意地图,id的任意层的地图元件。
使用本脚本可以延伸出事件的修改//
使用方法:
         edit(mapid,x,y,lv,dat)
         实现:修改某个地图的某一格
         使用:
             mapid:要修改的地图id
             x,y,lv:要修改的x,y,层(0、1、2)
             dat:要替换的内容,不支持自动元件,从384开始
         editbymap(mapid,x,y,mapid1,x1,y1,w1,h1)
         实现:edit功能只能一格一格修改,不方便。
               这个程序可以从其他地图拷贝一块到当前地图。
         使用:
               mapid:要修改的地图id
               x,y:要修改的地图的x,y
               mapid1:地图库
               x1,y1,w1,h1:从x1,y1开始复制大小为w1,h1的地图元件到mapid的x,y
newmap(h,w,tileset)
         实现:创建新地图
         使用:
             h,w:新地图大小
             tileset:地图所使用图块的 ID。

脚本内容:

]#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
#  处理读档画面的类。
#==============================================================================

class Scene_Load < Scene_File
  #--------------------------------------------------------------------------
  # ● 读取存档数据
  #     file : 读取用文件对像 (已经打开)
  #--------------------------------------------------------------------------
  def read_save_data(file)
    # 读取描绘存档文件用的角色数据
    characters = Marshal.load(file)
    # 读取测量游戏时间用画面计数
    Graphics.frame_count = Marshal.load(file)
    # 读取各种游戏对像
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables     = Marshal.load(file)
    $game_self_switches = Marshal.load(file)
    $game_screen        = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party         = Marshal.load(file)
    $game_troop         = Marshal.load(file)
    $mapdat             = Marshal.load(file)
    $game_map           = Marshal.load(file)
    $game_player        = Marshal.load(file)
    # 魔法编号与保存时有差异的情况下
    # (加入编辑器的编辑过的数据)
    if $game_system.magic_number != $data_system.magic_number
      # 重新装载地图
      $game_map.setup($game_map.map_id)
      $game_player.center($game_player.x, $game_player.y)
    end
    # 刷新同伴成员
    $game_party.refresh
  end
end
#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
#  处理标题画面的类。
#==============================================================================

class Scene_Title
  #--------------------------------------------------------------------------
  # ● 命令 : 新游戏
  #--------------------------------------------------------------------------
  def command_new_game
    # 演奏确定 SE
    $game_system.se_play($data_system.decision_se)
    # 停止 BGM
    Audio.bgm_stop
    # 重置测量游戏时间用的画面计数器
    Graphics.frame_count = 0
    # 生成各种游戏对像
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $mapdat = []
    for i in 1...1000
      file = sprintf("Data/Map%03d.rxdata", i)
      if FileTest.exist?(file)
        $mapdat.push(load_data(sprintf("Data/Map%03d.rxdata", i)))
      end
    end
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
    # 设置初期同伴位置
    $game_party.setup_starting_members
    # 设置初期位置的地图
    $game_map.setup($data_system.start_map_id)
    # 主角向初期位置移动
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    # 刷新主角
    $game_player.refresh
    # 执行地图设置的 BGM 与 BGS 的自动切换
    $game_map.autoplay
    # 刷新地图 (执行并行事件)
    $game_map.update
    # 切换地图画面
    $scene = Scene_Map.new
  end
end
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  处理地图的类。包含卷动以及可以通行的判断功能。
# 本类的实例请参考 $game_map 。
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # ● 设置
  #     map_id : 地图 ID
  #--------------------------------------------------------------------------
  def setup(map_id)
    # 地图 ID 记录到 @map_id
    @map_id = map_id
    # 地图文件装载后、设置到 @map
    @map = $mapdat[@map_id-1]#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
    # 清除刷新要求标志
    @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
  #--------------------------------------------------------------------------
  # ● 刷新2
  #--------------------------------------------------------------------------
  def refresh2
    @map = $mapdat[@map_id-1]#load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  end 
end
#==============================================================================
# ■ Scene_Save
#------------------------------------------------------------------------------
#  处理存档画面的类。
#==============================================================================

class Scene_Save < Scene_File
  def write_save_data(file)
    # 生成描绘存档文件用的角色图形
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      characters.push([actor.character_name, actor.character_hue])
    end
    # 写入描绘存档文件用的角色数据
    Marshal.dump(characters, file)
    # 写入测量游戏时间用画面计数
    Marshal.dump(Graphics.frame_count, file)
    # 增加 1 次存档次数
    $game_system.save_count += 1
    # 保存魔法编号
    # (将编辑器保存的值以随机值替换)
    $game_system.magic_number = $data_system.magic_number
    # 写入各种游戏对像
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_troop, file)
    Marshal.dump($mapdat, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_player, file)
  end
end

[HTML]def edit(mapid,x,y,lv,dat) #lv=0,1,2
  $mapdat[mapid-1].data[x,y,lv] = dat
  upmap
end
def editbymap(mapid,x,y,mapid1,x1,y1,w1,h1) #lv=0,1,2
  #$mapdat[mapid-1].data[x,y,lv] = dat
  x3 = x
  for y2 in x1..h1+(x1-1)
    for x2 in y1..w1+(y1-1)
      $mapdat[mapid-1].data[x3,y,0] = $mapdat[mapid1-1].data[x2,y2,0]
      $mapdat[mapid-1].data[x3,y,1] = $mapdat[mapid1-1].data[x2,y2,1]
      $mapdat[mapid-1].data[x3,y,2] = $mapdat[mapid1-1].data[x2,y2,2]
      x3 = x3+1
    end
    y = y+1
    x3 = x
  end
  upmap
end
def newmap(h,w,tileset)
  $mapdat.push(RPG::Map.new(w,h))
#  $mapdat.height = h
#  $mapdat.width = w
#  $mapdat.data = Table.new(h,w,3)
for x in 0..w
  for y in 0..h
  edit($mapdat.size,x,y,0,384)
end
end
  return $mapdat.size
  upmap
end
def upmap
  $game_map.refresh2
  $game_map.update
end

截图怎么截捏?
使用草原地图时的范例
for i in 0..4
edit(1,2,2+i,1,488+(i*8))
edit(1,3,2+i,1,489+(i*8))
edit(1,4,2+i,1,490+(i*8))
edit(1,5,2+i,1,491+(i*8))
edit(1,6,2+i,1,492+(i*8))
end

 教学相关RGSS类/函数:

Scene_Load
Scene_Save
Scene_Title
Game_Map


关键字:

发布日期:2008-6-29 12:44:33 点击量:7041


 上一篇:正则表达式
 下一篇:秀秀RM脚本教程第一章
关于我们
支援本站
友情连接
站点目录
站内搜索



WWW.66RPG.COM,2005-2013 ^o^

备案序号:京ICP备05035415号



 
Web www.66rpg.com bbs.66rpg.com