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

Project1

 找回密码
 注册会员
搜索
查看: 507|回复: 3
打印 上一主题 下一主题

[原创发布] 给XP增加自动图块 2.1 ,绿色版

[复制链接]

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
跳转到指定楼层
1
发表于 2024-8-24 00:19:24 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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前
RUBY 代码复制
  1. #======================================================================
  2. # 自动图块扩展 2.0   By 灯笼菜刀王
  3. #
  4. # 使用方法 : 在 AUTO 里备注好要当自动图块标志的图块ID后(从0开始数)
  5. #            用该图块画地图,进游戏后就会按自动图块的规则调用对应的自动图块
  6. #
  7. # 备注例子: 数据库图块ID=>{2=>"自动图块名称",3=>"自动图块名字"}
  8. # 如果在自动图块名称里加上 <n ;表示该图块可以镶套到n号笔刷内使用
  9. #======================================================================
  10. class Game_Map
  11.   AUTO={ #↓↓在这里标记好笔刷图块对应的自动图块名称(注意符号都要半角)↓↓
  12. #----------------------------------------------------------------------
  13. 1=>{2=>"019-Sa_Grass02",3=>"020-Sa_Grass03<2",4=>"019-Sa_Grass02<3"},
  14. #------------------------------------------------------------------------
  15.   } ; alias old_setup setup
  16.   def setup(map_id) ; old_setup(map_id) ;map_auto_set ;end
  17.   def auto2?(id)
  18.     return $game_temp.au[@tileset_name].find{|i| id == i[0] or
  19.     ((a=(id - i[1])) > -1 and a < 48)}
  20.   end
  21.   def same?(n,od,id)
  22.     return n if id.nil?
  23.     return 0 if od[1].nil?
  24.     return n if id == od[0]
  25.     return n if ((a=(id - od[1])) > -1 and a < 48)
  26.     return 0 if od[2].nil?
  27.     return same?(n,od[2,od.size],id)
  28.   end
  29.  
  30.   def tile_push_auto(ah)
  31.     rf = [] ; au = [] ;cu = [] ;ah.each{|i|
  32.     a = i[1].sub(/\<(\d+)/,"") ;cu.push([$1.to_i + 384,i[0]+384]) if $1 != nil ;
  33.     au.push([i[0] + 384]) ;rf.push(RPG::Cache.autotile(a))}
  34.     b = Bitmap.new("Graphics/Tilesets/#{@tileset_name}") ;lh = b.height
  35.     bit = Bitmap.new(256,rf.size * 192 + lh)
  36.     bit.bb(0,0,b) ;a = 0
  37.     for i in rf
  38.       bit.draw_autotile(i,lh) ;au[a][1] = lh / 32 * 8 + 384 ;
  39.       n = au[a][0] ; lh += 192  ;a += 1
  40.       pa = @passages.xsize ;@passages.resize(pa + 48) #通行度
  41.       pr = @priorities.xsize ;@priorities.resize(pr + 48) #优先级
  42.       pt = @terrain_tags.xsize ;@terrain_tags.resize(pt + 48) #地形标志
  43.       48.times do |j|
  44.         @priorities[pr + j] = @priorities[n]
  45.         @passages[pa + j] = @passages[n]
  46.         @terrain_tags[pt + j] = @terrain_tags[n]
  47.       end
  48.     end
  49.     for i in cu #[in,self]
  50.       next if (a = au.find_index{|j| j[0] == i[0]}).nil?
  51.       next if (b = au.find{|j| j[0] == i[1]}).nil?
  52.       au[a] += b[0,2]
  53.     end
  54.     $game_temp.tiles_push(@tileset_name,bit,au)
  55.   end
  56.  
  57.   def map_auto_set
  58.     return if (ah=AUTO[@map.tileset_id]).nil?
  59.     $game_temp.au ||= {}
  60.     tile_push_auto(ah) if $game_temp.au[@tileset_name].nil?
  61.     f = self.data   
  62.     for pag in [0,1,2]
  63.       for x in 0...f.xsize
  64.         for y in 0...f.ysize
  65.           next if (od = auto2?(f[x,y,pag])).nil?
  66.           g = [[x,y+1,8],[x+1,y,4],[x,y-1,2],[x-1,y,1]] ;b = 0
  67.           g.each{|i| b += same?(i[2],od,f[i[0],i[1],pag])}
  68.           g = [[x-1,y+1,8],[x+1,y+1,4],[x+1,y-1,2],[x-1,y-1,1]] ;c = 0
  69.           g.each{|i| c += same?(i[2],od,f[i[0],i[1],pag])}
  70.           f[x,y,pag] = get_autotile(b,c) + od[1]
  71.         end
  72.       end
  73.     end
  74.   end
  75.  
  76.   def get_autotile(b, c) #获取自动元件ID  By guoxiaomi (P1)
  77.     case b ; when 0b1111 ; 15 - c
  78.     when 0b1110 ; 19 - (c / 2) % 4
  79.     when 0b1101 ; 23 - (c / 4) % 4
  80.     when 0b1011 ; 27 - c / 8 - (c * 2) % 4
  81.     when 0b0111 ; 31 - c % 4
  82.     when 0b1010 ; 32
  83.     when 0b0101 ; 33
  84.     when 0b1100 ; 35 - (c / 4) % 2
  85.     when 0b1001 ; 37 - c / 8
  86.     when 0b0011 ; 39 - c % 2
  87.     when 0b0110 ; 41 - (c / 2) % 2
  88.     when 0b1000 then 42
  89.     when 0b0100 then 43
  90.     when 0b0010 then 44
  91.     when 0b0001 then 45
  92.     when 0b0000 then 46
  93.     end
  94.   end
  95. end
  96.  
  97. class Bitmap
  98.   def bb(x,y,name,rx=0,ry=0,rw=nil,rh=nil,o=255,zmx=1.0,zmy=1.0)
  99.     if name.nil? or name == ""
  100.       a,b = rw || self.width,rh || self.height
  101.       fill_rect(x,y,a,b,Color.new(0,0,0,0)) ; return [a,b]
  102.     end
  103.     if zmx != 1.0 or zmy != 1.0
  104.       c,d = rw||name.width,rh||name.height
  105.       a = zmx.f? ? c * zmx : zmx ; b = zmy.f? ? d * zmy : zmy
  106.       stretch_blt(Rect.new(x,y,a,b),name,Rect.new(rx,ry,c,d),o)
  107.     else
  108.       a,b = rw || name.width, rh || name.height
  109.       blt(x,y,name,Rect.new(rx,ry,a,b),o)
  110.     end ; return [a,b] #返回宽和高
  111.   end
  112.  
  113. def draw_autotile(ait,ey)
  114.   dk={ #绘制, id=>[左上,右上,左下,右下]
  115.   0=>[26,27,32,33],  1=>[4,27,32,33],  2=>[26,5,32,33],  3=>[4,5,32,33],
  116.   4=>[26,27,32,11],  5=>[4,27,32,11],  6=>[26,5,32,11],  7=>[4,5,32,11],
  117.   8=>[26,27,10,33],  9=>[4,27,10,33],  10=>[26,5,10,33], 11=>[4,5,10,33],
  118.   12=>[26,27,10,11], 13=>[4,27,10,11], 14=>[26,5,10,11], 15=>[4,5,10,11],
  119.   16=>[24,25,30,31], 17=>[24,5,30,31], 18=>[24,25,30,11], 19=>[24,5,30,11],
  120.   20=>[14,15,20,21], 21=>[14,15,20,11], 22=>[14,15,10,21], 23=>[14,15,10,11],
  121.   24=>[28,29,34,35], 25=>[28,29,10,35], 26=>[4,29,34,35], 27=>[4,29,10,35],
  122.   28=>[26,27,44,45], 29=>[4,39,44,45], 30=>[38,5,44,45], 31=>[4,5,44,45],
  123.   32=>[24,29,30,35], 33=>[14,15,44,45], 34=>[12,13,18,19], 35=>[12,13,18,11],
  124.   36=>[16,17,22,23], 37=>[16,17,10,23], 38=>[40,41,46,47], 39=>[4,41,46,47],
  125.   40=>[36,37,42,43], 41=>[36,5,42,43], 42=>[12,17,18,23], 43=>[12,13,42,43],
  126.   44=>[36,41,42,47], 45=>[16,17,46,47], 46=>[12,17,42,47], 47=>[12,17,42,47]}
  127.   uf = [[0,0],[16,0],[0,16],[16,16]]
  128.   48.times do |i|
  129.     x,y = i % 8 * 32, i / 8 * 32 + ey; af = dk[i]
  130.     4.times do |j|
  131.       f = uf[j] ; a,b = af[j] % 6 * 16, af[j] / 6 * 16
  132.       self.bb(x + f[0],y + f[1],ait,a,b,16,16)
  133.     end
  134.   end ;ait.dispose
  135. end
  136. end
  137.  
  138. class Array
  139.   def find_index
  140.     a = 0 ;self.each{|i| return a if yield i ;a += 1} ;return nil
  141.   end
  142. end
  143. module RPG
  144. module Cache
  145.   def self.tileset(filename)
  146.     if (r=$game_temp.tiles_save) != nil and r[filename] != nil ;
  147.         return r[filename].dup ;end
  148.     self.load_bitmap("Graphics/Tilesets/", filename)
  149.   end
  150. end
  151. end
  152. class Game_Temp
  153.   attr_accessor :au,:tiles_save
  154.   def tiles_push(name,bit,f)
  155.     @tiles_save ||= {} ;@tiles_save[name] = bit
  156.     @au ||= {} ;@au[name] = f
  157.   end
  158. end

