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

Project1

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

咱也来研究下那啥万恶的TILEMAP-_-0

 关闭 [复制链接]

Lv4.逐梦者

梦石
1
星屑
10043
在线时间
4430 小时
注册时间
2005-10-22
帖子
6952

开拓者贵宾

跳转到指定楼层
1
发表于 2009-5-13 22:09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
  1. class Tilemap
  2. FBLX = (640/32.0).ceil*32#x方向解析度
  3. FBLY = (480/32.0).ceil*32#y方向解析度
  4. SIZEX = 32
  5. SIZEY = 32
  6. ANI = 15#動畫等待楨數
  7. #以下畫元件用
  8. AUTO_XY = [
  9.    [8, 8, 8, 8], [3, 8, 8, 8], [8, 3, 8, 8], [3, 3, 8, 8],
  10.      [8, 8, 8, 3], [3, 8, 8, 3], [8, 3, 8, 3], [3, 3, 8, 3],
  11.      [8, 8, 3, 8], [3, 8, 3, 8], [8, 3, 3, 8], [3, 3, 3, 8],
  12.      [8, 8, 3, 3], [3, 8, 3, 3], [8, 8, 3, 3], [3, 3, 3, 3],
  13.      [7, 7, 7, 7], [7, 3, 7, 7], [7, 7, 7, 3], [7, 3, 7, 3],
  14.      [5, 5, 5, 5], [5, 5, 5, 3], [5, 5, 3, 5], [5, 5, 3, 3],
  15.      [9, 9, 9, 9], [9, 9, 3, 9], [3, 9, 9, 9], [3, 9, 3, 9],
  16.      [11, 11, 11, 11], [3, 11, 11, 11], [11, 3, 11, 11], [3, 3, 11, 11],
  17.      [7, 9, 7, 9], [5, 5, 11, 11], [4, 4, 4, 4], [4, 4, 4, 3],
  18.      [6, 6, 6, 6], [6, 6, 3, 6], [12, 12, 12, 12], [3, 12, 12, 12],
  19.      [10, 10, 10, 10], [10, 3, 10, 10], [4, 6, 4, 6], [4, 4, 10, 10],
  20.      [10, 12, 10, 12], [6, 6, 12, 12], [4, 6, 10, 12], [1, 1, 1, 1]
  21. ]
  22. #--------------------------------------------------------------------------
  23. # ● 定義外部變數
  24. #--------------------------------------------------------------------------
  25. attr_accessor :autotiles
  26. attr_accessor :tileset
  27. attr_reader   :ox
  28. attr_reader   :oy

  29. attr_accessor :priorities

  30. #--------------------------------------------------------------------------
  31. # ● 初始化物件
  32. #--------------------------------------------------------------------------
  33. def initialize(viewport = nil)
  34.    @shadow = Bitmap.new(SIZEX, SIZEY)
  35.    @shadow.fill_rect(0, 0, 17, SIZEY, Color.new(0, 0, 0, 120))#陰影
  36.    @viewport = viewport
  37.    @bitmaps = []
  38.    @tileset = nil
  39.    @autotiles= []
  40.    @backs = {}#元件精靈
  41.    @backbitmap = {}#元件圖塊
  42.    @switches = {}#動畫開關
  43.    @count = 0#當前顯示動畫
  44.    @count1 = 0#等待楨數
  45.    @visible = true
  46.    @ox = $game_map.display_x / 4
  47.    @oy = $game_map.display_y / 4
  48.    @lastox = $game_map.display_x / 4
  49.    @lastoy = $game_map.display_y / 4
  50. end
  51. #--------------------------------------------------------------------------
  52. # ● 釋放
  53. #--------------------------------------------------------------------------
  54. def dispose
  55.    for i in @backbitmap.values
  56.      i.dispose
  57.    end
  58.    for i in @backs.values
  59.      i.dispose
  60.    end
  61.    @shadow.dispose
  62. end
  63. #--------------------------------------------------------------------------
  64. # ● 是否已釋放
  65. #--------------------------------------------------------------------------
  66. def disposed?
  67.    return @shadow.disposed?
  68. end
  69. #---------------------------------------------------------------------------
  70. #---------------------------------------------------------------------------
  71. def map_data=(value)
  72.    @map_data = value
  73.    #如果地圖太大,按ESC打開功能表後返回地圖太慢,下面這段迴圈可以不要
  74.   # for i in 0...value.xsize
  75.   #   for j in 0...value.ysize
  76.   #     for k in 0..2
  77.   #       cachebitmap(value[i, j, k])
  78.   #     end
  79.   #   end
  80.   # end
  81.    #如果地圖太大,按ESC打開功能表後返回地圖太慢,上面這段迴圈可以不要
  82.    redrawmap
  83. end

  84. def redrawmap()
  85.    #需要重新描繪的圖快
  86.    if @map_data.xsize * SIZEX <= FBLX
  87.      rangei = ([@ox / SIZEX - 1,0].max)..[[((@ox + FBLX) / SIZEX), FBLX / SIZEX - 1].min,@map_data.xsize-1].min
  88.    else
  89.      rangei = ([@ox / SIZEX - 1,0].max)..([(@ox + FBLX) / SIZEX, @map_data.xsize-1].min)
  90.    end
  91.    if @map_data.ysize * SIZEY <= FBLY
  92.      rangej = ([@oy / SIZEY - 1,0].max)..[[((@oy + FBLY) / SIZEY), FBLY / SIZEY - 1].min,@map_data.ysize-1].min
  93.    else
  94.      rangej = ([@oy / SIZEY - 1,0].max)..([(@oy + FBLY) / SIZEY, @map_data.ysize-1].min)
  95.    end
  96.    for i in rangei
  97.      for j in rangej
  98.        for k in 0..2
  99.          draw(i, j, k)
  100.        end
  101.      end
  102.    end
  103. end

  104. #--------------------------------------------------------------------------
  105. def refreshox
  106.    #需要釋放掉的圖塊
  107.    rangej = ([@lastoy / SIZEY - 1,0].max)..([(@lastoy + FBLY) / SIZEY, @map_data.ysize-1].min)
  108.    if @ox > @lastox
  109.      rangei = (([@lastox / SIZEX - 1,0].max)...[(@ox / SIZEX - 1), @map_data.xsize-1].min)
  110.    elsif @ox <= @lastox
  111.      rangei = (([(@ox + FBLX) / SIZEX + 1,0].max)..[((@lastox + FBLX) / SIZEX),@map_data.xsize-1].min)
  112.    end
  113.    #p rangej,rangei,1
  114.    if (rangei != nil and rangej != nil)
  115.    for i in rangei
  116.      for j in rangej
  117.        for k in 0..2
  118.          next if @backs[[i, j, k]].nil?
  119.          @backs[[i, j, k]].dispose
  120.          @backs.delete([i, j, k])
  121.          @switches.delete([i, j, k])
  122.        end
  123.      end
  124.    end
  125.    end
  126.    #恢復走路時候的偏移
  127.    if @ox >= (@map_data.xsize * SIZEX - FBLX)
  128.      for i in @backs.keys
  129.        @backs[i].ox = 0
  130.        @backs[i].x = i[0] * SIZEX - @ox
  131.        if i[0] < (@ox / 32 - 1)
  132.          @backs[i].x += @map_data.xsize * SIZEX
  133.        elsif i[0] == -1
  134.          @backs[i].x = 0
  135.        end
  136.      end
  137.    else
  138.      for i in @backs.keys
  139.        @backs[i].ox = 0
  140.        @backs[i].x = i[0] * SIZEX - @ox
  141.      end
  142.    end
  143.    #需要重新描繪的圖快
  144.    rangej = ([@oy / SIZEY - 1,0].max)..([(@oy + FBLY) / SIZEY,@map_data.ysize-1].min)
  145.    if @ox > @lastox
  146.      rangei = ([[((@lastox + FBLX) / SIZEX + 1), (@ox / SIZEX - 1)].max,0].max..[((@ox + FBLX) / SIZEX + 1),@map_data.xsize-1].min)
  147.    elsif @ox < @lastox
  148.      rangei = ([(@ox / SIZEX - 1),0].max...[[(@lastox / SIZEX - 1), (@ox + FBLX) / SIZEX + 1].min,@map_data.xsize-1].min)
  149.    end
  150.    #p rangej,rangei,2
  151.    if (rangei != nil and rangej != nil)
  152.    for i in rangei
  153.      for j in rangej
  154.        for k in 0..2
  155.          draw(i, j, k,true)
  156.        end
  157.      end
  158.    end
  159.   end
  160. #redrawmap
  161. #p @backs.size
  162. #p @backs
  163. end
  164. #--------------------------------------------------------------------------
  165. def refreshoy
  166.    #需要釋放掉的圖塊
  167.    rangei = ([@lastox / SIZEX - 1,0].max)..([(@lastox + FBLX) / SIZEX, @map_data.xsize-1].min)
  168.    if @oy > @lastoy
  169.      rangej = ([(@lastoy / SIZEY - 1),0].max...[(@oy / SIZEY - 1), @map_data.ysize-1].min)
  170.    elsif @oy <= @lastoy
  171.      rangej = ([((@oy + FBLY) / SIZEY + 1),0].max..[((@lastoy + FBLY) / SIZEY), @map_data.ysize-1].min)
  172.    end
  173.    for i in rangei
  174.      for j in rangej
  175.        for k in 0..2
  176.          next if @backs[[i, j, k]].nil?
  177.          @backs[[i, j, k]].dispose
  178.          @backs.delete([i, j, k])
  179.          @switches.delete([i, j, k])
  180.        end
  181.      end
  182.    end
  183.    #恢復走路時候的偏移
  184.    if @oy >= (@map_data.ysize * SIZEY - FBLY)
  185.      for i in @backs.keys
  186.        @backs[i].oy = 0
  187.        @backs[i].y = i[1] * SIZEY - @oy
  188.        if i[1] < (@oy / 32 - 1)
  189.          @backs[i].y += @map_data.ysize * SIZEY
  190.        elsif i[1] == -1
  191.          @backs[i].y = 0
  192.        end
  193.      end
  194.    else
  195.      for i in @backs.keys
  196.        @backs[i].oy = 0
  197.        @backs[i].y = i[1] * SIZEY - @oy
  198.      end
  199.    end
  200.    #需要重新描繪的圖快
  201.    rangei = ([@ox / SIZEX - 1,0].max)..([(@ox + FBLX) / SIZEX, @map_data.xsize-1].min)
  202.    if @oy > @lastoy
  203.      rangej = ([[((@lastoy + FBLY) / SIZEY + 1), @oy / SIZEY - 1].max,0].max..[((@oy + FBLY) / SIZEY), @map_data.ysize-1].min)
  204.    elsif @oy < @lastoy
  205.      rangej = ([(@oy / SIZEY - 1),0].max...[[(@lastoy / SIZEY - 1), ((@oy + FBLY) / SIZEY + 1)].min, @map_data.ysize-1].min)
  206.    end
  207.    for i in rangei
  208.      for j in rangej
  209.        for k in 0..2
  210.          draw(i, j, k)
  211.        end
  212.      end
  213.    end
  214.    ############
  215.    #for i in @backs.keys
  216.    #  id = @map_data[i[0],i[1],i[2]]
  217.    #  if @priorities[id] != 0
  218.    #  @backs[i].z = 32 + (i[1] * SIZEY - @oy )  + 32 * @priorities[id]
  219.      #@backs[i].bitmap.clear
  220.      #@backs[i].bitmap.draw_text(0,0,32,32,"#{@backs[i].z}")
  221.    #  end
  222.    #end
  223.    ##############
  224. #   redrawmap
  225. end
  226. #--------------------------------------------------------------------------
  227. def resetp(i,j,k)
  228.    return if @passages.nil?
  229.    return if @priorities.nil?
  230.    #return unless @passages[id] == 22
  231.    #@backs[[i, j, k]].z = 200
  232.    id = @map_data[i, j, k]
  233.    if @priorities[id] == 0 #or @priorities[id] == 22
  234.        @backs[[i, j, k]].z = 0
  235.       else
  236.       tt =   32 + (j * SIZEY - @oy )  + 32 * @priorities[id]
  237.       if tt < 0
  238.         tt = 0
  239.       end
  240.        @backs[[i, j, k]].z =  tt
  241.      end
  242.   end
  243.   
  244.   
  245.    

  246. #i為x座標,j為y座標,k為圖層
  247. def draw(i, j, k,old = false)
  248.    i0 = i
  249.    j0 = j
  250.    i -= @map_data.xsize if i >= @map_data.xsize
  251.    i += @map_data.xsize if i < 0
  252.    j -= @map_data.ysize if j >= @map_data.ysize
  253.    j += @map_data.ysize if j < 0
  254.    id = @map_data[i, j, k]
  255.    if old
  256.      ttx = @lastox
  257.      tty = @lastoy
  258.    else
  259.      ttx = @ox
  260.      tty = @oy
  261.    end
  262.    return if id == 0
  263.    unless @backs[[i, j, k]].nil?
  264.      unless @backs[[i, j, 3]].nil?
  265.        @backs[[i, j, 3]].x = i0 * SIZEX - ttx
  266.        @backs[[i, j, 3]].y = j0 * SIZEY - tty
  267.      end
  268.      @backs[[i, j, k]].x = i0 * SIZEX - ttx
  269.      @backs[[i, j, k]].y = j0 * SIZEY - tty
  270.      return
  271.    end
  272.    @backs[[i, j, k]] = Sprite.new(@viewport)
  273.    @backs[[i, j, k]].x = i0 * SIZEX - ttx
  274.    @backs[[i, j, k]].y = j0 * SIZEY - tty
  275.    @backs[[i, j, k]].z = 0
  276.    
  277.    @backs[[i, j, k]].bitmap = cachebitmap(id)
  278.    if id < 384
  279.      if @backbitmap[id + 10000] != nil
  280.        #動畫
  281.        @switches[[i, j, k]] = true
  282.        @backs[[i, j, k]].bitmap = @backbitmap[id + @count * 10000]
  283.      end
  284.    end
  285.    return if @passages.nil?
  286.    return if @priorities.nil?
  287.    #return unless @passages[id] == 22
  288.    #@backs[[i, j, k]].z = 200
  289.    resetp(i,j,k)
  290. end
  291. #---------------------------------------------------------------------------
  292. def cachebitmap(id)
  293.    if @backbitmap[id].nil?
  294.      if id < 384#自動元件的情況
  295.        bitmapid = (id - (id % 48)) / 48 - 1
  296.        @backbitmap[id] = drawbitmap1(id, bitmapid)
  297.        if @autotiles[bitmapid].width > 96
  298.          @backbitmap[id + 10000] = drawbitmap1(id, bitmapid, 1)
  299.          @backbitmap[id + 20000] = drawbitmap1(id, bitmapid, 2)
  300.          @backbitmap[id + 30000] = drawbitmap1(id, bitmapid, 3)
  301.        end
  302.      else
  303.        rect = Rect.new((id - 384) % 8 * SIZEX, (id - 384) / 8 * SIZEY, 32, 32)
  304.        @backbitmap[id] = Bitmap.new(32, 32)
  305.        @backbitmap[id].blt(0, 0, @tileset, rect)
  306.      end
  307.    end
  308.    return @backbitmap[id]
  309. end
  310. #---------------------------------------------------------------------------
  311. #此處的x,y指圖片上的xy位置,id範圍為48-383,bitmapid為圖片編號
  312. def drawbitmap1(id, bitmapid, ani = 0)
  313.    bitmap = Bitmap.new(32, 32)
  314.    pic_id = id % 48
  315.    for i in 0..3
  316.      rect_x = (AUTO_XY[pic_id][i] - 1) % 3
  317.      rect_y = (AUTO_XY[pic_id][i] - 1 - rect_x) / 3
  318.      x = (i % 2) * 16
  319.      y = (i - (x / 16)) / 2 * 16
  320.      bitmap.blt(x, y, @autotiles[bitmapid], Rect.new(rect_x * 32 + x + ani * 96, rect_y * 32 + y, 16, 16))
  321.    end
  322.    return bitmap
  323. end
  324. #---------------------------------------------------------------------------
  325. def priorities=(value)
  326.    @priorities = value
  327.    @passages = value
  328.   # resetppp()
  329.   # redrawmap
  330.   # for i in ([@ox / SIZEX - 1, 0].max)..((@ox + FBLX) / SIZEX)
  331.   #   for j in ([@oy / SIZEY - 1, 0].max)..((@oy + FBLY) / SIZEY)
  332.   #     for kk in 0..2
  333.   #     id = @map_data[i, j, 3-kk]
  334.   #     if id.nil?
  335.   #       next
  336.   #     end
  337.        #unless value[id] == 22
  338.        #  next
  339.        #end
  340.   #     if value[id] == 0
  341.   #     @backs[[i, j, 3-kk]].z = 0
  342.   #     else
  343.   #     @backs[[i, j, 3-kk]].z = 32 + @backs[[i, j, 3]].y * 32 + 32 * value[id]
  344.   #     end
  345.   #     break
  346.   #     end
  347.   #   end
  348.   # end
  349. end
  350. #--------------------------------------------------------------------------
  351. def ox=(value)
  352.    if @ox != value
  353.      @ox = value
  354.      if value >= (@map_data.xsize * SIZEX - FBLX)
  355.        @lastox += @map_data.xsize * SIZEX if @lastox < (@ox - FBLX)
  356.      end
  357.      #人物走路時候
  358.      if @ox % (SIZEX/2) != 0
  359.        for i in @backs.values
  360.          i.ox = @ox - @lastox
  361.        end
  362.      else
  363.        refreshox
  364.        @lastox = @ox
  365.      end
  366.    end
  367. end
  368. #--------------------------------------------------------------------------
  369. def oy=(value)
  370.    if @oy != value
  371.      @oy = value
  372.      if value >= (@map_data.ysize * SIZEY - FBLY)
  373.        @lastoy += @map_data.ysize * SIZEY if @lastoy < (@oy - FBLY)
  374.      end
  375.      #人物走路時候
  376.      if @oy % SIZEY != 0
  377.        for i in @backs.values
  378.          i.oy = @oy - @lastoy
  379.        end
  380.      else
  381.        refreshoy
  382.        @lastoy = @oy
  383.      end
  384.    end
  385. end
  386. #---------------------------------------------------------------------------
  387. def count=(value)
  388.    value = 0 if value >= 4
  389.    @count = value
  390.    for i in @switches.keys
  391.      id = @map_data[i[0], i[1], i[2]]
  392.      @backs[i].bitmap = @backbitmap[id + value * 10000]
  393.    end
  394. end
  395. #---------------------------------------------------------------------------
  396. def update
  397.    if @count1 == ANI
  398.      @count1 = 0
  399.      self.count = @count+1
  400.    else
  401.      @count1 += 1
  402.    end
  403.    for i in @backs.keys
  404.      id = @map_data[i[0],i[1],i[2]]
  405.      if @priorities[id] != 0
  406.      @backs[i].z = 32 + (i[1] * SIZEY - @oy )  + 32 * @priorities[id]
  407.      end
  408.    end
  409. end
  410. end
