XNA基礎(03) 動畫與幀率

2022-03-02 01:03:46 字數 1533 閱讀 8765

我們要做的2d和3d遊戲離不開動畫,那麼在xna中如何實現動畫了?

首先,我們來看最簡單的動畫 —— 移動。

要移動乙個sprite非常簡單,我們只需要在game1.update()方法中改變sprite的位置座標,在下次game1.draw()方法被呼叫時,螢幕上顯示的sprite就被移動了。

上面的20個小表現了乙個**從初始到結束的所有狀態,在實際製作時,我們通常將這些按順序製作在一張大圖中,並且保證大圖中每個小圖的尺寸是完全一樣的。我們稱這樣的大圖為精靈幀序列圖sprite sheets。

看來,實現乙個動畫並非難事,真正困難的地方在於如何控制每個動畫可以有自己不同的重新整理速度,如何使同乙個動畫在不同配置的機器上表現相同。這就涉及到幀率問題。

所謂幀率frame rate,指的是一秒鐘內重新繪製螢幕的次數。xna框架為我們設定的預設幀率是60fps。為什麼選擇60了?因為這是在人的眼睛感覺不到閃爍的情況下顯示器最低的重新整理頻率。我們可以通過基類microsoft.xna.framework.game的屬性targetelapsedtime來重新設定它。比如:

base

.targetelapsedtime 

=new

timespan(0, 

0, 0, 

0, 10);

這表示每隔10ms就重繪一次,即幀率為100fps。

設定幀率為100fps,並不表示就真的會達到100fps的速度,這要看機器的配置如何。當機器的配置不夠時,xna會自動跳過某些次繪製——即不呼叫game1.draw()方法。我們可以通過gametime(你還記得update和draw方法都有乙個該型別的引數)的isrunningslowly屬性來檢測實際的幀率是否比我們設定的要小。

通過修改targetelapsedtime屬性來設定幀率,會使所有的動畫都受到影響,因為它實際修改的是呼叫game1.update()和game1.draw()的頻率。

我們如何使乙個動畫以自己恆定的速度重新整理了?包括這個動畫的重新整理速度不受主幀率(即targetelapsedtime設定的值)和機器配置的影響,當然,前提條件是我們動畫的重新整理率不能大於主幀率,也不能超出機器配置允許的最大幀率。

我們可以用類似下面的**來控制每個動畫以自己的重新整理率執行:

//成員變數

inttimesincelastframe =0

;  i

ntmillisecondsperframe =50

; // 20fps

//在update方法中

timesincelastframe 

+=gametime.elapsedgametime.milliseconds;

if(timesincelastframe 

>

millisecondsperframe) //滿足了換幀條件

通過上述**,我們就可以控制目標sprite的動畫速率為20fps。     

在實際的應用中,我們可以將上述控制幀率的**放到sprite的基類中,這樣就可以控制不同的sprite以各自的速率執行了。

今天就講到這裡,下一節我們將講述如何捕捉使用者的輸入事件,比如滑鼠、鍵盤的輸入。

遊戲引擎基礎(四)(模型與動畫,細節級別)

第4部份 模型與動畫,細節級別 角色建模與動畫 你的角色模型在螢幕上看起來怎麼樣,怎樣容易建立它們,紋理,以及動畫對於現代遊戲試圖完成的 消除不可信 因素來說至關重要。角色模型系統逐漸變得複雜起來,包括較高的多邊形數量模型,和讓模型在螢幕上移動的更好方式。如今你需要乙個骨骼模型系統,有骨架和網格細節...

C 基礎03 繼承,多型,XML操作與IO流

繼承要符合 is a 關係,卡車繼承汽車,卡車 is a同一 汽車。子類通過 繼承父類 汽車類 class car 卡車類 public class truck car 多型 同一操作作用於不同的物件時,可以有不同的解釋,產生不同的執行結果。通俗講即是 多種形態 可以通過虛方法,抽象方法實現多型,如...

Python基礎 Task03 列表與元組

元組切片 例項 adt介面實現 保留序列順序刪重複元素 反思元組是 immutable 不可變的 其序列通常包含不同種類的元素,並且通過解包或者索引來訪問 如果是 namedtuples 的話甚至還可以通過屬性訪問 列表是 mutable 可變的 並且列表中的元素一般是同種型別的,並且通過迭代訪問。...