赞 | 188 |
VIP | 627 |
好人卡 | 188 |
积分 | 95 |
经验 | 171230 |
最后登录 | 2023-6-18 |
在线时间 | 5073 小时 |
Lv4.逐梦者 (版主)
- 梦石
- 0
- 星屑
- 9467
- 在线时间
- 5073 小时
- 注册时间
- 2013-6-21
- 帖子
- 3580
|
发表于 2019-8-24 22:23:31
|
显示全部楼层
本帖最后由 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)
|
评分
-
查看全部评分
|