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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: 黑暗之神
打印 上一主题 下一主题

[10VIP悬赏]有人知道Tilemap这个类是怎么定义的吗?

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2005-10-26
帖子
144
11
 楼主| 发表于 2007-8-3 09:04:32 | 只看该作者
恩,因为不想用两张图制作地图(不过也许可以绘制好把绘制用的图删掉的说)…
总之,切格的话是有考虑过,不过既然暂时解决了就先待命了,待开始制作剧情时看看有什么缺点没有,有的话再改了…现,在游戏中暂时没有发现什么不妥的地方…
在下唯一完整版Game完成…死而无憾了!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
68 小时
注册时间
2007-12-16
帖子
75
12
发表于 2007-12-16 08:53:43 | 只看该作者
這有個腳本

自己寫的

Ver.1.0

不過FPS會降到15

走路時降到5

之前也有個Ver.0.5的

FPS降到30而已

不過沒在現在這台上

  1. #==============================================================================
  2. # Super Tilemap
  3. # 作者:釣到一隻猴子@_@ ( AAM@_@ )
  4. # 版本:Ver.1.0
  5. # 本資訊不得刪除
  6. #==============================================================================
  7. #==============================================================================
  8. # ■ Tilemap
  9. #------------------------------------------------------------------------------
  10. #  顯示地圖的核心。
  11. #==============================================================================

  12. class Tilemap
  13.   #--------------------------------------------------------------------------
  14.   # ● 定量
  15.   #--------------------------------------------------------------------------
  16.   Animated_Autotiles_Frames = 15
  17.   Scroll_Times = 4
  18.   Autotiles = [
  19.     [ [27, 28, 33, 34], [ 5, 28, 33, 34], [27,  6, 33, 34], [ 5,  6, 33, 34],
  20.       [27, 28, 33, 12], [ 5, 28, 33, 12], [27,  6, 33, 12], [ 5,  6, 33, 12] ],
  21.     [ [27, 28, 11, 34], [ 5, 28, 11, 34], [27,  6, 11, 34], [ 5,  6, 11, 34],
  22.       [27, 28, 11, 12], [ 5, 28, 11, 12], [27,  6, 11, 12], [ 5,  6, 11, 12] ],
  23.     [ [25, 26, 31, 32], [25,  6, 31, 32], [25, 26, 31, 12], [25,  6, 31, 12],
  24.       [15, 16, 21, 22], [15, 16, 21, 12], [15, 16, 11, 22], [15, 16, 11, 12] ],
  25.     [ [29, 30, 35, 36], [29, 30, 11, 36], [ 5, 30, 35, 36], [ 5, 30, 11, 36],
  26.       [39, 40, 45, 46], [ 5, 40, 45, 46], [39,  6, 45, 46], [ 5,  6, 45, 46] ],
  27.     [ [25, 30, 31, 36], [15, 16, 45, 46], [13, 14, 19, 20], [13, 14, 19, 12],
  28.       [17, 18, 23, 24], [17, 18, 11, 24], [41, 42, 47, 48], [ 5, 42, 47, 48] ],
  29.     [ [37, 38, 43, 44], [37,  6, 43, 44], [13, 18, 19, 24], [13, 14, 43, 44],
  30.       [37, 42, 43, 48], [17, 18, 47, 48], [13, 18, 43, 48], [ 1,  2,  7,  8] ]
  31.   ]
  32.   #--------------------------------------------------------------------------
  33.   # ● 定義外部變數
  34.   #--------------------------------------------------------------------------
  35.   attr_reader :layers
  36.   attr_accessor :tileset
  37.   attr_accessor :autotiles
  38.   attr_accessor :map_data
  39.   attr_accessor :flash_data
  40.   attr_accessor :priorities
  41.   attr_accessor :visible
  42.   attr_accessor :ox
  43.   attr_accessor :oy
  44.   attr_accessor :tone
  45.   attr_accessor :zoom_x
  46.   attr_accessor :zoom_y
  47.   #--------------------------------------------------------------------------
  48.   # ● 初始化
  49.   #--------------------------------------------------------------------------
  50.   def initialize(viewport)
  51.     # 生成圖層
  52.     @layers = []
  53.     for l in 0..5
  54.       layer = Sprite.new(viewport)
  55.       layer.bitmap = Bitmap.new(640, 480)
  56.       layer.z = (l == 0 ? 0 : (64 + 32 * (l - 1)))
  57.       @layers << layer
  58.     end
  59.     # 定義變數
  60.     @tileset    = nil
  61.     @autotiles  = []
  62.     @map_data   = nil
  63.     @flash_data = nil
  64.     @priorities = nil
  65.     @visible    = true
  66.     @ox = @o_ox = 0
  67.     @oy = @o_oy = 0
  68.     @tone       = nil
  69.     @zoom_x     = 1.0
  70.     @zoom_y     = 1.0
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # ● 釋放
  74.   #--------------------------------------------------------------------------
  75.   def dispose
  76.     # 釋放圖層
  77.     for layer in @layers
  78.       layer.dispose
  79.     end
  80.   end
  81.   #--------------------------------------------------------------------------
  82.   # ● 更新
  83.   #--------------------------------------------------------------------------
  84.   def update
  85.     # 地圖資訊更換
  86.     if @o_map_data != @map_data
  87.       @o_map_data = @map_data
  88.       refresh
  89.     end
  90.     # 偏移座標更換
  91.     if @o_ox != @ox or @o_oy != @oy
  92.       sx = @ox - @o_ox
  93.       sy = @oy - @o_oy
  94.       @o_ox = @ox
  95.       @o_oy = @oy
  96.       refresh#_map(sx, sy)
  97.     end
  98.     # 色調更換
  99.     if @o_tone != @tone
  100.       @o_tone = @tone
  101.       @tone = Tone.new(0, 0, 0, 0) if @tone.nil?
  102.       for layer in @layers
  103.         layer.tone = @tone
  104.       end
  105.     end
  106.     # 比例更換
  107.     if @o_zoom_x != @zoom_x
  108.       @o_zoom_x = @zoom_x
  109.       for layer in @layers
  110.         layer.zoom_x = @zoom_x
  111.       end
  112.     end
  113.     if @o_zoom_y != @zoom_y
  114.       @o_zoom_y = @zoom_y
  115.       for layer in @layers
  116.         layer.zoom_y = @zoom_y
  117.       end
  118.     end
  119.     # 自動元件動畫
  120.     if Graphics.frame_count % Animated_Autotiles_Frames == 0
  121.       # 更新自動元件
  122.       refresh_autotiles
  123.     end
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 更新元件
  127.   #--------------------------------------------------------------------------
  128.   def refresh_map(sx, sy)
  129.     # 圖層捲動
  130.     move(0, sx)
  131.     move(0, sy)
  132.     # 循環所有優先級
  133.     for p in 0..5
  134.       # 循環所有圖層
  135.       for z in 0...@map_data.zsize
  136.         # 循環所有X座標
  137.         for x in 0...20
  138.           # 循環所有Y座標
  139.           for y in 0...15
  140.             # 當偏移座標不正常時略過
  141.             next if @ox < 0
  142.             next if @oy < 0
  143.             # 取得元件ID
  144.             mx = @ox / 32
  145.             my = @oy / 32
  146.             id = @map_data[x + mx, y + my, z]
  147.             # 當元件ID不正常時略過
  148.             next if id == 0
  149.             # 當圖層不符時略過
  150.             next unless p == @priorities[id]
  151.             # 描繪元件(自動元件)
  152.             id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
  153.           end
  154.         end
  155.       end
  156.     end
  157.     # 循環所有優先級
  158.     for p in 0..5
  159.       # 循環所有圖層
  160.       for z in 0...@map_data.zsize
  161.         # 循環所有X座標
  162.         for x in 0...20
  163.           # 循環所有Y座標
  164.           for y in 0...15
  165.             # 當偏移座標不正常時略過
  166.             next if @ox < 0
  167.             next if @oy < 0
  168.             # 取得元件ID
  169.             mx = @ox / 32
  170.             my = @oy / 32
  171.             id = @map_data[x + mx, y + my, z]
  172.             # 當元件ID不正常時略過
  173.             next if id == 0
  174.             # 當圖層不符時略過
  175.             next unless p == @priorities[id]
  176.             # 描繪元件(自動元件)
  177.             id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
  178.           end
  179.         end
  180.       end
  181.     end
  182.   end
  183.   #--------------------------------------------------------------------------
  184.   # ● 圖層捲動
  185.   #--------------------------------------------------------------------------
  186.   def move(d, v)
  187.     # 設定單次移動距離
  188.     v /= Scroll_Times
  189.     # 循環次數
  190.     for i in 0...Scroll_Times
  191.       # 判斷方向
  192.       case d
  193.       when 0
  194.         # 移動圖層
  195.         for layer in @layers
  196.           bitmap = layer.bitmap
  197.           layer.bitmap.blt(v, 0, bitmap, Rect.new(0, 0, 640, 480))
  198.         end
  199.       when 1
  200.         # 移動圖層
  201.         for layer in @layers
  202.           bitmap = layer.bitmap
  203.           layer.bitmap.blt(0, v, bitmap, Rect.new(0, 0, 640, 480))
  204.         end
  205.       end
  206.     end
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 初次描繪地圖
  210.   #--------------------------------------------------------------------------
  211.   def refresh
  212.     # 循環所有優先級
  213.     for p in 0..5
  214.       # 循環所有圖層
  215.       for z in 0...@map_data.zsize
  216.         # 循環所有X座標
  217.         for x in 0...20
  218.           # 循環所有Y座標
  219.           for y in 0...15
  220.             # 當偏移座標不正常時略過
  221.             next if @ox < 0
  222.             next if @oy < 0
  223.             # 取得元件ID
  224.             mx = @ox / 32
  225.             my = @oy / 32
  226.             id = @map_data[x + mx, y + my, z]
  227.             # 當元件ID不正常時略過
  228.             next if id == 0
  229.             # 當圖層不符時略過
  230.             next unless p == @priorities[id]
  231.             # 描繪元件(自動元件)
  232.             id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
  233.           end
  234.         end
  235.       end
  236.     end
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   # ● 更新自動元件
  240.   #--------------------------------------------------------------------------
  241.   def refresh_autotiles
  242.     # 循環所有優先級
  243.     for p in 0..5
  244.       # 循環所有圖層
  245.       for z in 0...@map_data.zsize
  246.         # 循環所有X座標
  247.         for x in 0...20
  248.           # 循環所有Y座標
  249.           for y in 0...15
  250.             # 當偏移座標不正常時略過
  251.             next if @ox < 0
  252.             next if @oy < 0
  253.             # 取得元件ID
  254.             mx = @ox / 32
  255.             my = @oy / 32
  256.             id = @map_data[x + mx, y + my, z]
  257.             # 當元件ID不正常時略過
  258.             next if id == 0
  259.             # 當圖層不符時略過
  260.             next unless p == @priorities[id]
  261.             # 描繪元件(自動元件)
  262.             draw_autotile(x, y, p, id) if id < 384
  263.           end
  264.         end
  265.       end
  266.     end
  267.   end
  268.   #--------------------------------------------------------------------------
  269.   # ● 描繪元件
  270.   #--------------------------------------------------------------------------
  271.   def draw_tile(x, y, z, id)
  272.     # 設定元件矩形座標範圍
  273.     rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
  274.     # 假想座標轉為實際座標
  275.     x *= 32
  276.     y *= 32
  277.     # 描繪圖形
  278.     @layers[z].bitmap.blt(x, y, @tileset, rect)
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # ● 描繪自動元件
  282.   #--------------------------------------------------------------------------
  283.   def draw_autotile(x, y, z, tile_id)
  284.     # 取得自動元件
  285.     autotile = @autotiles[tile_id / 48 - 1]
  286.     # 取得自動元件ID
  287.     tile_id %= 48
  288.     # 生成暫時圖形區塊
  289.     bitmap = Bitmap.new(32, 32)
  290.     # 取得自動元件編號
  291.     tiles = Autotiles[tile_id / 8][tile_id % 8]
  292.     # 自動元件動畫
  293.     frames = autotile.width / 96
  294.     # 設定動畫偏移座標
  295.     anim = (Graphics.frame_count / Animated_Autotiles_Frames) % frames * 96
  296.     # 生成自動元件圖塊
  297.     for i in 0...4
  298.       tile_position = tiles[i] - 1
  299.       src_rect = Rect.new(tile_position % 6 * 16 + anim,
  300.                           tile_position / 6 * 16, 16, 16)
  301.       bitmap.blt(i % 2 * 16, i / 2 * 16, autotile, src_rect)
  302.     end
  303.     # 假想座標轉為實際座標
  304.     x *= 32
  305.     y *= 32
  306.     # 描繪圖形
  307.     @layers[z].bitmap.blt(x, y, bitmap, Rect.new(0, 0, 32, 32))
  308.   end
  309. end
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
71 小时
注册时间
2009-4-18
帖子
209
13
发表于 2009-5-16 23:12:34 | 只看该作者
未免也太复杂了!怎么看的懂啊!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦·贤者

梦石
0
星屑
50
在线时间
1141 小时
注册时间
2007-12-15
帖子
4100
14
发表于 2009-5-16 23:16:38 | 只看该作者
以下引用大东于2009-5-16 15:12:34的发言:

未免也太复杂了!怎么看的懂啊!

挖坟者自重。这些是高手们交流的,新手就算了吧。
http://rpg.blue/home.php?mod=space&uid=34951&do=blog&id=12799
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-13 10:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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