复制代码



不是完全原创脚本,是从某一脚本的基础上改的(嗯,今天翻硬盘时翻到的),请原作者认领一下-_-0

我的修改部分:
1,修正了原作者对RMXP说明文件中无视的一条东西:
优先级为 0 的地图元件的 Z 座标必定是 0。

2,加入了地图元件优先级的正确显示(呃...原来脚本好像啥东西Z坐标都一样-_-0)

3,原作者的脚本中DRAW函数(现在已经被我拆成2个了) 有一处X和Y写错的地方,会导致Y轴移动和场景转换时的一些问题

4,呃...好像没了....

具体用途,纯粹做技术参考....
实用性方面,貌似除了丢去某邪恶的RMXP套RMVX库的诡异开发框架作为TILEMAP的替换外没啥别的功能(嗯...而对这方面比较关注的也就搞笑艺人团体了...在这里貌似不会有多少人干这么诡异的事-_-0,实际上,我非常怀疑这是一个唯一符合那种技术框架下要求的国产TILEMAP类-_-0)

总结,我是来打酱油的...大家爱怎么办怎么办吧-_-0

由于是新鲜出炉,过完测试直接丢出来的东西,一堆测试用代码变注释没删-_-0

还有UPDATA里那个Z轴刷新,不知道谁有办法把那东西丢到别的地方去判断么...

