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

Project1

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

[RMVX发布] 自动画地图!!! v0.1 测试版

 关闭 [复制链接]

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

跳转到指定楼层
1
发表于 2008-11-2 05:13:54 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
  1. #code by kissye
  2. class Tilemap
  3.   FBLX = 544#x方向分辨率
  4.   FBLY = 416#y方向分辨率
  5.   SIZEX = 32
  6.   SIZEY = 32
  7.   ANI = 25#动画等待桢数
  8.   #以下画元件用
  9.   RECT1 = [Rect.new(0, 32, 16, 16), Rect.new(16, 32, 16, 16),
  10.   Rect.new(32, 32, 16, 16), Rect.new(48, 32, 16, 16),
  11.   Rect.new(0, 48, 16, 16), Rect.new(16, 48, 16, 16),
  12.   Rect.new(32, 48, 16, 16), Rect.new(48, 48, 16, 16),
  13.   Rect.new(0, 64, 16, 16), Rect.new(16, 64, 16, 16),
  14.   Rect.new(32, 64, 16, 16), Rect.new(48, 64, 16, 16),
  15.   Rect.new(0, 80, 16, 16), Rect.new(16, 80, 16, 16),
  16.   Rect.new(32, 80, 16, 16), Rect.new(48, 80, 16, 16),
  17.   Rect.new(32, 0, 16, 16), Rect.new(48, 0, 16, 16),
  18.   Rect.new(32, 16, 16, 16), Rect.new(48, 16, 16, 16)]
  19.   LIST1 = [[10, 9, 6, 5], [16, 9, 6, 5], [10, 17, 6, 5], [16, 17, 6, 5],
  20.   [10, 9, 6, 19], [16, 9, 6, 19], [10, 17, 6, 19], [16, 17, 6, 19],
  21.   [10, 9, 18, 5], [16, 9, 18, 5], [10, 17, 18, 5], [16, 17, 18, 5],
  22.   [10, 9, 18, 19], [16, 9, 18, 19], [10, 17, 18, 19], [16, 17, 18, 19],
  23.   [8, 9, 4, 5], [8, 17, 4, 5], [8, 9, 4, 19], [8, 17, 4, 19],
  24.   [2, 1, 6, 5], [2, 1, 6, 19], [2, 1, 18, 5], [2, 1, 18, 19],
  25.   [10, 11, 6, 7], [10, 11, 18, 7], [16, 11, 6, 7], [16, 11, 18, 7],
  26.   [10, 9, 14, 13], [16, 9, 14, 13], [10, 17, 14, 13], [16, 17, 14, 13],
  27.   [8, 11, 4, 7], [2, 1, 14, 13], [0, 1, 4, 5], [0, 1, 4, 19],
  28.   [2, 3, 6, 7], [2, 3, 18, 7], [10, 11, 14, 15], [16, 11, 14, 15],
  29.   [8, 9, 12, 13], [8, 17, 12, 13], [0, 3, 8, 11], [0, 1, 12, 13],
  30.   [4, 7, 12, 15], [2, 3, 14, 15], [0, 3, 12, 15]]
  31.   RECT2 = [Rect.new(0, 0, 16, 16), Rect.new(16, 0, 16, 16),
  32.   Rect.new(32, 0, 16, 16), Rect.new(48, 0, 16, 16),
  33.   Rect.new(0, 16, 16, 16), Rect.new(16, 16, 16, 16),
  34.   Rect.new(32, 16, 16, 16), Rect.new(48, 16, 16, 16),
  35.   Rect.new(0, 32, 16, 16), Rect.new(16, 32, 16, 16),
  36.   Rect.new(32, 32, 16, 16), Rect.new(48, 32, 16, 16),
  37.   Rect.new(0, 48, 16, 16), Rect.new(16, 48, 16, 16),
  38.   Rect.new(32, 48, 16, 16), Rect.new(48, 48, 16, 16)]
  39.   LIST2 = [[10, 9, 6, 5], [8, 9, 4, 5], [2, 1, 6, 5], [0, 1, 4, 5],
  40.   [10, 11, 6, 7], [8, 11, 4, 7], [2, 3, 6, 7], [0, 3, 8, 11],
  41.   [10, 9, 14, 13], [8, 9, 12, 13], [2, 1, 14, 13], [0, 1, 12, 13],
  42.   [10, 11, 14, 15], [4, 7, 12, 15], [2, 3, 14, 15], [0, 3, 12, 15]]
  43.   LIST3 = [[2, 1, 6, 5], [0, 1, 4, 5], [2, 3, 6, 7], [0, 3, 4, 7]]
  44.   #----------------------------------------------------------------------------
  45.   attr_accessor :bitmaps
  46.   attr_accessor :viewport
  47.   attr_reader   :ox
  48.   attr_reader   :oy
  49.   attr_reader   :visible
  50.   attr_reader   :passages
  51.   attr_reader   :count
  52.   attr_reader   :flash_data#不知道这个做什么用的
  53.   #----------------------------------------------------------------------------
  54.   def initialize(viewport = nil)
  55.     @shadow = Bitmap.new(SIZEX, SIZEY)
  56.     @shadow.fill_rect(0, 0, 17, SIZEY, Color.new(0, 0, 0, 120))#阴影
  57.     @viewport = viewport
  58.     @bitmaps = []
  59.     @backs = {}#元件精灵
  60.     @backbitmap = {}#元件图块
  61.     @switches = {}#动画开关
  62.     @count = 0#当前显示动画
  63.     @count1 = 0#等待桢数
  64.     @visible = true
  65.     @ox = 0
  66.     @oy = 0
  67.     @lastox = 0
  68.     @lastoy = 0
  69.   end
  70.   #----------------------------------------------------------------------------
  71.   def dispose
  72.     for i in @backbitmap.values
  73.       i.dispose
  74.     end
  75.     for i in @backs.values
  76.       i.dispose
  77.     end
  78.     @shadow.dispose
  79.   end
  80.   #---------------------------------------------------------------------------
  81.   def disposed?
  82.     return @shadow.disposed?
  83.   end
  84.   #---------------------------------------------------------------------------
  85.   def map_data=(value)
  86.     @map_data = value
  87.     #如果地图太大,按ESC打开菜单后返回地图太慢,下面这段循环可以不要
  88.     for i in 0...value.xsize
  89.       for j in 0...value.ysize
  90.         for k in 0..2
  91.           cachebitmap(value[i, j, k])
  92.         end
  93.       end
  94.     end
  95.     #如果地图太大,按ESC打开菜单后返回地图太慢,上面这段循环可以不要
  96.     #需要重新描绘的图快
  97.     if @map_data.xsize * SIZEX <= FBLX
  98.       rangei = (@ox / SIZEX - 1)..[((@ox + FBLX) / SIZEX), FBLX / SIZEX - 1].min
  99.     else
  100.       rangei = (@ox / SIZEX - 1)..((@ox + FBLX) / SIZEX)
  101.     end
  102.     if @map_data.xsize * SIZEX <= FBLX
  103.       rangej = (@oy / SIZEY - 1)..[((@oy + FBLY) / SIZEY), FBLY / SIZEY - 1].min
  104.     else
  105.       rangej = (@oy / SIZEY - 1)..((@oy + FBLY) / SIZEY)
  106.     end
  107.     for i in rangei
  108.       for j in rangej
  109.         for k in 0..2
  110.           draw(i, j, k)
  111.         end
  112.       end
  113.     end
  114.   end
  115.   #--------------------------------------------------------------------------
  116.   def refreshox
  117.     #需要释放掉的图块
  118.     rangej = (@lastoy / SIZEY - 1)..((@lastoy + FBLY) / SIZEY)
  119.     if @ox > @lastox
  120.       rangei = ((@lastox / SIZEX - 1)...(@ox / SIZEX - 1))
  121.     elsif @ox < @lastox
  122.       rangei = (((@ox + FBLX) / SIZEX + 1)..((@lastox + FBLX) / SIZEX))
  123.     end
  124.     for i in rangei
  125.       for j in rangej
  126.         for k in 0..3
  127.           next if @backs[[i, j, k]].nil?
  128.           @backs[[i, j, k]].dispose
  129.           @backs.delete([i, j, k])
  130.           @switches.delete([i, j, k])
  131.         end
  132.       end
  133.     end
  134.     #恢复走路时候的偏移
  135.     if @ox >= (@map_data.xsize * SIZEX - FBLX)
  136.       for i in @backs.keys
  137.         @backs[i].ox = 0
  138.         @backs[i].x = i[0] * SIZEX - @ox
  139.         if i[0] < (@ox / 32 - 1)
  140.           @backs[i].x += @map_data.xsize * SIZEX
  141.         elsif i[0] == -1
  142.           @backs[i].x = 0
  143.         end
  144.       end
  145.     else
  146.       for i in @backs.keys
  147.         @backs[i].ox = 0
  148.         @backs[i].x = i[0] * SIZEX - @ox
  149.       end
  150.     end
  151.     #需要重新描绘的图快
  152.     rangej = (@oy / SIZEY - 1)..((@oy + FBLY) / SIZEY)
  153.     if @ox > @lastox
  154.       rangei = ([((@lastox + FBLX) / SIZEX + 1), (@ox / SIZEX - 1)].max..((@ox + FBLX) / SIZEX))
  155.     elsif @ox < @lastox
  156.       rangei = ((@ox / SIZEX - 1)...[(@lastox / SIZEX - 1), (@ox + FBLX) / SIZEX + 1].min)
  157.     end
  158.     for i in rangei
  159.       for j in rangej
  160.         for k in 0..2
  161.           draw(i, j, k)
  162.         end
  163.       end
  164.     end
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   def refreshoy
  168.     #需要释放掉的图块
  169.     rangei = (@lastox / SIZEX - 1)..((@lastox + FBLX) / SIZEX)
  170.     if @oy > @lastoy
  171.       rangej = ((@lastoy / SIZEY - 1)...(@oy / SIZEY - 1))
  172.     elsif @oy < @lastoy
  173.       rangej = (((@oy + FBLY) / SIZEY + 1)..((@lastoy + FBLY) / SIZEY))
  174.     end
  175.     for i in rangei
  176.       for j in rangej
  177.         for k in 0..3
  178.           next if @backs[[i, j, k]].nil?
  179.           @backs[[i, j, k]].dispose
  180.           @backs.delete([i, j, k])
  181.           @switches.delete([i, j, k])
  182.         end
  183.       end
  184.     end
  185.     #恢复走路时候的偏移
  186.     if @oy >= (@map_data.ysize * SIZEY - FBLY)
  187.       for i in @backs.keys
  188.         @backs[i].oy = 0
  189.         @backs[i].y = i[1] * SIZEY - @oy
  190.         if i[1] < (@oy / 32 - 1)
  191.           @backs[i].y += @map_data.ysize * SIZEY
  192.         elsif i[1] == -1
  193.           @backs[i].y = 0
  194.         end
  195.       end
  196.     else
  197.       for i in @backs.keys
  198.         @backs[i].oy = 0
  199.         @backs[i].y = i[1] * SIZEY - @oy
  200.       end
  201.     end
  202.     #需要重新描绘的图快
  203.     rangei = (@ox / SIZEX - 1)..((@ox + FBLX) / SIZEX)
  204.     if @oy > @lastoy
  205.       rangej = ([((@lastoy + FBLY) / SIZEY + 1), @oy / SIZEY - 1].max..((@oy + FBLY) / SIZEY))
  206.     elsif @oy < @lastoy
  207.       rangej = ((@oy / SIZEY - 1)...[(@lastoy / SIZEY - 1), ((@oy + FBLY) / SIZEY + 1)].min)
  208.     end
  209.     for i in rangei
  210.       for j in rangej
  211.         for k in 0..2
  212.           draw(i, j, k)
  213.         end
  214.       end
  215.     end
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   #i为x坐标,j为y坐标,k为图层
  219.   def draw(i, j, k)
  220.     i0 = i
  221.     j0 = j
  222.     i -= @map_data.xsize if i >= @map_data.xsize
  223.     i += @map_data.xsize if i < 0
  224.     j -= @map_data.ysize if j >= @map_data.ysize
  225.     j += @map_data.ysize if j < 0
  226.     id = @map_data[i, j, k]
  227.     return if id == 0
  228.     unless @backs[[i, j, k]].nil?
  229.       unless @backs[[i, j, 3]].nil?
  230.         @backs[[i, j, 3]].x = i0 * SIZEX - @ox
  231.         @backs[[i, j, 3]].y = j0 * SIZEY - @oy
  232.       end
  233.       @backs[[i, j, k]].x = i0 * SIZEX - @ox
  234.       @backs[[i, j, k]].y = j0 * SIZEY - @oy
  235.       return
  236.     end
  237.     @backs[[i, j, k]] = Sprite.new(@viewport)
  238.     @backs[[i, j, k]].x = i0 * SIZEX - @ox
  239.     @backs[[i, j, k]].y = j0 * SIZEY - @oy
  240.     @backs[[i, j, k]].z = k * 2
  241.     @backs[[i, j, k]].bitmap = cachebitmap(id)
  242.     if id < 1024
  243.     elsif id < 1664
  244.       draw_shadow(i, j, k) if id >= 1552#阴影
  245.     elsif id < 2816
  246.       id1 = (id - 2048) / 48
  247.       unless [2, 3].include?(id1)#动画
  248.         @switches[[i, j, k]] = true
  249.         @backs[[i, j, k]].bitmap = @backbitmap[id + @count * 10000]
  250.       end
  251.     elsif id < 4352
  252.       id0 = (id - 2816) / 48 % 8
  253.       draw_shadow(i, j, k) #unless id0 == 6#阴影
  254.       #帮助手册中写A2每行第七个是不会被绘上阴影的,但实际有阴影,这里按照实际
  255.       @backs[[i, j, k]].z += 1 if id0 == 7#柜台
  256.     end
  257.     return if @passages.nil?
  258.     return unless @passages[id] == 22
  259.     @backs[[i, j, k]].z = 200
  260.   end
  261.   #---------------------------------------------------------------------------
  262.   def cachebitmap(id)
  263.     if @backbitmap[id].nil?
  264.       if id < 1024#B/C/D/E的情况
  265.         @backbitmap[id] = Bitmap.new(SIZEX, SIZEY)
  266.         bitmapid = id / 256 + 5
  267.         x = id % 256 / 128 * 8 * SIZEX + id % 256 % 128 % 8 * SIZEX
  268.         y = id % 256 % 128 / 8 * SIZEY
  269.         rect = Rect.new(x, y, SIZEX, SIZEY)
  270.         @backbitmap[id].blt(0, 0, @bitmaps[bitmapid], rect)
  271.       elsif id < 1664#A5的情况
  272.         @backbitmap[id] = Bitmap.new(SIZEX, SIZEY)
  273.         id0 = id - 1536
  274.         bitmapid = 4
  275.         x = id0 % 8 * SIZEX
  276.         y = id0 / 8 * SIZEY
  277.         rect = Rect.new(x, y, SIZEX, SIZEY)
  278.         @backbitmap[id].blt(0, 0, @bitmaps[bitmapid], rect)
  279.       elsif id < 2816#A1的情况
  280.         id0 = id - 2048
  281.         id1 = id0 / 48#编号,含义见附录
  282.         id2 = id0 % 48#含义见附录
  283.         bitmapid = 0
  284.         if id1 == 0#前四张排列比较特殊,浅海水域-深海水域-浅海装饰-深海装饰
  285.           x = 0
  286.           y = 0
  287.           @backbitmap[id] = drawbitmap1(x, y, id2, bitmapid)
  288.           x += 64
  289.           @backbitmap[id + 10000] = drawbitmap1(x, y, id2, bitmapid)
  290.           x += 64
  291.           @backbitmap[id + 20000] = drawbitmap1(x, y, id2, bitmapid)
  292.         elsif id1 == 1
  293.           x = 0
  294.           y = 96
  295.           @backbitmap[id] = drawbitmap1(x, y, id2, bitmapid)
  296.           x += 64
  297.           @backbitmap[id + 10000] = drawbitmap1(x, y, id2, bitmapid)
  298.           x += 64
  299.           @backbitmap[id + 20000] = drawbitmap1(x, y, id2, bitmapid)
  300.         elsif id1 == 2
  301.           x = 192
  302.           y = 0
  303.           @backbitmap[id] = drawbitmap1(x, y, id2, bitmapid)
  304.         elsif id1 == 3
  305.           x = 192
  306.           y = 96
  307.           @backbitmap[id] = drawbitmap1(x, y, id2, bitmapid)
  308.         elsif id1 % 2 == 0#从第五张开始就是水域-瀑布-水域-瀑布的顺序了
  309.           x = id1 / 4 % 2 * 256
  310.           y = id1 / 4 / 2 * 192 + id1 / 2 % 2 * 96
  311.           @backbitmap[id] = drawbitmap1(x, y, id2, bitmapid)
  312.           x += 64
  313.           @backbitmap[id + 10000] = drawbitmap1(x, y, id2, bitmapid)
  314.           x += 64
  315.           @backbitmap[id + 20000] = drawbitmap1(x, y, id2, bitmapid)
  316.         else
  317.           x = id1 / 4 % 2 * 256 + 192
  318.           y = id1 / 4 / 2 * 192 + id1 / 2 % 2 * 96
  319.           @backbitmap[id] = drawbitmap3(x, y, id2, bitmapid)
  320.           y += 32
  321.           @backbitmap[id + 10000] = drawbitmap3(x, y, id2, bitmapid)
  322.           y += 32
  323.           @backbitmap[id + 20000] = drawbitmap3(x, y, id2, bitmapid)
  324.         end
  325.       elsif id < 4352#A2的情况
  326.         id0 = id - 2816
  327.         id1 = id0 / 48#编号,含义见附录
  328.         id2 = id0 % 48#含义见附录
  329.         bitmapid = 1
  330.         x = id1 % 8 * 64
  331.         y = id1 / 8 * 96
  332.         if id1 % 8 == 7
  333.           @backbitmap[id] = drawbitmap4(x, y, id2, bitmapid)
  334.         else
  335.           @backbitmap[id] = drawbitmap1(x, y, id2, bitmapid)
  336.         end
  337.       elsif id < 5888#A3的情况
  338.         id0 = id - 4352
  339.         id1 = id0 / 48#编号,含义见附录
  340.         id2 = id0 % 48#含义见附录
  341.         bitmapid = 2
  342.         x = id1 % 8 * 64
  343.         y = id1 / 8 * 64
  344.         @backbitmap[id] = drawbitmap2(x, y, id2, bitmapid)
  345.       else#A4的情况
  346.         id0 = id - 5888
  347.         id1 = id0 / 48#编号,含义见附录
  348.         id2 = id0 % 48#含义见附录
  349.         bitmapid = 3
  350.         x = id1 % 8 * 64
  351.         if id1 % 16 < 8
  352.           y = id1 / 16 * 160
  353.           @backbitmap[id] = drawbitmap1(x, y, id2, bitmapid)
  354.         else
  355.           y = id1 / 16 * 160 + 96
  356.           @backbitmap[id] = drawbitmap2(x, y, id2, bitmapid)
  357.         end
  358.       end
  359.     end
  360.     return @backbitmap[id]
  361.   end
  362.   #---------------------------------------------------------------------------
  363.   #A1,A2
  364.   #此处的x,y指图片上的xy位置,id范围为0-48,id含义见附录
  365.   #i,j为地图上的xy位置,k为层数,bitmapid为源图片编号
  366.   def drawbitmap1(x, y, id, bitmapid)
  367.     bitmap = Bitmap.new(SIZEX, SIZEY)
  368.     rect = RECT1[LIST1[id][0]].clone
  369.     rect.x += x
  370.     rect.y += y
  371.     bitmap.blt(0, 0, @bitmaps[bitmapid], rect)
  372.     rect = RECT1[LIST1[id][1]].clone
  373.     rect.x += x
  374.     rect.y += y
  375.     bitmap.blt(16, 0, @bitmaps[bitmapid], rect)
  376.     rect = RECT1[LIST1[id][2]].clone
  377.     rect.x += x
  378.     rect.y += y
  379.     bitmap.blt(0, 16, @bitmaps[bitmapid], rect)
  380.     rect = RECT1[LIST1[id][3]].clone
  381.     rect.x += x
  382.     rect.y += y
  383.     bitmap.blt(16, 16, @bitmaps[bitmapid], rect)
  384.     return bitmap
  385.   end
  386.   #---------------------------------------------------------------------------
  387.   #A3
  388.   #此处的x,y指图片上的xy位置,id范围为0-48,id含义见附录
  389.   #i,j为地图上的xy位置,k为层数,bitmapid为源图片编号
  390.   def drawbitmap2(x, y, id, bitmapid)
  391.     bitmap = Bitmap.new(SIZEX, SIZEY)
  392.     rect = RECT2[LIST2[id][0]].clone
  393.     rect.x += x
  394.     rect.y += y
  395.     bitmap.blt(0, 0, @bitmaps[bitmapid], rect)
  396.     rect = RECT2[LIST2[id][1]].clone
  397.     rect.x += x
  398.     rect.y += y
  399.     bitmap.blt(16, 0, @bitmaps[bitmapid], rect)
  400.     rect = RECT2[LIST2[id][2]].clone
  401.     rect.x += x
  402.     rect.y += y
  403.     bitmap.blt(0, 16, @bitmaps[bitmapid], rect)
  404.     rect = RECT2[LIST2[id][3]].clone
  405.     rect.x += x
  406.     rect.y += y
  407.     bitmap.blt(16, 16, @bitmaps[bitmapid], rect)
  408.     return bitmap
  409.   end
  410.   #---------------------------------------------------------------------------
  411.   #瀑布
  412.   #此处的x,y指图片上的xy位置,id范围为0-48,id含义见附录
  413.   #i,j为地图上的xy位置,k为层数,bitmapid为源图片编号
  414.   def drawbitmap3(x, y, id, bitmapid)
  415.     bitmap = Bitmap.new(SIZEX, SIZEY)
  416.     rect = RECT2[LIST3[id][0]].clone
  417.     rect.x += x
  418.     rect.y += y
  419.     bitmap.blt(0, 0, @bitmaps[bitmapid], rect)
  420.     rect = RECT2[LIST3[id][1]].clone
  421.     rect.x += x
  422.     rect.y += y
  423.     bitmap.blt(16, 0, @bitmaps[bitmapid], rect)
  424.     rect = RECT2[LIST3[id][2]].clone
  425.     rect.x += x
  426.     rect.y += y
  427.     bitmap.blt(0, 16, @bitmaps[bitmapid], rect)
  428.     rect = RECT2[LIST3[id][3]].clone
  429.     rect.x += x
  430.     rect.y += y
  431.     bitmap.blt(16, 16, @bitmaps[bitmapid], rect)
  432.     return bitmap
  433.   end
  434.   #---------------------------------------------------------------------------
  435.   #柜台
  436.   #此处的x,y指图片上的xy位置,id范围为0-48,id含义见附录
  437.   #i,j为地图上的xy位置,k为层数,bitmapid为源图片编号
  438.   def drawbitmap4(x, y, id, bitmapid)
  439.     if [28, 29, 30, 31, 33].include?(id)#下
  440.       bitmap = Bitmap.new(SIZEX, 40)
  441.       rect = Rect.new(32, 48, 16, 16)
  442.       rect.x += x
  443.       rect.y += y
  444.       bitmap.blt(0, 16, @bitmaps[bitmapid], rect)
  445.       rect = Rect.new(16, 48, 16, 16)
  446.       rect.x += x
  447.       rect.y += y
  448.       bitmap.blt(16, 16, @bitmaps[bitmapid], rect)
  449.     elsif [38, 39, 45].include?(id)#右+下
  450.       bitmap = Bitmap.new(SIZEX, 40)
  451.       rect = Rect.new(32, 48, 16, 8)
  452.       rect.x += x
  453.       rect.y += y
  454.       bitmap.blt(0, 16, @bitmaps[bitmapid], rect)
  455.       rect = Rect.new(48, 48, 16, 8)
  456.       rect.x += x
  457.       rect.y += y
  458.       bitmap.blt(16, 16, @bitmaps[bitmapid], rect)
  459.     elsif [40, 41, 43].include?(id)#左+下
  460.       bitmap = Bitmap.new(SIZEX, 40)
  461.       rect = Rect.new(0, 48, 16, 8)
  462.       rect.x += x
  463.       rect.y += y
  464.       bitmap.blt(0, 16, @bitmaps[bitmapid], rect)
  465.       rect = Rect.new(16, 48, 16, 8)
  466.       rect.x += x
  467.       rect.y += y
  468.       bitmap.blt(16, 16, @bitmaps[bitmapid], rect)
  469.     elsif [44, 46].include?(id)#左+下+右
  470.       bitmap = Bitmap.new(SIZEX, 40)
  471.       rect = Rect.new(0, 48, 16, 8)
  472.       rect.x += x
  473.       rect.y += y
  474.       bitmap.blt(0, 16, @bitmaps[bitmapid], rect)
  475.       rect = Rect.new(48, 48, 16, 8)
  476.       rect.x += x
  477.       rect.y += y
  478.       bitmap.blt(16, 16, @bitmaps[bitmapid], rect)
  479.     else
  480.       bitmap = Bitmap.new(SIZEX, SIZEY)
  481.       rect = RECT1[LIST1[id][0]].clone
  482.       rect.x += x
  483.       rect.y += y
  484.       bitmap.blt(0, 0, @bitmaps[bitmapid], rect)
  485.       rect = RECT1[LIST1[id][1]].clone
  486.       rect.x += x
  487.       rect.y += y
  488.       bitmap.blt(16, 0, @bitmaps[bitmapid], rect)
  489.       rect = RECT1[LIST1[id][2]].clone
  490.       rect.x += x
  491.       rect.y += y
  492.       bitmap.blt(0, 16, @bitmaps[bitmapid], rect)
  493.       rect = RECT1[LIST1[id][3]].clone
  494.       rect.x += x
  495.       rect.y += y
  496.       bitmap.blt(16, 16, @bitmaps[bitmapid], rect)
  497.       return bitmap
  498.     end
  499.     rect = RECT1[LIST1[id][0]].clone
  500.     rect.x += x
  501.     rect.y += y
  502.     bitmap.blt(0, 0, @bitmaps[bitmapid], rect)
  503.     rect = RECT1[LIST1[id][1]].clone
  504.     rect.x += x
  505.     rect.y += y
  506.     bitmap.blt(16, 0, @bitmaps[bitmapid], rect)
  507.     rect = RECT1[LIST1[id][2]].clone
  508.     rect.x += x
  509.     rect.y += y
  510.     bitmap.blt(0, 24, @bitmaps[bitmapid], rect)
  511.     rect = RECT1[LIST1[id][3]].clone
  512.     rect.x += x
  513.     rect.y += y
  514.     bitmap.blt(16, 24, @bitmaps[bitmapid], rect)
  515.     return bitmap
  516.   end
  517.   #--------------------------------------------------------------------------
  518.   def draw_shadow(i, j, k)
  519.     return if k != 0
  520.     return if i == 0
  521.     i -= 1
  522.     id = @map_data[i, j, 0]
  523.     return if id < 4352
  524.     if id < 5888#A3的情况
  525.       id0 = id - 4352
  526.       id1 = id0 / 48#编号,含义见附录
  527.       id2 = id0 % 48#含义见附录
  528.       if [4, 5, 12].include?(id2)
  529.         nexts = true
  530.       elsif j == 0
  531.       elsif @map_data[i, j - 1, 0].between?(4352, 5888)
  532.         nexts = true
  533.       end
  534.     else#A4的情况
  535.       id0 = id - 5888
  536.       id1 = id0 / 48#编号,含义见附录
  537.       id2 = id0 % 48#含义见附录
  538.       if id1 % 16 < 8
  539.         if [24, 25, 26, 27, 32, 38, 39].include?(id2)
  540.           nexts = true
  541.         elsif j == 0
  542.         elsif @map_data[i, j - 1, 0] >= 5888
  543.           nexts = true
  544.         end
  545.       else
  546.       if [4, 5, 12].include?(id2)
  547.           nexts = true
  548.         elsif j == 0
  549.         elsif @map_data[i, j - 1, 0] >= 5888
  550.           nexts = true
  551.         end
  552.       end
  553.     end
  554.     return unless nexts
  555.     i += 1
  556.     @backs[[i, j, 3]] = Sprite.new(@viewport)
  557.     @backs[[i, j, 3]].bitmap = @shadow
  558.     @backs[[i, j, 3]].x = @backs[[i, j, 0]].x
  559.     @backs[[i, j, 3]].y = @backs[[i, j, 0]].y
  560.     @backs[[i, j, 3]].z = 0
  561.   end
  562.   #---------------------------------------------------------------------------
  563.   def passages=(value)
  564.     @passages = value
  565.     for i in ([@ox / SIZEX - 1, 0].max)..((@ox + FBLX) / SIZEX)
  566.       for j in ([@oy / SIZEY - 1, 0].max)..((@oy + FBLY) / SIZEY)
  567.         id = @map_data[i, j, 2]
  568.         next if id.nil?
  569.         next unless value[id] == 22
  570.         @backs[[i, j, 2]].z = 200
  571.       end
  572.     end
  573.   end
  574.   #---------------------------------------------------------------------------
  575.   #不知道这个做什么用的
  576.   def flash_data=(value)
  577.     @flash_data = value
  578.   end
  579.   #---------------------------------------------------------------------------
  580.   def update
  581.     if @count1 == ANI
  582.       @count1 = 0
  583.       self.count += 1
  584.     else
  585.       @count1 += 1
  586.     end
  587.   end
  588.   #---------------------------------------------------------------------------
  589.   def count=(value)
  590.     value = 0 if value >= 3
  591.     @count = value
  592.     for i in @switches.keys
  593.       id = @map_data[i[0], i[1], i[2]]
  594.       @backs[i].bitmap = @backbitmap[id + value * 10000]
  595.     end
  596.   end
  597.   #--------------------------------------------------------------------------
  598.   def visible=(value)
  599.     @visible = value
  600.     for i in @backs.values
  601.       i.visible = value
  602.     end
  603.   end
  604.   #--------------------------------------------------------------------------
  605.   def ox=(value)
  606.     if @ox != value
  607.       @ox = value
  608.       if value >= (@map_data.xsize * SIZEX - FBLX)
  609.         @lastox += @map_data.xsize * SIZEX if @lastox < (@ox - FBLX)
  610.       end
  611.       #人物走路时候
  612.       if @ox % SIZEX != 0
  613.         for i in @backs.values
  614.           i.ox = @ox - @lastox
  615.         end
  616.       else
  617.         refreshox
  618.         @lastox = @ox
  619.       end
  620.     end
  621.   end
  622.   #--------------------------------------------------------------------------
  623.   def oy=(value)
  624.     if @oy != value
  625.       @oy = value
  626.       if value >= (@map_data.ysize * SIZEY - FBLY)
  627.         @lastoy += @map_data.ysize * SIZEY if @lastoy < (@oy - FBLY)
  628.       end
  629.       #人物走路时候
  630.       if @oy % SIZEY != 0
  631.         for i in @backs.values
  632.           i.oy = @oy - @lastoy
  633.         end
  634.       else
  635.         refreshoy
  636.         @lastoy = @oy
  637.       end
  638.     end
  639.   end
  640. end
