加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 灯笼菜刀王 于 2024-8-28 10:30 编辑
将将将, 新版本来了,
因为上一个版本会造成大量垃圾图块干扰画图, 于是改了一下实现方法, 不需要你自己铺展开的自动图块啦, 绿色健康无污染XD,改进了下保存方式, 现在只要加载一次地图就可以了,不用每次都要加载啦
使用方法, 把脚本塞到main前, 然后在脚本前面的设置区里按
数据库图块ID=>{笔刷图块ID=>"自动图块名字", 第二个笔刷图块ID=>"自动图块名字", #(需要换行就在逗号处换行)
第三个笔刷图块ID=>"自动图块名字"},
第二个数据库图块ID=>{笔刷图块ID=>"自动图块名字", 第二个笔刷图块ID=>"自动图块名字",第三个笔刷图块ID=>"自动图块名字"},
方式备注即可, 注意都要用半角符号,也就是英文符号, 自动图块名称要用半角的双引号圈起来, 需要换行的话在逗号处换行, 最末尾的半角逗号别忘记了!
例子: 1=>{2=>"007-G_Undulation01",3=>"047-Flower01"},
这样设置是把数据库第一个图块组(草原)里的第二个图块(单片叶子)设置成土坎自动图块的笔刷, 第三个图块(五片叶子)设置成花坛自动图块的笔刷
然后, 在编辑器用设置好的对应"笔刷图块" 画图(单片叶子和五片叶子就是"笔刷图块")
实际运行时,"笔刷图块"就会替换成对应的自动图块了, 自动图块的优先度,通行,茂盛等设置和"笔刷图块"一致
每组图块添加的自动图块理论上可以无限, 然而在同一组里添加太多自动图块可能会导致拖慢, 所以,还请自重
注意: 使用本脚本, 自动图块不会有动态效果, 也不能用SHIFT画法, 限制还是蛮多的
2.1版新增, 镶套效果, 即像原版沙漠图块里, 18,19,20号自动图块可以在同一图层镶套使用, 后者视为与前者是同一组图块
镶套方法, 在笔刷关联的自动图块名称后面加上 <n ,表示自动图块会镶套到n号笔刷的图块里, 栗子: {2=>"019-Sa_Grass02",3=>"020-Sa_Grass03<2"} #这样020的自动图块就会镶套到019的自动图块内
这是脚本, 塞到main前
#====================================================================== # 自动图块扩展 2.0 By 灯笼菜刀王 # # 使用方法 : 在 AUTO 里备注好要当自动图块标志的图块ID后(从0开始数) # 用该图块画地图,进游戏后就会按自动图块的规则调用对应的自动图块 # # 备注例子: 数据库图块ID=>{2=>"自动图块名称",3=>"自动图块名字"} # 如果在自动图块名称里加上 <n ;表示该图块可以镶套到n号笔刷内使用 #====================================================================== class Game_Map AUTO={ #↓↓在这里标记好笔刷图块对应的自动图块名称(注意符号都要半角)↓↓ #---------------------------------------------------------------------- 1=>{2=>"019-Sa_Grass02",3=>"020-Sa_Grass03<2",4=>"019-Sa_Grass02<3"}, #------------------------------------------------------------------------ } ; alias old_setup setup def setup(map_id) ; old_setup(map_id) ;map_auto_set ;end def auto2?(id) return $game_temp.au[@tileset_name].find{|i| id == i[0] or ((a=(id - i[1])) > -1 and a < 48)} end def same?(n,od,id) return n if id.nil? return 0 if od[1].nil? return n if id == od[0] return n if ((a=(id - od[1])) > -1 and a < 48) return 0 if od[2].nil? return same?(n,od[2,od.size],id) end def tile_push_auto(ah) rf = [] ; au = [] ;cu = [] ;ah.each{|i| a = i[1].sub(/\<(\d+)/,"") ;cu.push([$1.to_i + 384,i[0]+384]) if $1 != nil ; au.push([i[0] + 384]) ;rf.push(RPG::Cache.autotile(a))} b = Bitmap.new("Graphics/Tilesets/#{@tileset_name}") ;lh = b.height bit = Bitmap.new(256,rf.size * 192 + lh) bit.bb(0,0,b) ;a = 0 for i in rf bit.draw_autotile(i,lh) ;au[a][1] = lh / 32 * 8 + 384 ; n = au[a][0] ; lh += 192 ;a += 1 pa = @passages.xsize ;@passages.resize(pa + 48) #通行度 pr = @priorities.xsize ;@priorities.resize(pr + 48) #优先级 pt = @terrain_tags.xsize ;@terrain_tags.resize(pt + 48) #地形标志 48.times do |j| @priorities[pr + j] = @priorities[n] @passages[pa + j] = @passages[n] @terrain_tags[pt + j] = @terrain_tags[n] end end for i in cu #[in,self] next if (a = au.find_index{|j| j[0] == i[0]}).nil? next if (b = au.find{|j| j[0] == i[1]}).nil? au[a] += b[0,2] end $game_temp.tiles_push(@tileset_name,bit,au) end def map_auto_set return if (ah=AUTO[@map.tileset_id]).nil? $game_temp.au ||= {} tile_push_auto(ah) if $game_temp.au[@tileset_name].nil? f = self.data for pag in [0,1,2] for x in 0...f.xsize for y in 0...f.ysize next if (od = auto2?(f[x,y,pag])).nil? g = [[x,y+1,8],[x+1,y,4],[x,y-1,2],[x-1,y,1]] ;b = 0 g.each{|i| b += same?(i[2],od,f[i[0],i[1],pag])} g = [[x-1,y+1,8],[x+1,y+1,4],[x+1,y-1,2],[x-1,y-1,1]] ;c = 0 g.each{|i| c += same?(i[2],od,f[i[0],i[1],pag])} f[x,y,pag] = get_autotile(b,c) + od[1] end end end end def get_autotile(b, c) #获取自动元件ID By guoxiaomi (P1) case b ; when 0b1111 ; 15 - c when 0b1110 ; 19 - (c / 2) % 4 when 0b1101 ; 23 - (c / 4) % 4 when 0b1011 ; 27 - c / 8 - (c * 2) % 4 when 0b0111 ; 31 - c % 4 when 0b1010 ; 32 when 0b0101 ; 33 when 0b1100 ; 35 - (c / 4) % 2 when 0b1001 ; 37 - c / 8 when 0b0011 ; 39 - c % 2 when 0b0110 ; 41 - (c / 2) % 2 when 0b1000 then 42 when 0b0100 then 43 when 0b0010 then 44 when 0b0001 then 45 when 0b0000 then 46 end end end class Bitmap def bb(x,y,name,rx=0,ry=0,rw=nil,rh=nil,o=255,zmx=1.0,zmy=1.0) if name.nil? or name == "" a,b = rw || self.width,rh || self.height fill_rect(x,y,a,b,Color.new(0,0,0,0)) ; return [a,b] end if zmx != 1.0 or zmy != 1.0 c,d = rw||name.width,rh||name.height a = zmx.f? ? c * zmx : zmx ; b = zmy.f? ? d * zmy : zmy stretch_blt(Rect.new(x,y,a,b),name,Rect.new(rx,ry,c,d),o) else a,b = rw || name.width, rh || name.height blt(x,y,name,Rect.new(rx,ry,a,b),o) end ; return [a,b] #返回宽和高 end def draw_autotile(ait,ey) dk={ #绘制, id=>[左上,右上,左下,右下] 0=>[26,27,32,33], 1=>[4,27,32,33], 2=>[26,5,32,33], 3=>[4,5,32,33], 4=>[26,27,32,11], 5=>[4,27,32,11], 6=>[26,5,32,11], 7=>[4,5,32,11], 8=>[26,27,10,33], 9=>[4,27,10,33], 10=>[26,5,10,33], 11=>[4,5,10,33], 12=>[26,27,10,11], 13=>[4,27,10,11], 14=>[26,5,10,11], 15=>[4,5,10,11], 16=>[24,25,30,31], 17=>[24,5,30,31], 18=>[24,25,30,11], 19=>[24,5,30,11], 20=>[14,15,20,21], 21=>[14,15,20,11], 22=>[14,15,10,21], 23=>[14,15,10,11], 24=>[28,29,34,35], 25=>[28,29,10,35], 26=>[4,29,34,35], 27=>[4,29,10,35], 28=>[26,27,44,45], 29=>[4,39,44,45], 30=>[38,5,44,45], 31=>[4,5,44,45], 32=>[24,29,30,35], 33=>[14,15,44,45], 34=>[12,13,18,19], 35=>[12,13,18,11], 36=>[16,17,22,23], 37=>[16,17,10,23], 38=>[40,41,46,47], 39=>[4,41,46,47], 40=>[36,37,42,43], 41=>[36,5,42,43], 42=>[12,17,18,23], 43=>[12,13,42,43], 44=>[36,41,42,47], 45=>[16,17,46,47], 46=>[12,17,42,47], 47=>[12,17,42,47]} uf = [[0,0],[16,0],[0,16],[16,16]] 48.times do |i| x,y = i % 8 * 32, i / 8 * 32 + ey; af = dk[i] 4.times do |j| f = uf[j] ; a,b = af[j] % 6 * 16, af[j] / 6 * 16 self.bb(x + f[0],y + f[1],ait,a,b,16,16) end end ;ait.dispose end end class Array def find_index a = 0 ;self.each{|i| return a if yield i ;a += 1} ;return nil end end module RPG module Cache def self.tileset(filename) if (r=$game_temp.tiles_save) != nil and r[filename] != nil ; return r[filename].dup ;end self.load_bitmap("Graphics/Tilesets/", filename) end end end class Game_Temp attr_accessor :au,:tiles_save def tiles_push(name,bit,f) @tiles_save ||= {} ;@tiles_save[name] = bit @au ||= {} ;@au[name] = f end end
#======================================================================
# 自动图块扩展 2.0 By 灯笼菜刀王
#
# 使用方法 : 在 AUTO 里备注好要当自动图块标志的图块ID后(从0开始数)
# 用该图块画地图,进游戏后就会按自动图块的规则调用对应的自动图块
#
# 备注例子: 数据库图块ID=>{2=>"自动图块名称",3=>"自动图块名字"}
# 如果在自动图块名称里加上 <n ;表示该图块可以镶套到n号笔刷内使用
#======================================================================
class Game_Map
AUTO={ #↓↓在这里标记好笔刷图块对应的自动图块名称(注意符号都要半角)↓↓
#----------------------------------------------------------------------
1=>{2=>"019-Sa_Grass02",3=>"020-Sa_Grass03<2",4=>"019-Sa_Grass02<3"},
#------------------------------------------------------------------------
} ; alias old_setup setup
def setup(map_id) ; old_setup(map_id) ;map_auto_set ;end
def auto2?(id)
return $game_temp.au[@tileset_name].find{|i| id == i[0] or
((a=(id - i[1])) > -1 and a < 48)}
end
def same?(n,od,id)
return n if id.nil?
return 0 if od[1].nil?
return n if id == od[0]
return n if ((a=(id - od[1])) > -1 and a < 48)
return 0 if od[2].nil?
return same?(n,od[2,od.size],id)
end
def tile_push_auto(ah)
rf = [] ; au = [] ;cu = [] ;ah.each{|i|
a = i[1].sub(/\<(\d+)/,"") ;cu.push([$1.to_i + 384,i[0]+384]) if $1 != nil ;
au.push([i[0] + 384]) ;rf.push(RPG::Cache.autotile(a))}
b = Bitmap.new("Graphics/Tilesets/#{@tileset_name}") ;lh = b.height
bit = Bitmap.new(256,rf.size * 192 + lh)
bit.bb(0,0,b) ;a = 0
for i in rf
bit.draw_autotile(i,lh) ;au[a][1] = lh / 32 * 8 + 384 ;
n = au[a][0] ; lh += 192 ;a += 1
pa = @passages.xsize ;@passages.resize(pa + 48) #通行度
pr = @priorities.xsize ;@priorities.resize(pr + 48) #优先级
pt = @terrain_tags.xsize ;@terrain_tags.resize(pt + 48) #地形标志
48.times do |j|
@priorities[pr + j] = @priorities[n]
@passages[pa + j] = @passages[n]
@terrain_tags[pt + j] = @terrain_tags[n]
end
end
for i in cu #[in,self]
next if (a = au.find_index{|j| j[0] == i[0]}).nil?
next if (b = au.find{|j| j[0] == i[1]}).nil?
au[a] += b[0,2]
end
$game_temp.tiles_push(@tileset_name,bit,au)
end
def map_auto_set
return if (ah=AUTO[@map.tileset_id]).nil?
$game_temp.au ||= {}
tile_push_auto(ah) if $game_temp.au[@tileset_name].nil?
f = self.data
for pag in [0,1,2]
for x in 0...f.xsize
for y in 0...f.ysize
next if (od = auto2?(f[x,y,pag])).nil?
g = [[x,y+1,8],[x+1,y,4],[x,y-1,2],[x-1,y,1]] ;b = 0
g.each{|i| b += same?(i[2],od,f[i[0],i[1],pag])}
g = [[x-1,y+1,8],[x+1,y+1,4],[x+1,y-1,2],[x-1,y-1,1]] ;c = 0
g.each{|i| c += same?(i[2],od,f[i[0],i[1],pag])}
f[x,y,pag] = get_autotile(b,c) + od[1]
end
end
end
end
def get_autotile(b, c) #获取自动元件ID By guoxiaomi (P1)
case b ; when 0b1111 ; 15 - c
when 0b1110 ; 19 - (c / 2) % 4
when 0b1101 ; 23 - (c / 4) % 4
when 0b1011 ; 27 - c / 8 - (c * 2) % 4
when 0b0111 ; 31 - c % 4
when 0b1010 ; 32
when 0b0101 ; 33
when 0b1100 ; 35 - (c / 4) % 2
when 0b1001 ; 37 - c / 8
when 0b0011 ; 39 - c % 2
when 0b0110 ; 41 - (c / 2) % 2
when 0b1000 then 42
when 0b0100 then 43
when 0b0010 then 44
when 0b0001 then 45
when 0b0000 then 46
end
end
end
class Bitmap
def bb(x,y,name,rx=0,ry=0,rw=nil,rh=nil,o=255,zmx=1.0,zmy=1.0)
if name.nil? or name == ""
a,b = rw || self.width,rh || self.height
fill_rect(x,y,a,b,Color.new(0,0,0,0)) ; return [a,b]
end
if zmx != 1.0 or zmy != 1.0
c,d = rw||name.width,rh||name.height
a = zmx.f? ? c * zmx : zmx ; b = zmy.f? ? d * zmy : zmy
stretch_blt(Rect.new(x,y,a,b),name,Rect.new(rx,ry,c,d),o)
else
a,b = rw || name.width, rh || name.height
blt(x,y,name,Rect.new(rx,ry,a,b),o)
end ; return [a,b] #返回宽和高
end
def draw_autotile(ait,ey)
dk={ #绘制, id=>[左上,右上,左下,右下]
0=>[26,27,32,33], 1=>[4,27,32,33], 2=>[26,5,32,33], 3=>[4,5,32,33],
4=>[26,27,32,11], 5=>[4,27,32,11], 6=>[26,5,32,11], 7=>[4,5,32,11],
8=>[26,27,10,33], 9=>[4,27,10,33], 10=>[26,5,10,33], 11=>[4,5,10,33],
12=>[26,27,10,11], 13=>[4,27,10,11], 14=>[26,5,10,11], 15=>[4,5,10,11],
16=>[24,25,30,31], 17=>[24,5,30,31], 18=>[24,25,30,11], 19=>[24,5,30,11],
20=>[14,15,20,21], 21=>[14,15,20,11], 22=>[14,15,10,21], 23=>[14,15,10,11],
24=>[28,29,34,35], 25=>[28,29,10,35], 26=>[4,29,34,35], 27=>[4,29,10,35],
28=>[26,27,44,45], 29=>[4,39,44,45], 30=>[38,5,44,45], 31=>[4,5,44,45],
32=>[24,29,30,35], 33=>[14,15,44,45], 34=>[12,13,18,19], 35=>[12,13,18,11],
36=>[16,17,22,23], 37=>[16,17,10,23], 38=>[40,41,46,47], 39=>[4,41,46,47],
40=>[36,37,42,43], 41=>[36,5,42,43], 42=>[12,17,18,23], 43=>[12,13,42,43],
44=>[36,41,42,47], 45=>[16,17,46,47], 46=>[12,17,42,47], 47=>[12,17,42,47]}
uf = [[0,0],[16,0],[0,16],[16,16]]
48.times do |i|
x,y = i % 8 * 32, i / 8 * 32 + ey; af = dk[i]
4.times do |j|
f = uf[j] ; a,b = af[j] % 6 * 16, af[j] / 6 * 16
self.bb(x + f[0],y + f[1],ait,a,b,16,16)
end
end ;ait.dispose
end
end
class Array
def find_index
a = 0 ;self.each{|i| return a if yield i ;a += 1} ;return nil
end
end
module RPG
module Cache
def self.tileset(filename)
if (r=$game_temp.tiles_save) != nil and r[filename] != nil ;
return r[filename].dup ;end
self.load_bitmap("Graphics/Tilesets/", filename)
end
end
end
class Game_Temp
attr_accessor :au,:tiles_save
def tiles_push(name,bit,f)
@tiles_save ||= {} ;@tiles_save[name] = bit
@au ||= {} ;@au[name] = f
end
end
|