Project1
标题: 绘制地图的问题 [打印本页]
作者: 爆发的妞 时间: 2013-6-26 09:10
标题: 绘制地图的问题
本帖最后由 爆发的妞 于 2013-6-26 14:14 编辑
小弟遇到一个地图绘制的问题,特来请教。
@eve592370698 @美丽晨露 @SuperMario
问题描述如下:
我看了Tilemap的第三方实现的方式, 里面是@layers包含三成的逻辑地图精灵,
其中绘制普通图块和绘制自动图块方法,在下面
#--------------------------------------------------------------------------
# * Draw Tile
#--------------------------------------------------------------------------
def draw_tile(x, y, z, id)
rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
x *= @tilesize
y *= @tilesize
if @tile_width == 32 && @tile_height == 32
@layers[z].bitmap.blt(x, y, @tileset, rect)
else
dest_rect = Rect.new(x, y, @tilesize, @tilesize)
@layers[z].bitmap.stretch_blt(dest_rect, @tileset, rect)
end
end
#--------------------------------------------------------------------------
# * Draw Auto-Tile
#--------------------------------------------------------------------------
def draw_autotile(x, y, z, tile_id)
# Gets Autotile Filename
autotile_num = tile_id / 48 - 1
# Reconfigure Tile ID
tile_id %= 48
# Gets Generated Autotile Bitmap Section
bitmap = RPG::Cache.autotile_tile(autotiles[autotile_num], tile_id, @hue)
# Calculates Tile Coordinates
x *= @tilesize
y *= @tilesize
@layers[z].bitmap.blt(x, y, bitmap, Rect.new(0, 0, 32, 32))
end
#--------------------------------------------------------------------------
# * Draw Tile
#--------------------------------------------------------------------------
def draw_tile(x, y, z, id)
rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
x *= @tilesize
y *= @tilesize
if @tile_width == 32 && @tile_height == 32
@layers[z].bitmap.blt(x, y, @tileset, rect)
else
dest_rect = Rect.new(x, y, @tilesize, @tilesize)
@layers[z].bitmap.stretch_blt(dest_rect, @tileset, rect)
end
end
#--------------------------------------------------------------------------
# * Draw Auto-Tile
#--------------------------------------------------------------------------
def draw_autotile(x, y, z, tile_id)
# Gets Autotile Filename
autotile_num = tile_id / 48 - 1
# Reconfigure Tile ID
tile_id %= 48
# Gets Generated Autotile Bitmap Section
bitmap = RPG::Cache.autotile_tile(autotiles[autotile_num], tile_id, @hue)
# Calculates Tile Coordinates
x *= @tilesize
y *= @tilesize
@layers[z].bitmap.blt(x, y, bitmap, Rect.new(0, 0, 32, 32))
end
现在我的问题是:精灵中的图片对应的区域会更新, 那么脏区域呢(即是老的数据)
还在,那么三层依次绘制的话,那么上层的脏区域不就绘制出来了吗?不甚解, 特来
求高人指点。
PS:
我自己实现的,单个精灵的情况,移动图块显示正常, 当使用3层的时候,
最上层就有了脏数据,显示了出来。 仔细看第二张图的上面部分。
-
device-2013-06-26-103631.png
(219.49 KB, 下载次数: 17)
-
device-2013-06-26-103935.png
(200.99 KB, 下载次数: 14)
作者: eve592370698 时间: 2013-6-26 14:17
请问您所说的【脏数据】指的是啥啊?
作者: 爆发的妞 时间: 2013-6-26 14:41
eve592370698 发表于 2013-6-26 14:17
请问您所说的【脏数据】指的是啥啊?
就是旧数据,下图表示,由于地图绘制次数的原因, 我使用了
卡马克算法, 所以不是每次图片都清除的。 当左边有新数据的
时候,可能右边的旧的数据还在。 如果旧的数据绘制出来,就
会存在问题了。
-
无标题.png
(11.71 KB, 下载次数: 16)
作者: 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 的三层是逻辑三层, 不是地图的三层。
看下面的一段代码
# Passes Through All Priorities
for p in 0..5
# Skip If Priority Doesn't Match
next unless p == @priorities[id]
# Cap Priority to Layer 3
p = 2 if p > 2
# Draw Tile
id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
end
# Passes Through All Priorities
for p in 0..5
# Skip If Priority Doesn't Match
next unless p == @priorities[id]
# Cap Priority to Layer 3
p = 2 if p > 2
# Draw Tile
id < 384 ? draw_autotile(x, y, p, id) : draw_tile(x, y, p, id)
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 |