复制代码
  1. class Loading < Window_Base
  2.   attr_accessor :num
  3.   attr_accessor :nth
  4.   def initialize(num, text = "Loading...", color = Color.new(255,255,255))
  5.     super(64,192,418,80)
  6.     if text.is_a?(Bitmap)
  7.       self.contents.blt((self.contents.width - text.width) / 2, 0, text, text.rect)
  8.     elsif text.is_a?(Array)
  9.       text[1].is_a?(Color) ? self.contents.font.color = text[1] : self.contents.font = text[1]
  10.       text = text[0]
  11.     end   
  12.     if text.is_a?(String)
  13.       rect = contents.text_size(text)
  14.       rect.width = self.contents.width
  15.       self.contents.draw_text(rect,text,1)
  16.     end
  17.     @num = num
  18.     @nth = 0
  19.     @color = color
  20.     Graphics.update
  21.   end
  22.   def next(nth = 1)
  23.     @nth += nth
  24.     rect = Rect.new(0, 24, self.contents.width * @nth / @num, 24)
  25.     if @color.is_a?(Color)
  26.       self.contents.fill_rect(rect, @color)
  27.     elsif @color.is_a?(Array)
  28.       self.contents.gradient_fill_rect(rect, @color[0], @color[1])
  29.     else
  30.       rect.y = 0
  31.       self.contents.blt(0, 24, @color, rect)
  32.     end
  33.     Graphics.update
  34.   end
  35. end
