Project1

标题: 绘制地图的问题 [打印本页]

作者: 爆发的妞    时间: 2013-6-26 09:10
标题: 绘制地图的问题
本帖最后由 爆发的妞 于 2013-6-26 14:14 编辑

小弟遇到一个地图绘制的问题,特来请教。
@eve592370698 @美丽晨露 @SuperMario
问题描述如下:
我看了Tilemap的第三方实现的方式, 里面是@layers包含三成的逻辑地图精灵,
其中绘制普通图块和绘制自动图块方法,在下面
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # * Draw Tile
  3.   #--------------------------------------------------------------------------
  4.   def draw_tile(x, y, z, id)
  5.     rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
  6.     x *= @tilesize
  7.     y *= @tilesize
  8.     if @tile_width == 32 && @tile_height == 32
  9.       @layers[z].bitmap.blt(x, y, @tileset, rect)
  10.     else
  11.       dest_rect = Rect.new(x, y, @tilesize, @tilesize)
  12.       @layers[z].bitmap.stretch_blt(dest_rect, @tileset, rect)
  13.     end
  14.   end
  15.   #--------------------------------------------------------------------------
  16.   # * Draw Auto-Tile
  17.   #--------------------------------------------------------------------------
  18.   def draw_autotile(x, y, z, tile_id)
  19.     # Gets Autotile Filename
  20.     autotile_num = tile_id / 48 - 1
  21.     # Reconfigure Tile ID
  22.     tile_id %= 48
  23.     # Gets Generated Autotile Bitmap Section
  24.     bitmap = RPG::Cache.autotile_tile(autotiles[autotile_num], tile_id, @hue)
  25.  
  26.     # Calculates Tile Coordinates
  27.     x *= @tilesize
  28.     y *= @tilesize
  29.     @layers[z].bitmap.blt(x, y, bitmap, Rect.new(0, 0, 32, 32))
  30.   end


现在我的问题是:精灵中的图片对应的区域会更新, 那么脏区域呢(即是老的数据)
还在,那么三层依次绘制的话,那么上层的脏区域不就绘制出来了吗?不甚解, 特来
求高人指点。

PS:
我自己实现的,单个精灵的情况,移动图块显示正常, 当使用3层的时候,
最上层就有了脏数据,显示了出来。 仔细看第二张图的上面部分。  

device-2013-06-26-103631.png (219.49 KB, 下载次数: 15)

device-2013-06-26-103631.png

device-2013-06-26-103935.png (200.99 KB, 下载次数: 12)

device-2013-06-26-103935.png

作者: eve592370698    时间: 2013-6-26 14:17
请问您所说的【脏数据】指的是啥啊?
作者: 爆发的妞    时间: 2013-6-26 14:41
eve592370698 发表于 2013-6-26 14:17
请问您所说的【脏数据】指的是啥啊?

就是旧数据,下图表示,由于地图绘制次数的原因, 我使用了
卡马克算法, 所以不是每次图片都清除的。 当左边有新数据的
时候,可能右边的旧的数据还在。 如果旧的数据绘制出来,就
会存在问题了。

无标题.png (11.71 KB, 下载次数: 13)

无标题.png

作者: end55rpg    时间: 2013-6-26 15:02
这是触屏游戏么- -,恕我无能看不懂。。。可以GC.start看看(garbage collect)
作者: 爆发的妞    时间: 2013-6-26 15:07
本帖最后由 爆发的妞 于 2013-6-26 15:09 编辑
end55rpg 发表于 2013-6-26 15:02
这是触屏游戏么- -,恕我无能看不懂。。。可以GC.start看看(garbage collect)


恩。是触摸的。是我android的仿照rmxp原生开发的。
如果只绘制在一层上面是没有问题的。 但是没有遮罩主角的效果了。
多层就产生了这个问题。
作者: 亿万星辰    时间: 2013-6-26 15:19
爆发的妞 发表于 2013-6-26 15:07
恩。是触摸的。是我android的仿照rmxp原生开发的。
如果只绘制在一层上面是没有问题的。 但是没有遮罩主 ...

