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

Project1

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

RMXP的Tilemap FPS正常

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
跳转到指定楼层
1
发表于 2008-11-23 17:17:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
這是我參考kiss姐的VX板Tilemap
做出來的
如果有BUG請回復一下

  1. class Tilemap
  2.   FBLX = 640#x方向解析度
  3.   FBLY = 480#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.   #--------------------------------------------------------------------------
  30.   # ● 初始化物件
  31.   #--------------------------------------------------------------------------
  32.   def initialize(viewport = nil)
  33.     @shadow = Bitmap.new(SIZEX, SIZEY)
  34.     @shadow.fill_rect(0, 0, 17, SIZEY, Color.new(0, 0, 0, 120))#陰影
  35.     @viewport = viewport
  36.     @bitmaps = []
  37.     @tileset = nil
  38.     @autotiles= []
  39.     @backs = {}#元件精靈
  40.     @backbitmap = {}#元件圖塊
  41.     @switches = {}#動畫開關
  42.     @count = 0#當前顯示動畫
  43.     @count1 = 0#等待楨數
  44.     @visible = true
  45.     @ox = 0
  46.     @oy = 0
  47.     @lastox = 0
  48.     @lastoy = 0
  49.   end
  50. #--------------------------------------------------------------------------
  51. # ● 釋放
  52. #--------------------------------------------------------------------------
  53.   def dispose
  54.     for i in @backbitmap.values
  55.       i.dispose
  56.     end
  57.     for i in @backs.values
  58.       i.dispose
  59.     end
  60.     @shadow.dispose
  61.   end
  62. #--------------------------------------------------------------------------
  63. # ● 是否已釋放
  64. #--------------------------------------------------------------------------
  65.   def disposed?
  66.     return @shadow.disposed?
  67.   end
  68.   #---------------------------------------------------------------------------
  69.   def map_data=(value)
  70.     @map_data = value
  71.     #如果地圖太大,按ESC打開功能表後返回地圖太慢,下面這段迴圈可以不要
  72.     for i in 0...value.xsize
  73.       for j in 0...value.ysize
  74.         for k in 0..2
  75.           cachebitmap(value[i, j, k])
  76.         end
  77.       end
  78.     end
  79.     #如果地圖太大,按ESC打開功能表後返回地圖太慢,上面這段迴圈可以不要
  80.     #需要重新描繪的圖快
  81.     if @map_data.xsize * SIZEX <= FBLX
  82.       rangei = (@ox / SIZEX - 1)..[((@ox + FBLX) / SIZEX), FBLX / SIZEX - 1].min
  83.     else
  84.       rangei = (@ox / SIZEX - 1)..((@ox + FBLX) / SIZEX)
  85.     end
  86.     if @map_data.xsize * SIZEX <= FBLX
  87.       rangej = (@oy / SIZEY - 1)..[((@oy + FBLY) / SIZEY), FBLY / SIZEY - 1].min
  88.     else
  89.       rangej = (@oy / SIZEY - 1)..((@oy + FBLY) / SIZEY)
  90.     end
  91.     for i in rangei
  92.       for j in rangej
  93.         for k in 0..2
  94.           draw(i, j, k)
  95.         end
  96.       end
  97.     end
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   def refreshox
  101.     #需要釋放掉的圖塊
  102.     rangej = (@lastoy / SIZEY - 1)..((@lastoy + FBLY) / SIZEY)
  103.     if @ox > @lastox
  104.       rangei = ((@lastox / SIZEX - 1)...(@ox / SIZEX - 1))
  105.     elsif @ox < @lastox
  106.       rangei = (((@ox + FBLX) / SIZEX + 1)..((@lastox + FBLX) / SIZEX))
  107.     end
  108.     if (rangei != nil and rangej != nil)
  109.     for i in rangei
  110.       for j in rangej
  111.         for k in 0..2
  112.           next if @backs[[i, j, k]].nil?
  113.           @backs[[i, j, k]].dispose
  114.           @backs.delete([i, j, k])
  115.           @switches.delete([i, j, k])
  116.         end
  117.       end
  118.     end
  119.     end
  120.     #恢復走路時候的偏移
  121.     if @ox >= (@map_data.xsize * SIZEX - FBLX)
  122.       for i in @backs.keys
  123.         @backs[i].ox = 0
  124.         @backs[i].x = i[0] * SIZEX - @ox
  125.         if i[0] < (@ox / 32 - 1)
  126.           @backs[i].x += @map_data.xsize * SIZEX
  127.         elsif i[0] == -1
  128.           @backs[i].x = 0
  129.         end
  130.       end
  131.     else
  132.       for i in @backs.keys
  133.         @backs[i].ox = 0
  134.         @backs[i].x = i[0] * SIZEX - @ox
  135.       end
  136.     end
  137.     #需要重新描繪的圖快
  138.     rangej = (@oy / SIZEY - 1)..((@oy + FBLY) / SIZEY)
  139.     if @ox > @lastox
  140.       rangei = ([((@lastox + FBLX) / SIZEX + 1), (@ox / SIZEX - 1)].max..((@ox + FBLX) / SIZEX))
  141.     elsif @ox < @lastox
  142.       rangei = ((@ox / SIZEX - 1)...[(@lastox / SIZEX - 1), (@ox + FBLX) / SIZEX + 1].min)
  143.     end
  144.     if (rangei != nil and rangej != nil)
  145.     for i in rangei
  146.       for j in rangej
  147.         for k in 0..2
  148.           draw(i, j, k)
  149.         end
  150.       end
  151.     end
  152.     end
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   def refreshoy
  156.     #需要釋放掉的圖塊
  157.     rangei = (@lastox / SIZEX - 1)..((@lastox + FBLX) / SIZEX)
  158.     if @oy > @lastoy
  159.       rangej = ((@lastoy / SIZEY - 1)...(@oy / SIZEY - 1))
  160.     elsif @oy < @lastoy
  161.       rangej = (((@oy + FBLY) / SIZEY + 1)..((@lastoy + FBLY) / SIZEY))
  162.     end
  163.     for i in rangei
  164.       for j in rangej
  165.         for k in 0..2
  166.           next if @backs[[i, j, k]].nil?
  167.           @backs[[i, j, k]].dispose
  168.           @backs.delete([i, j, k])
  169.           @switches.delete([i, j, k])
  170.         end
  171.       end
  172.     end
  173.     #恢復走路時候的偏移
  174.     if @oy >= (@map_data.ysize * SIZEY - FBLY)
  175.       for i in @backs.keys
  176.         @backs[i].oy = 0
  177.         @backs[i].y = i[1] * SIZEY - @oy
  178.         if i[1] < (@oy / 32 - 1)
  179.           @backs[i].y += @map_data.ysize * SIZEY
  180.         elsif i[1] == -1
  181.           @backs[i].y = 0
  182.         end
  183.       end
  184.     else
  185.       for i in @backs.keys
  186.         @backs[i].oy = 0
  187.         @backs[i].y = i[1] * SIZEY - @oy
  188.       end
  189.     end
  190.     #需要重新描繪的圖快
  191.     rangei = (@ox / SIZEX - 1)..((@ox + FBLX) / SIZEX)
  192.     if @oy > @lastoy
  193.       rangej = ([((@lastoy + FBLY) / SIZEY + 1), @oy / SIZEY - 1].max..((@oy + FBLY) / SIZEY))
  194.     elsif @oy < @lastoy
  195.       rangej = ((@oy / SIZEY - 1)...[(@lastoy / SIZEY - 1), ((@oy + FBLY) / SIZEY + 1)].min)
  196.     end
  197.     for i in rangei
  198.       for j in rangej
  199.         for k in 0..2
  200.           draw(i, j, k)
  201.         end
  202.       end
  203.     end
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   #i為x座標,j為y座標,k為圖層
  207.   def draw(i, j, k)
  208.     i0 = i
  209.     j0 = j
  210.     i -= @map_data.xsize if i >= @map_data.xsize
  211.     i += @map_data.xsize if i < 0
  212.     j -= @map_data.ysize if j >= @map_data.ysize
  213.     j += @map_data.ysize if j < 0
  214.     id = @map_data[i, j, k]
  215.     return if id == 0
  216.     unless @backs[[i, j, k]].nil?
  217.       unless @backs[[i, j, 3]].nil?
  218.         @backs[[i, j, 3]].x = i0 * SIZEX - @ox
  219.         @backs[[i, j, 3]].y = j0 * SIZEY - @oy
  220.       end
  221.       @backs[[i, j, k]].x = i0 * SIZEX - @ox
  222.       @backs[[i, j, k]].y = j0 * SIZEY - @oy
  223.       return
  224.     end
  225.     @backs[[i, j, k]] = Sprite.new(@viewport)
  226.     @backs[[i, j, k]].x = i0 * SIZEX - @ox
  227.     @backs[[i, j, k]].y = j0 * SIZEY - @oy
  228.     @backs[[i, j, k]].z = k * 2
  229.     @backs[[i, j, k]].bitmap = cachebitmap(id)
  230.     if id < 384
  231.       if @backbitmap[id + 10000] != nil
  232.         #動畫
  233.         @switches[[i, j, k]] = true
  234.         @backs[[i, j, k]].bitmap = @backbitmap[id + @count * 10000]
  235.       end
  236.     end
  237.     return if @passages.nil?
  238.     return unless @passages[id] == 22
  239.     @backs[[i, j, k]].z = 200
  240.   end
  241.   #---------------------------------------------------------------------------
  242.   def cachebitmap(id)
  243.     if @backbitmap[id].nil?
  244.       if id < 384#自動元件的情況
  245.         bitmapid = (id - (id % 48)) / 48 - 1
  246.         @backbitmap[id] = drawbitmap1(id, bitmapid)
  247.         if @autotiles[bitmapid].width > 96
  248.           @backbitmap[id + 10000] = drawbitmap1(id, bitmapid, 1)
  249.           @backbitmap[id + 20000] = drawbitmap1(id, bitmapid, 2)
  250.           @backbitmap[id + 30000] = drawbitmap1(id, bitmapid, 3)
  251.         end
  252.       else
  253.         rect = Rect.new((id - 384) % 8 * SIZEX, (id - 384) / 8 * SIZEY, SIZEX, SIZEY)
  254.         @backbitmap[id] = Bitmap.new(SIZEX, SIZEY)
  255.         @backbitmap[id].blt(0, 0, @tileset, rect)
  256.       end
  257.     end
  258.     return @backbitmap[id]
  259.   end
  260.   #---------------------------------------------------------------------------
  261.   #此處的x,y指圖片上的xy位置,id範圍為48-383,bitmapid為圖片編號
  262.   def drawbitmap1(id, bitmapid, ani = 0)
  263.     bitmap = Bitmap.new(SIZEX, SIZEY)
  264.     pic_id = id % 48
  265.     for i in 0..3
  266.       rect_x = (AUTO_XY[pic_id][i] - 1) % 3
  267.       rect_y = (AUTO_XY[pic_id][i] - 1 - rect_x) / 3
  268.       x = (i % 2) * 16
  269.       y = (i - (x / 16)) / 2 * 16
  270.       bitmap.blt(x, y, @autotiles[bitmapid], Rect.new(rect_x * 32 + x + ani * 96, rect_y * 32 + y, 16, 16))
  271.     end
  272.     return bitmap
  273.   end
  274.   #---------------------------------------------------------------------------
  275.   def priorities=(value)
  276.     @passages = value
  277.     for i in ([@ox / SIZEX - 1, 0].max)..((@ox + FBLX) / SIZEX)
  278.       for j in ([@oy / SIZEY - 1, 0].max)..((@oy + FBLY) / SIZEY)
  279.         id = @map_data[i, j, 2]
  280.         next if id.nil?
  281.         next unless value[id] == 22
  282.         @backs[[i, j, 2]].z = 200
  283.       end
  284.     end
  285.   end
  286.   #--------------------------------------------------------------------------
  287.   def ox=(value)
  288.     if @ox != value
  289.       @ox = value
  290.       if value >= (@map_data.xsize * SIZEX - FBLX)
  291.         @lastox += @map_data.xsize * SIZEX if @lastox < (@ox - FBLX)
  292.       end
  293.       #人物走路時候
  294.       if @ox % (SIZEX/2) != 0
  295.         for i in @backs.values
  296.           i.ox = @ox - @lastox
  297.         end
  298.       else
  299.         refreshox
  300.         @lastox = @ox
  301.       end
  302.     end
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   def oy=(value)
  306.     if @oy != value
  307.       @oy = value
  308.       if value >= (@map_data.ysize * SIZEY - FBLY)
  309.         @lastoy += @map_data.ysize * SIZEY if @lastoy < (@oy - FBLY)
  310.       end
  311.       #人物走路時候
  312.       if @oy % SIZEY != 0
  313.         for i in @backs.values
  314.           i.oy = @oy - @lastoy
  315.         end
  316.       else
  317.         refreshoy
  318.         @lastoy = @oy
  319.       end
  320.     end
  321.   end
  322.   #---------------------------------------------------------------------------
  323.   def count=(value)
  324.     value = 0 if value >= 4
  325.     @count = value
  326.     for i in @switches.keys
  327.       id = @map_data[i[0], i[1], i[2]]
  328.       @backs[i].bitmap = @backbitmap[id + value * 10000]
  329.     end
  330.   end
  331.   #---------------------------------------------------------------------------
  332.   def update
  333.     if @count1 == ANI
  334.       @count1 = 0
  335.       self.count = @count+1
  336.     else
  337.       @count1 += 1
  338.     end
  339.   end
  340. end
