Project1

标题: 请教如何拼地图……(Viewport用法?) [打印本页]

作者: 匿名    时间: 2010-12-29 09:13
标题: 请教如何拼地图……(Viewport用法?)
本帖最后由 匿名 于 2010-12-29 09:14 编辑

喵了喵,咱想知道Viewport是怎么工作的,是如何把一张图片分成若干块然后再拼接成地图的
默认系统的Tilemap内置类说明太模糊,完全看不懂,故求详解.
作者: 禾西    时间: 2010-12-29 09:13
本帖最后由 禾西 于 2010-12-29 15:02 编辑

= =b
我很想直接叫你去看RPG::Sprite的動畫實現方式……animation_set_sprites() 那段很經典。
首先,你要知道其實只是加載了一張位圖,就是那個地圖的 tile 的 bitmap。
其次,你要知道每一個地圖小格其實都是個sprite。
然后,你要明白 sprite 有個 src_rect.set(int x, int y, int width, int height) 方法來剪切顯示位圖的顯示內容。

好了,按照上面所說,一幅地圖,其實就是大量小格拼湊起來的介面。你可以把他當作一幅拼圖。反正他們的原理是一樣的。

tilemap 的 update 中其實有一個 loop ,用來調用所有的sprite.update。同理,當你改變 tilemap 的 x 值或者 y 值時,你其實改變了所有內部小sprite的 x 值和 y 值。

地圖數據其實是一個和內部小格等量的array表。他記載了每個小格的屬性和內容,同時,你也可以根據小格在array中的index位置來計算出在實際拼湊中的相對 x 值和相對 y 值。

RM中所謂的多層地圖,實際是多幅地圖的疊加。根據使用的 viewport 的 z 值的不同而產生了不同的高度和覆蓋度。你要知道,在同一個 viewport 中后加入的 sprite 總比先加入的sprite 更“高”。而 viewport 內部的 z 值和 viewport 的 z 值是兩個不同的系統。所以,只要一個調用高 z 值 viewport 的 sprite 總比另一個調用了低 z 值 viewport 的 sprite 高。者就是為甚麼多層 sprite 疊加可以有統一的 z 值調度的原理。

現在來看看 Tilemap 的一些“屬性”。
tileset=(Bitmap bitmap) 作為圖塊的源位圖,每一個小格 sprite 的 bitmap 都指向這裡。
map_data=(Table mapData) 作為地圖小格數據的參照資料。
flash_data=(Table flashData) 是地圖塊閃爍的參照資料,和地圖小格數據數組同尺寸。
priorities=(Table prioritiesData) 是優先度的參照資料,用來確認地圖小格原件的高度。

這是 tilemap 中比較重要的幾個方法。

這是個偽代碼

  1. mapData = [
  2. 0,1,1,1
  3. 1,1,1,0
  4. 0,1,1,0
  5. 0,1,1,1]
  6. sprites = []
  7. tileBitmap = Bitmap.new("tileset.png")
  8. 16.times do |i|
  9.   sprites << Sprite.new()
  10.   sprites[-1].bitmap = tileBitmap
  11.   sprites[-1].src_rect.set(mapData[i]*32, 0, 32, 32)
  12.   sprites[-1].x = (i % 4) * 32
  13.   sprites[-1].y = (i / 4) * 32
  14. end
复制代码

作者: 禾西    时间: 2010-12-29 09:53
究竟是Viewport还是Tilemap....
作者: fux2    时间: 2010-12-29 14:10
3小时自顶
作者: fux2    时间: 2010-12-29 15:04
回复 禾西 的帖子
地圖數據其實是一個和內部小格等量的array表。他記載了每個小格的屬性和內容,同時,你也可以根據小格在array中的index位置來計算出在實際拼湊中的相對 x 值和相對 y 值

其实咱就是要这一句




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