Lv1.梦旅人

梦·贤者

梦石
0
星屑
50
在线时间
1141 小时
注册时间
2007-12-15
帖子
4100
2
发表于 2009-5-13 22:49:11 | 只看该作者
太深奥,不懂的人飘过~
http://rpg.blue/home.php?mod=space&uid=34951&do=blog&id=12799
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
41 小时
注册时间
2008-3-5
帖子
2072
3
发表于 2009-5-14 04:33:30 | 只看该作者
能否请改善下能在1024*768的地图下人物速度6时不卡
你它囧一字母君谁记得……
当时那把剑离我的喉咙只有0.01工分。可是一柱香之后,这个女主人会深深的爱上我,虽然本人平生说了无数的谎话,可是这句最有效:“你应该这么做,我也应该死。
曾经有一取ID的机会放在我面前,我没有珍惜,等我失去的时候我才后悔莫及,人世间最痛苦的事莫过于此。你的剑在我的咽喉上割下去吧!不用再犹豫了!如果上天能够给我一个再来一次的机会,我绝对会取个汉字君。如果非要给这ID加点修饰的话,我希望是……红色加粗……

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
10043
在线时间
4430 小时
注册时间
2005-10-22
帖子
6952

开拓者贵宾

4
 楼主| 发表于 2009-5-14 23:01:09 | 只看该作者