复制代码
  1. class Tilemap
  2.   def to_bitmap(down, up)
  3.     temp = cachebitmap(down)
  4.     temp.blt(0, 0, cachebitmap(up), Rect.new(0,0,32,32))
  5.     return temp
  6.   end
  7. end
  8. temp = load_data("Data/System.rvdata").start_map_id
  9. raise "玩家起始位置没有被指定" if temp == 0
  10. map_name = sprintf("Data/Map%03d.rvdata", temp)
  11. @map = load_data(map_name)
  12. raise "必须设置远景图" if @map.parallax_name.nil?
  13. file = Cache.parallax(@map.parallax_name)
  14. raise "图片长宽必须能被32整除" unless file.width % 32 == 0 and file.height % 32 == 0
  15. width = file.width / 32
  16. height = file.height / 32
  17. @loading = Loading.new(width * height + 5, "绘制地图中")
  18. @down = []
  19. @up = []
  20. @map.width.times do |x|
  21.   @map.height.times do |y|
  22.     down = @map.data[x,y,1]
  23.     down = @map.data[x,y,0] if down #这里没写好,不过不影响测试
  24.     down = down - 2048
  25.     down -= down % 48
  26.     down += 2048   
  27.     @down.push down
  28.     @up.push @map.data[x,y,2]
  29.   end
  30. end
  31. @loading.next
  32. @up.push 0
  33. @down.uniq!
  34. @up.uniq!
  35. tilemap = Tilemap.new
  36. tilemap.bitmaps[0] = Cache.system("TileA1")
  37. tilemap.bitmaps[1] = Cache.system("TileA2")
  38. tilemap.bitmaps[2] = Cache.system("TileA3")
  39. tilemap.bitmaps[3] = Cache.system("TileA4")
  40. tilemap.bitmaps[4] = Cache.system("TileA5")
  41. tilemap.bitmaps[5] = Cache.system("TileB")
  42. tilemap.bitmaps[6] = Cache.system("TileC")
  43. tilemap.bitmaps[7] = Cache.system("TileD")
  44. tilemap.bitmaps[8] = Cache.system("TileE")
  45. tilemap.map_data = @map.data
  46. @tiles = []
  47. @loading.next
  48. @down.each do |down|
  49.   @up.each do |up|
  50.     @tiles.push tilemap.to_bitmap(down, up)
  51.   end
  52. end
  53. @loading.next
  54. @red = Table.new(32,32,@tiles.size)
  55. @green = Table.new(32,32,@tiles.size)
  56. @blue = Table.new(32,32,@tiles.size)
  57. @tiles.each_index do |index|
  58.   32.times do |x|
  59.     32.times do |y|
  60.       temp = @tiles[index].get_pixel(x,y)
  61.       @red[x,y,index] = temp.red.to_i
  62.       @green[x,y,index] = temp.green.to_i
  63.       @blue[x,y,index] = temp.blue.to_i
  64.     end
  65.   end
  66. end
  67. @loading.next
  68. @map.width = width
  69. @map.height = height
  70. @map.data.resize(width, height, 3)
  71. @loading.next
  72. width.times do |x|
  73.   height.times do |y|
  74.     ox = x * 32
  75.     oy = y * 32
  76.     #↓↓↓↓↓↓↓↓↓核心算法↓↓↓↓↓↓↓↓↓
  77.     @diff = []
  78.     @red.zsize.times do |z|
  79.       @diff.push 0
  80.       32.times do |px|
  81.         32.times do |py|
  82.           temp = file.get_pixel(ox + px, oy + py)
  83.           @diff[-1] += (temp.red.to_i - @red[px, py, z]).abs + (temp.green.to_i - @green[px, py, z]).abs + (temp.blue.to_i - @red[px, py, z]).abs
  84.         end
  85.       end
  86.     end
  87.     #↑↑↑↑↑↑↑↑↑核心算法↑↑↑↑↑↑↑↑↑
  88.     temp = @diff.index(@diff.min)
  89.     down = @down[temp / @up.size]
  90.     if down #这里没写好,too,不影响测试,too
  91.       @map.data[x,y,0] = down
  92.       @map.data[x,y,1] = 0
  93.     else
  94.       @map.data[x,y,0] = 0
  95.       @map.data[x,y,1] = down
  96.     end
  97.     @map.data[x,y,2] = @up[temp % @up.size]
  98.     @loading.next
  99.   end
  100. end
  101. tilemap.dispose
  102. @loading.dispose
  103. save_data(@map, map_name)