如果一层没问题,多层应该也不应该产生这样的问题啊,每层都是调用相同的处理过程吧

在需要更换的区域重绘新地图,然后重新拼接
作者: 爆发的妞    时间: 2013-6-26 15:35
亿万星辰 发表于 2013-6-26 15:19
如果一层没问题,多层应该也不应该产生这样的问题啊,每层都是调用相同的处理过程吧

在需要更换的区域重 ...

Tilemap 的三层是逻辑三层, 不是地图的三层。
看下面的一段代码
RUBY 代码复制
  1. # Passes Through All Priorities
  2.             for p in 0..5
  3.               # Skip If Priority Doesn't Match
  4.               next unless p == @priorities[id]
  5.               # Cap Priority to Layer 3
  6.               p = 2 if p > 2
  7.               # Draw Tile
  8.               id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
  9.             end

如果优先级p=0 就绘制在第一层, 如果p=1就绘制在第二层, 如果
p>=2就绘制在第三层。
当我的逻辑层只有1层的时候, 地图的三层都绘制在一个逻辑层中,
是没有透明图块的, 这样就不存在旧的数据了。 显示正常, 就是没有
遮挡的效果了, 有的优先级显示在人物上的, 也遮挡不了了。
如果有逻辑三层的话, 逻辑1层是没问题的, 基本上都有图块的,不存在
透明图块的(即tile_id=0的图块,地图的第一个图块),但是如果有优先级
>=1 的,就是绘制在逻辑的第二层或第三层的时候, 当移动的时候, 由于卡马克
算法, 第二层和第三层里面的图片, 只更新新的数据, 旧的数据还在。
不知道我的描述是否清晰。
作者: 美丽晨露    时间: 2013-6-26 17:04
好吧,表示我看不懂这个脚本
作者: 灼眼的夏娜    时间: 2013-6-27 22:18
构成元件地图的各精灵的 Z 座标是特定的固定值。

优先级为 0 的地图元件的 Z 座标必定是 0。
画面上端位置的优先级为 1 的地图元件的 Z 座标是 64。
优先级每增加 1,Z 座标增加 32。
元件地图纵向滚动的话,Z 座标也一起变化。
地图上显示的人物 Z 座标,必须先决定地图元件的 Z 座标。


文档的描述
作者: 爆发的妞    时间: 2013-6-28 08:55
灼眼的夏娜 发表于 2013-6-27 22:18
构成元件地图的各精灵的 Z 座标是特定的固定值。

优先级为 0 的地图元件的 Z 座标必定是 0。

元件地图纵向滚动的话,Z 座标也一起变化。 纵向的话, 应该是y坐标移动吧。 不知道你这个文档出处在哪, 我也想看看。 谢谢你的回答。
作者: 爆发的妞    时间: 2013-6-28 11:03
灼眼的夏娜 发表于 2013-6-27 22:18
构成元件地图的各精灵的 Z 座标是特定的固定值。

优先级为 0 的地图元件的 Z 座标必定是 0。

其实我现在遇到的问题是, 让图片的一部分例如一块, 变成透明色,
android没有现成的api,操作像素效率太低, 用一个透明的图片又盖不住,
就产生了这个问题。 估计c效率高些做到了吧。 可以直接操作内存。  
所以android对于优先级的实现不了。  不过可以考虑使用事件的图标当成
建筑来实现遮挡, 记得以前搞得游戏都是这样做的。 有个建筑层的概念。
作者: SuperMario    时间: 2013-6-29 00:36
本帖最后由 SuperMario 于 2013-6-29 09:26 编辑

明天帮你看看吧。手机网页没有提醒功能,现在才看到。

------------------------------------------------------------------

清除信息的时候,3层的信息一起清除,不行吗....
我不清楚你是怎么绘制的。2层就够了吧。一层在人物下方,一层在人物上方。
你现在使用的绘制图形的接口是怎样的呢,可以实现哪些功能?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1