赞 189
VIP 627
好人卡 188
积分 95
经验 171230
最后登录 2024-7-3
在线时间 5073 小时
Lv4.逐梦者 (版主 )
梦石 0
星屑 9532
在线时间 5073 小时
注册时间 2013-6-21
帖子 3580
本帖最后由 RyanBern 于 2019-8-25 09:38 编辑
我来给一个直观的实现办法。在不改编辑器的条件下我的这个办法还算比较直观。
主要原理就是将需要设置区域的地图额外复制一张,然后在新地图的第三层加铺代表“区域ID”的图块。
然后使用某种办法将原地图和新地图关联起来,使得新地图成为原地图的“区域ID层”。由于设计区域一般来讲只需要地图场景大致轮廓就可以,因此单独拿出来一个图层作为设置区域问题不大。
主要步骤:
1. 首先使用 PS 等工具(或用程序生成)在原图块的基础上创建一个新图块素材,在新图块素材的末尾绘制表示区域 ID 的图块,比方说我
改造的 001-Grassland01 图块就素材是下面这样的:
2. 在数据库中将原图块数据复制一份,新复制的图块数据的素材改为改造后的图块素材。例如在下图中我的新素材命名为 001-Grassland01-r
注:这一步也可以简化成用新图块素材覆盖原图块素材,之后不用在数据库新建。由于表示区域 ID 的图块是在最后面添加的,将素材扩大对原有数据库以及地图是不会造成影响的。
3. 将需要标区域的地图复制一份,然后在地图结构中放入下一层级。例如在下图中,MAP001 是原始地图,Mask 是新复制的地图。注意新复制的地图在原始地图层级下面。这一步实际上是将原始图和区域ID图关联起来了。最后将新地图使用的图块改为含区域ID素材的图块。
4. 在区域 ID 图的第三层进行编辑。
由于区域 ID 图和原始图的前两层完全一样,这样就是相当于可视化编辑了。
5. 接下来就是写脚本来获取区域 ID 了,1-4 的步骤仅仅是设置步。要让游戏真正识别你的区域 ID 还是需要脚本的帮助。比方说我就写了这个脚本:
module RB
end
module RB::Region
Mask_Name = "Mask"
Max_Regions = 64
def self .create_region_png ( max_id = 64 )
back_color = Color.new ( 128 , 128 , 128 , 128 )
front_color = Color.new ( 255 , 255 , 255 , 128 )
width = 32 * 8
height = max_id / 8 * 32
bitmap = Bitmap.new ( width, height)
bitmap.fill_rect ( 0 , 0 , width, height, back_color)
bitmap.font .size = 32
bitmap.font .color = front_color
bitmap.font .bold = true
max_id.times do |id|
x = id % 8 * 32
y = id / 8 * 32
bitmap.draw_text ( x, y, 32 , 32 , id.to_s , 1 )
end
filename = "Graphics/Tilesets/region_id_#{max_id}.png"
bitmap.save_as_png ( filename)
bitmap.dispose
end
def self .append_region_png ( tileset_filename, region_filename)
basename = File .basename ( tileset_filename, ".png" )
bitmap_tileset = Bitmap.new ( "Graphics/Tilesets/#{tileset_filename}" )
bitmap_region = Bitmap.new ( "Graphics/Tilesets/#{region_filename}" )
bitmap_out = Bitmap.new ( bitmap_tileset.width , bitmap_tileset.height + bitmap_region.height )
bitmap_out.blt ( 0 , 0 , bitmap_tileset, Rect.new ( 0 , 0 , bitmap_tileset.width , bitmap_tileset.height ) )
bitmap_out.blt ( 0 , bitmap_tileset.height , bitmap_region, Rect.new ( 0 , 0 , bitmap_region.width , bitmap_region.height ) )
bitmap_out.save_as_png ( "Graphics/Tilesets/#{basename}_r.png" )
bitmap_out.dispose
bitmap_tileset.dispose
bitmap_region.dispose
end
end
class Scene_Title
alias rb_main_20190824 main
def main
mapinfos = load_data( "Data/MapInfos.rxdata" )
$region_masks = { }
mapinfos.each_pair do |i, info|
if info.name == RB::Region::Mask_Name
$region_masks [ info.parent_id ] = i
end
end
rb_main_20190824
end
end
class Game_Map
alias rb_setup_20190824 setup
def setup( map_id)
@mask_id = $region_masks [ map_id]
@mask = nil
if @mask_id != nil
@mask = load_data( sprintf ( "Data/Map%03d.rxdata" , @mask_id ) )
mask_tileset_bmp = RPG::Cache .tileset ( $data_tilesets[ @mask.tileset_id ] .tileset_name )
@num_tiles = ( mask_tileset_bmp.width ) / 32 * ( mask_tileset_bmp.height / 32 )
end
rb_setup_20190824( map_id)
end
def region_id( x, y)
if @mask == nil
return -1
end
tile_id = @mask .data [ x, y, 2 ]
return [ -1 , tile_id - 384 - ( @num_tiles - RB::Region::Max_Regions ) ] .max
end
end
class Game_Character
def region_id
return $game_map .region_id ( @x, @y )
end
end
module RB
end
module RB::Region
Mask_Name = "Mask"
Max_Regions = 64
def self .create_region_png ( max_id = 64 )
back_color = Color.new ( 128 , 128 , 128 , 128 )
front_color = Color.new ( 255 , 255 , 255 , 128 )
width = 32 * 8
height = max_id / 8 * 32
bitmap = Bitmap.new ( width, height)
bitmap.fill_rect ( 0 , 0 , width, height, back_color)
bitmap.font .size = 32
bitmap.font .color = front_color
bitmap.font .bold = true
max_id.times do |id|
x = id % 8 * 32
y = id / 8 * 32
bitmap.draw_text ( x, y, 32 , 32 , id.to_s , 1 )
end
filename = "Graphics/Tilesets/region_id_#{max_id}.png"
bitmap.save_as_png ( filename)
bitmap.dispose
end
def self .append_region_png ( tileset_filename, region_filename)
basename = File .basename ( tileset_filename, ".png" )
bitmap_tileset = Bitmap.new ( "Graphics/Tilesets/#{tileset_filename}" )
bitmap_region = Bitmap.new ( "Graphics/Tilesets/#{region_filename}" )
bitmap_out = Bitmap.new ( bitmap_tileset.width , bitmap_tileset.height + bitmap_region.height )
bitmap_out.blt ( 0 , 0 , bitmap_tileset, Rect.new ( 0 , 0 , bitmap_tileset.width , bitmap_tileset.height ) )
bitmap_out.blt ( 0 , bitmap_tileset.height , bitmap_region, Rect.new ( 0 , 0 , bitmap_region.width , bitmap_region.height ) )
bitmap_out.save_as_png ( "Graphics/Tilesets/#{basename}_r.png" )
bitmap_out.dispose
bitmap_tileset.dispose
bitmap_region.dispose
end
end
class Scene_Title
alias rb_main_20190824 main
def main
mapinfos = load_data( "Data/MapInfos.rxdata" )
$region_masks = { }
mapinfos.each_pair do |i, info|
if info.name == RB::Region::Mask_Name
$region_masks [ info.parent_id ] = i
end
end
rb_main_20190824
end
end
class Game_Map
alias rb_setup_20190824 setup
def setup( map_id)
@mask_id = $region_masks [ map_id]
@mask = nil
if @mask_id != nil
@mask = load_data( sprintf ( "Data/Map%03d.rxdata" , @mask_id ) )
mask_tileset_bmp = RPG::Cache .tileset ( $data_tilesets[ @mask.tileset_id ] .tileset_name )
@num_tiles = ( mask_tileset_bmp.width ) / 32 * ( mask_tileset_bmp.height / 32 )
end
rb_setup_20190824( map_id)
end
def region_id( x, y)
if @mask == nil
return -1
end
tile_id = @mask .data [ x, y, 2 ]
return [ -1 , tile_id - 384 - ( @num_tiles - RB::Region::Max_Regions ) ] .max
end
end
class Game_Character
def region_id
return $game_map .region_id ( @x, @y )
end
end
这个脚本的意思是说,如果一个正常地图的下一级有一个名为 Mask 的地图,那么这个地图就是原始地图的区域图。脚本会根据区域图的图块信息来自动对应出原地图的区域 ID。在游戏其他地方我们马上就可以使用下面的脚本来获取区域 ID 相关信息:
$game_map .region_id ( x, y) # 获取坐标为 (x, y) 的区域 ID
$game_player .region_id # 获取主角当前坐标的区域 ID
$game_map .region_id ( x, y) # 获取坐标为 (x, y) 的区域 ID
$game_player .region_id # 获取主角当前坐标的区域 ID
有了这个接口之后就可以利用这个区域 ID 做很多东西了。例如根据区域不同设置敌人等。这里不再赘述。
此实现的缺点:
1. 需要额外使用一张地图来表示区域,如果地图很多是一种浪费。
2. 当原地图发生改动时,无法在其对应区域地图上进行同步。
3. 需要拼接图块等素材方面的操作(但这个操作可以用程序完成)
附一个范例。这个范例除了能实现上述功能以外,还附赠了自动生成图块素材的功能。
# 生成一个纯区域 ID 的素材,存放在 Graphics/Tilesets 文件夹下,64 表示区域 ID 总共 64 种
RB::Region .create_region_png ( 64 )
# 将纯区域 ID 素材拼接到地图图块素材后面
RB::Region .append_region_png ( "001-Grassland01.png" , "region_id_64.png" )
# 生成一个纯区域 ID 的素材,存放在 Graphics/Tilesets 文件夹下,64 表示区域 ID 总共 64 种
RB::Region .create_region_png ( 64 )
# 将纯区域 ID 素材拼接到地图图块素材后面
RB::Region .append_region_png ( "001-Grassland01.png" , "region_id_64.png" )
Region.7z
(1.09 MB, 下载次数: 73)
评分
查看全部评分