复制代码


根据一张图片来绘制地图(RA2地图编辑器里就有这种功能)
因为没有高速的图片模糊匹配算法,所以受到很多限制,并且速度和精度都很……
第一个脚本是kissye的Tilemap
第二个是loading窗口
第三个是主程序

使用说明:
把那三个脚本插进main前,顺序不要弄反
在一张地图里设好主角初始位置
把需要画地图的图片导入进远景,把主角初始位置所在地图的远景设成那张图
(注意图片的长宽必须都能被32整除)
然后在这张地图里画出几种A图块(图块种类越少,速度越快)这些图块就是画出的地图里将会出现的
注意不要用
不要有B~E图块
(脚本还没写完,这些不支持)

然后按F12开始画地图,画完后关闭RMVX,再打开
手动对地图做一些修正


由于没有好的算法,这个脚本实用度很低,开始画出的A图块对绘制地图有很关键的影响

下面是一个例子:
三国群英传6的地图,网上的攻略提供的地图放大5倍
(万恶的文字啊,干扰很大)


画出来的地图


后把白色部分画上城堡,然后把大部分地区用油漆桶涂成草地,把海连起来


然后对照地图画上桥、山、雪地,完工(我对三国地图不是很熟悉,所以就不画了)

范例工程:http://rpg.blue/upload_program/d/zh99998_Project29_106003182.rar