复制代码
RGE这万年大坑 啥时填起来@@

Lv3.寻梦者

梦石
0
星屑
1624
在线时间
1609 小时
注册时间
2007-8-28
帖子
3253

第3届短篇游戏大赛主流游戏组冠军第1届Title华丽大赛新人奖

2
发表于 2008-11-23 19:45:49 | 只看该作者
fps低了不少,再怎么优化还是赶不上自带的。
当你的图大点,或者是用arpg脚本 和3d伪地图脚本的时候明显你这个就掉帧

当然,普通情况下是不掉的。{/hx}
“我推荐你一个游戏吧,avg的,剧情特感人”
“我擦,都是文字图片的游戏有啥好玩的,连个战斗都没有!”
“我推荐你一个游戏吧,rpg的,战斗也新颖”
“我擦,怎么米有作i弊器?“
”你不是喜欢战斗么?”
“不,我是剧情党!!”

继续阅读请点击
http://rpg.blue/blog-53316-10027.html
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

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

烫烫烫开拓者

3
发表于 2008-11-23 20:31:52 | 只看该作者
3d伪地图自带了Tilemap
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
68 小时
注册时间
2007-12-16
帖子
75
4
发表于 2009-7-1 14:58:19 | 只看该作者
突然發現這有個BUG
無視優先級
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

5
发表于 2009-7-2 10:14:55 | 只看该作者
是给XP的FPS提升的么?
回复 支持 反对

使用道具 举报

Lv4.逐梦者

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

开拓者贵宾

6
发表于 2009-7-3 13:28:31 | 只看该作者
突然發現這有個BUG
無視優先級
danny8376 发表于 2009-7-1 14:58


在我的那个修改版里已搞定这个问题


是给XP的FPS提升的么?
越前リョーマ 发表于 2009-7-2 10:14


这是给XP降FPS的 囧  我们永远没法拿RUBY的效率和C++比 囧
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

7
发表于 2009-7-3 13:31:48 | 只看该作者
为什么要做这种东西…… = =
回复 支持 反对

使用道具 举报

Lv4.逐梦者

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

开拓者贵宾

8
发表于 2009-7-3 13:49:42 | 只看该作者
为什么要做这种东西…… = =
越前リョーマ 发表于 2009-7-3 13:31


1,有人想给默认的TILEMAP加点功能
2,有人在XP里面想用VX的库
3,有人只是无聊地进行一些学习性的实验 囧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 06:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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