赞 | 0 |
VIP | 10 |
好人卡 | 49 |
积分 | 10 |
经验 | 22958 |
最后登录 | 2020-8-1 |
在线时间 | 2161 小时 |
Lv3.寻梦者 酱油的
- 梦石
- 0
- 星屑
- 1035
- 在线时间
- 2161 小时
- 注册时间
- 2007-12-22
- 帖子
- 3271
|
本帖最后由 禾西 于 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 中比較重要的幾個方法。
這是個偽代碼:
- mapData = [
- 0,1,1,1
- 1,1,1,0
- 0,1,1,0
- 0,1,1,1]
- sprites = []
- tileBitmap = Bitmap.new("tileset.png")
- 16.times do |i|
- sprites << Sprite.new()
- sprites[-1].bitmap = tileBitmap
- sprites[-1].src_rect.set(mapData[i]*32, 0, 32, 32)
- sprites[-1].x = (i % 4) * 32
- sprites[-1].y = (i / 4) * 32
- end
复制代码 |
|