亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

XNA基礎(03) —— 動畫與幀率

系統 2088 0

我們要做的2D和3D游戲離不開動畫,那么在XNA中如何實現動畫了?

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

要移動一個Sprite非常簡單,我們只需要在Game1.Update()方法中改變Sprite的位置坐標,在下次Game1.Draw()方法被調用時,屏幕上顯示的Sprite就被移動了。

接下來,我們看復雜一點的動畫,比如的爆炸效果,我們可以這樣來實現,制作一系列的圖片,每張圖片都是爆炸過程中某一狀態的表現,如下所示:

XNA基礎(03) —— 動畫與幀率

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

有了爆炸的Sprite Sheets,我們可以通過在Game1.Update()方法中改變下一個要顯示的小圖片的索引(比如[2,3]),再根據索引以及小圖片的尺寸計算出該將要顯示的小圖片在Sprite Sheets中的相對位置,這樣我們就可以在Game1.Draw()方法中將Sprite Sheets中的目標小圖片的那塊區域繪制出來。你應該還記得上一篇文章中講到的Game1.Draw()方法的第三個參數sourceRectangle,用它可以指定我們要繪制Sprite Sheets的目標區域。

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

所謂幀率 Frame Rate ,指的是一秒鐘內重新繪制屏幕的次數。XNA框架為我們設置的默認幀率是60fps。為什么選擇60了?因為這是在人的眼睛感覺不到閃爍的情況下顯示器最低的刷新頻率。我們可以通過基類Microsoft.Xna.Framework.Game的屬性 TargetElapsedTime 來重新設置它。比如:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 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設定的值)和機器配置的影響,當然,前提條件是我們動畫的刷新率不能大于主幀率,也不能超出機器配置允許的最大幀率。

我們可以用類似下面的代碼來控制每個動畫以自己的刷新率運行:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> //成員變量

int timeSinceLastFrame = 0 ;

i nt millisecondsPerFrame = 50 ; // 20fps

//在Update方法中

timeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
if (timeSinceLastFrame > millisecondsPerFrame) //滿足了換幀條件
{
timeSinceLastFrame
-= millisecondsPerFrame;

//...... 此處可以轉到動畫的下一幀

}

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

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

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

上一篇: XNA基礎(02) —— 繪制基礎

XNA基礎(03) —— 動畫與幀率


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 女性一级全黄生活片在线播放 | 亚洲国产精品久久日 | 特黄特黄一级高清免费大片 | 一区二区三区精品国产欧美 | 国产黄色一级大片 | 亚洲精品一二区 | 亚洲欧美一区二区三区四区 | 国产成人久久精品激情 | 狠狠婷婷 | 亚洲 国产精品 日韩 | 久久国产精品自由自在 | 神马影院888不卡院 神马影院不卡不卡在线观看 | 国产成人精品一区二区免费视频 | 欧美特级一级毛片 | 日本又黄又爽又色的视频免费 | 亚洲精品香蕉一区二区在线观看 | 免费区欧美一级毛片 | 羞羞视频网站 | 手机看片福利 | 五月婷婷伊人网 | 尹人视频在线观看 | 国产精品99久久久久久www | 一区二区视频在线观看免费的 | 国产主播在线播放 | 欧美一级毛片片免费孕妇 | 欧美日韩在线播一区二区三区 | 青青热久免费精品视频精品 | 91九色蝌蚪 | 亚欧成人毛片一区二区三区四区 | 综合色桃花久久亚洲 | 第四色奇米影视 | 高清不卡一区二区 | 美女视频黄a视频免费全过程在线 | 亚洲黄色免费在线观看 | 亚洲欧美日韩在线不卡 | 久久综合玖玖爱中文字幕 | 国产成人精品一区二区不卡 | 高清性色生活片久久久 | 日本aaaa级毛片在线看 | 牛牛精品 | 嘿咻视频在线观看 |