评分

参与人数 1+1 收起 理由
kangxi0109 + 1 精品文章

查看全部评分

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
3
 楼主| 发表于 2024-8-24 10:20:23 | 只看该作者
89444640 发表于 2024-8-24 05:53
0~7是第一行 第二行是10~17吗?行*N+0~7?
塞进去的自动图块一多可能会拖慢 多少会拖慢?你知道我当年塞了 ...


第一行0-7, 第二行8-15, 第三行16-23,  可以直接测量图片高度, 高度 / 32 * 8 + 横向格数, 就是准确的ID

或者弄个事件, 脚本:

x = 0
y = 0
[2,1,0].each{|z|
next if (a=$game_map.data[x,y,z]).nil? or
a < 384 ;p a - 384 ;break}


把X,Y设置成你地图上的坐标, 执行它就可以得到该地点对应的图块ID


至于多少会拖慢, 当然是看机器性能

点评

开ps 32辅助线,拉选框工具,所在行最下y坐标除32乘8 加横向格子-1  发表于 2024-8-24 12:16
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
2
发表于 2024-8-24 05:53:05 | 只看该作者
0~7是第一行 第二行是10~17吗?行*N+0~7?
塞进去的自动图块一多可能会拖慢 多少会拖慢?你知道我当年塞了区区999个道具,xp描绘道具图标就崩溃了的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-24 10:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表