国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

一步一步學習midp2。0游戲編程(三)

2019-11-18 15:03:35
字體:
來源:轉載
供稿:網友

一步一步學習midp2。0游戲編程(五)

SPRite(精靈類)

Sprite是用個用來顯示圖像的類 (每次一個). 該類和TiledLayer的區別是。Sprite是由一個圖像(可以有好幾幀,但是一次只有一個顯示)組成 (當然Sprite還有其他的額外特性,不過每次只能只用一個圖像而不是一次使用多個圖像來填充屏幕是它的最主要特征.) 因而Sprite 被用來定義一些小的有動作的游戲對象(比如飛船和小行星對撞), TiledLayer 更被常用來構造生動的背景.

Sprite另一個讓人激動的特性是:雖然它一次只能顯示一個圖像,但是我們可以為它定義一系列的圖像,以便在不同的環境下構造不同的動畫. 在我的例子中,牛仔有三幀圖像描繪它的走路,一幀描繪牛仔的跳. 這些將要賦值給Sprite的圖像需要被存在一個png文件中.這些幀被存在一個文件中的好處是你可以從治理多個Image對象的麻煩中解脫出來。下面是牛仔類的圖片:

  一步一步學習midp2。0游戲編程(三)(圖一)
這個是滾草的動畫:

一步一步學習midp2。0游戲編程(三)(圖二)
在某個特定的時刻決定顯示哪一幀幀是非常直觀的. 第一, 假如你的圖像文件包括多個幀, 在構造Sprite 類的時候你需要指定精靈的高度和寬度(象素值). 圖像的高度和寬度必須是精靈高寬的整數倍.換句話說,你要能正好讓電腦把你的圖像按照精靈的大小劃分成幾個類. 通過上面的例子你也看到了,至于這些幀是橫著拍還是豎著排抑或橫豎都有排成一個方陣都無所謂. 接著就可以指定幀數了, 左上放是編號0,然后從左到右,從上到下依次排列。你可以使用setFrame(int sequenceIndex) 選擇哪一幀被顯示,是要把它的編號作為參數傳遞就成了.

Sprite還可以讓你使用方法setFrameSequence(int[] sequence)定義一個幀的序列.比如我可以為牛仔定義這么一個序列 { 1, 2, 3, 2 }而為滾草定義 { 0, 1, 2 } 序列. 使用nextFrame(),就可以讓你的Sprite 動畫前進了。(后退的話使用prevFrame()).對于象滾草這樣使用了全部幀的情況的確很方便,不過對于象牛仔這樣有的幀沒有使用的情況就稍微有點復雜了。這是因為一個序列一旦被設置, setFrame(int sequenceIndex) 方法中的參數對應的幀數變成了序列數組中對應的參數而不是圖片本身參數的順序。比如我把牛仔的序列設置為 { 1, 2, 3, 2 },假如我調用setFrame(0)的話,序號為1的那幀被顯示, setFrame(3)將會顯示2. 因而假如讓人物跳起的動畫對應的第0幀就沒有辦法引用了.所以當我需要牛仔跳起時,我需要設置序列為null,然后再調用setFrame(0),接著再把序列設置成 { 1, 2, 3, 2 }. 你可以參考下面代碼中的jump() 和 advance(int tickCount, boolean left).

當幀改變時,為了改變精靈的外觀,你可對它去旋轉或者鏡像的操作. 牛仔和滾草都可以向左或者向右運動,所以我需要對圖像進行鏡像變換以得到相反方向的動作. 當你開始變換成,你需要保留住精靈的引用象素. 這是因為假如你變換你的精靈的時候, 引用象素是一個不變的象素. 你可以設想,你的精靈圖像是一個矩形,當它進行變換以后,仍然是原來位置上的那個矩形。這是不一定的。為了說明.我們來設想一個例子,有一個向左站的人,他的引用象素在腳趾上對他進行90度旋轉以后, 你會發現他向前倒在地上了.很明顯是引用象素發生了作用 (似乎一個圖釘).假如你希望變換后仍然占有相同的矩形話,你需要首先調用 defineReferencePixel(int x, int y) 把你的精靈的引用象素設置成矩形的中心, 就想我在下面代碼的構造方法中干的那樣. 要注重 defineReferencePixel(int x, int y)中的坐標 是相對于精靈的左上角,然而setRefPixelPosition(int x, int y)使用的是整個屏幕的坐標系統. 更準確的說,被送到 setRefPixelPosition(int x, int y)中的坐標用的是精靈將被直接繪制到的Canvas的坐標系統, 但是假如精靈通過 LayerManager進行繪制, 那么使用的就是LayerManager的坐標系統了. (這些坐標的關系在在 LayerManager那部分已經講解過了) 要非凡注重的是,假如你對一個精靈圖像進行了多重變化的話,后面的變化是相對原始狀態而不是當前狀態. 換句話說,假如你調用了兩次 setTransform(TRANS_MIRROR)和調用一次的效果是一樣的,而不是想你想象的那樣再變換回去. 假如你想讓你的變型還原,調用setTransform(TRANS_NONE). 在 Cowboy.advance(int tickCount, boolean left) 中有具體演示.

Layer(包括Sprites TiledLayers) 類的另外一個靈光人激動的特性就是可以讓你把你的對象放置到一個對象之間相互關聯的體系中而不是一個彼此沒有聯系的絕對體系. 假如你想讓你的精靈Sprite 移動3個象素而不管它現在所處的環境的話, 你可以調用move(int x, int y) ,其中x,y分別代表這兩個方向上的偏移量, 而不像 setRefPixelPosition(int x, int y)那樣使用絕對坐標來定義精靈的新的位置. collidesWith()也是非常有用.他可以檢測一個精靈是否和另外一個精靈或者TiledLayers 或者一個Image發生碰撞. 非凡是假如你把pixelLevel參數設置成true的話,他會檢測是不是兩個不透明發生碰撞,而假如僅僅這兩者的透明發生碰撞就被忽略。

在 "Tumbleweed" 游戲中, 讓所有的Sprites播放后,我會檢查牛仔是不是和滾草發生了碰撞. (具體檢測在 Cowboy.checkCollision(Tumbleweed tumbleweed)方法中,JumpManager.advance(int gameTicks)會調用它)。我會檢查牛仔所有滾草之間的碰撞,除了那些不可見的滾草,因為它們肯定會返回false. 在我的例子中,為了省點力氣 你可以只檢測那些有可能發生碰撞的物體而不是所有的物體兩兩之間都要檢測。你可以注重到,在我的例子中我沒有檢測滾草之間的碰撞以及背景草皮的碰撞,因為那些碰撞和游戲的邏輯不太相關。假如你在檢查一個象素級別的碰撞,你得確認你的圖片有透明背景. (透明是很重要的,它讓你可以在繪制圖片的時候不必把那個那個丑陋的帶有背景顏色的矩形也畫出來)至于 怎么正確的創建圖片參見附錄 B.



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万荣县| 陇川县| 高雄市| 酉阳| 宁德市| 永修县| 昆明市| 观塘区| 双牌县| 定兴县| 五华县| 精河县| 柏乡县| 瑞金市| 连云港市| 阳谷县| 平舆县| 瓦房店市| 宁蒗| 吉水县| 铜川市| 上虞市| 丹凤县| 尉氏县| 普洱| 黑山县| 武平县| 三原县| 皮山县| 满城县| 仲巴县| 布拖县| 咸丰县| 安义县| 锡林郭勒盟| 黄平县| 平罗县| 辽阳市| 镇赉县| 铜鼓县| 明星|