以下引用hitlerson于2009-5-13 20:33:30的发言:

能否请改善下能在1024*768的地图下人物速度6时不卡

呃...那个....RMXP的地图大小限制不是最大只能500*500么-_-0
分辨率默认最大也只有640*480
如果用其它脚本改了分辨率的话,可能还要考虑一下其它因素...这个暂时没什么改进思路{/gg}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
62
在线时间
1 小时
注册时间
2008-1-4
帖子
260
5
发表于 2009-5-16 17:22:27 | 只看该作者
楼主是高手,鉴定完毕
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-5-12
帖子
41
6
发表于 2009-5-16 17:37:15 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
7
发表于 2009-7-3 17:55:45 | 只看该作者
抱歉,
那是我根據kissye的VX版tilemap做修改的
有些小細節沒注意到

謝謝
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
8
发表于 2009-7-5 14:34:40 | 只看该作者
感謝閣下的協助
我又寫出新的腳本
把多餘部分刪除
優化
加上flash_data的功能
http://rpg.blue/viewthread.php?tid=127629
回复 支持 反对

使用道具 举报

Lv1.梦旅人

女神控

梦石
0
星屑
49
在线时间
141 小时
注册时间
2008-9-24
帖子
1455
9
发表于 2009-7-5 15:29:26 | 只看该作者
什么都不懂的人路过
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 04:13

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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