评分

参与人数 1星屑 +2 收起 理由
lzy136188230 + 2 精品文章

查看全部评分

rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上

Lv1.梦旅人

梦石
0
星屑
90
在线时间
308 小时
注册时间
2010-8-10
帖子
794
23
发表于 2010-8-12 08:09:55 | 只看该作者
好东西  当然要顶
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
280
在线时间
20 小时
注册时间
2010-7-24
帖子
72
22
发表于 2010-8-11 20:59:30 | 只看该作者
额,看的好晕啊……但是应该是很不错的
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
7 小时
注册时间
2008-5-20
帖子
53
21
发表于 2010-7-22 09:16:46 | 只看该作者
测试了一下,本来画小地图用不到,想画大地图才琢磨着这个自动画图脚本,但是时间等的太久了。。。不过还是要支持一下的,优化下速度的才实用的起来
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
7 小时
注册时间
2008-5-20
帖子
53
20
发表于 2010-7-22 09:15:10 | 只看该作者
太慢了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

19
发表于 2010-7-5 16:47:17 | 只看该作者
直接边缘化就好了嘛。。
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
555
在线时间
2 小时
注册时间
2008-9-18
帖子
2
18
发表于 2010-2-2 20:21:50 | 只看该作者
呵~!
现在的人啊~~唉
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2008-5-9
帖子
123
17
发表于 2008-11-24 21:45:39 | 只看该作者
最懒画地图了,有这个很好,但是希望完善一下。
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

16
发表于 2008-11-24 01:40:46 | 只看该作者
算法的没有,论文的一只:http://www.image2003.com/paper/open.asp?ID=12471
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

15
 楼主| 发表于 2008-11-16 05:05:49 | 只看该作者
顶起我的被无视的脚本……
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-30 17:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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