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

XNA基礎(02) —— 繪制基礎

系統 2256 0

在所有的圖形引擎中,繪制都是最基礎的部分,本文將介紹在XNA框架中與繪制相關的基礎知識。

在XNA中,我們使用SpriteBatch來進行繪制。首先,我們需要使用SpriteBatch來繪制什么了?是精靈Sprite,對。

那么Sprite通過什么來表現了?是紋理,比如2D紋理 Texture2D 。嗯,你可以把紋理想象成Sprite的外表,比如我們制作的一幅精靈圖片,就是一個紋理。

我們要如何才能把一幅圖片加載到我們的游戲中來作為一個Sprite的紋理了?這要通過素材管道 Content Pipeline 。所謂素材,包括我們游戲中要用到的圖片、模型、聲音等,比如一個紋理圖片就是素材的一種。素材管道就很容易理解了,它可以把我們需要的素材導入到我們的游戲中,以XNA能夠識別的正確的格式。而且,格式的識別與轉換是在編譯期完成的。

在新建的XNA項目中,會有一個默認的 Content 文件夾,通常,我們會把所有的素材放在這個地方,并且根據素材的種類我們會在其下創建一些子文件夾,比如Image子文件夾用來存放所有的圖片素材,Audio文件夾用來存放聲音素材等。

當一個物件別被識別為素材后,就會有一個唯一的資產名稱 AssetName 來標記它,我們可以通過素材的屬性頁來查看素材的AssetName屬性并修改它。

下面我們可以用素材管理器 ContentManager 將一個素材導入到游戲中:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> Texture2D texture;

texture
= Content .Load < Texture2D > ( @"I mage/logo " ); // 在上文提到的LoadContent方法中調用

很多時候,我們的圖片需要是透明的,那么如何在SpriteBatch繪制的時候將圖片繪制為透明了?有兩種方法:要么圖片具有透明的背景,要么在制作圖片時將需要透明的部分設置為純正的洋紅色(255,0,255)。除此之外,還需要注意, SpriteBlendMode 模式必須為AlphaBlend(這也是默認模式,稍后會提到),才能達到我們期望的透明效果。

在進行渲染時,我們還需要注意層深度(Layer Depth)。所謂Layer Depth,指的是你需要將目標Sprite繪制在哪一個深度的層次。默認情況下,SpriteBatch會根據你調用的順序來決定Layer Depth的相對值,比如,你先調用SpriteBatch繪制Sprite A,然后調用SpriteBatch在同一位置繪制Sprite B,那么,Sprite B就會把Sprite A擋住。如果我們依靠調用SpriteBatch繪制的順序來決定Sprite的深度,那就太不靈活了,為此,調用SpriteBatch繪制方法時,你可以指定一個代表層次深度的參數(范圍0~1)來指示SpriteBatch按照我們希望的順序來繪制對象。

有了上面的這些基礎之后,我們可以詳細講解一下XNA中的渲染過程。每次渲染的過程都類似下面的模式:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> protected override void Draw( GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);

spriteBatch.Begin();

spriteBatch.Draw( );

spriteBatch.End();

base .Draw(gameTime);
}

(1)GraphicsDevice.Clear()方法用于清除屏幕背景。

(2)SpriteBatch.Begin()方法用于通知顯卡準備繪制場景。

(3)輪流調用SpriteBatch.Draw()繪制所有組件。

(4)SpriteBatch.End()方法用于告訴顯卡繪制已經完成。

(5)最后,顯卡顯示繪制的結果。

SpriteBatch.Begin()方法有一個接受參數的重載:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> void Begin( SpriteBlendMode blendMode, SpriteSortMode sortMode, SaveStateMode stateMode, Matrix transformMatrix) ;

SpriteBlendMode 參數決定了Sprite的顏色與背景顏色的混合模式,默認為AlphaBlend,我們剛才提到過。

SpriteSortMode參數決定了Sprite的排序模型,即與前面的Layer Depth關聯。

SaveStateMode參數用于控制是否保存圖形設備的狀態。

TransformMatrix參數用于控制旋轉、縮放等。

接下來我們看最重要的繪制Draw方法:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> void Draw( Texture2D texture, Vector2 position, Rectangle ? sourceRectangle, Color color, float rotation, Vector2 origin, float scale, SpriteEffects effects, float layerDepth);

第一個Texture2D參數,表示要繪制Sprite的紋理。

第二個Vector2參數,表示要繪制的Sprite的左上角的位置在哪里。

第三個Rectangle參數,表示要繪制源紋理的哪一個區域,如果要繪制紋理的全部部分,則傳null。

第四個Color參數,表示繪制時所調制的顏色通道。

第五個參數rotation,表示要旋轉的角度。

第六個參數origin,表示圍繞哪個位置進行旋轉。

第七個參數scale,表示繪制時要縮放的比例。

第八個參數effects,表示是否進行翻轉。SpriteEffects.FlipHorizontally -- 水平翻轉;SpriteEffects.FlipVertically -- 垂直翻轉。

最后一個參數layerDepth,就是我們前面說過的要在哪一個深度層次繪制對象。

最后,要解釋一下,為什么需要在每次Draw調用時,都先調用GraphicsDevice.Clear()方法清除屏幕然后再重新繪制所有物件了?這樣性能不是很差嗎?而且有時候我們可能只有極小的一部分需要重新繪制。

假設我們每次只重新繪制變動的那一部分,那我們就需要一個復雜的管理器來追蹤每一個部分的變動,這樣我們才有可能知道要重繪哪一部分。你可以想象一下,這個追蹤的過程是相當復雜的。而且還存在這樣的情況,那就是當一個Sprite移動時,它后面原先被擋住的Sprite會露出來,而這個Sprite可能又會擋住另外一個Sptrite的一部分,這樣一來就更加復雜了。所以,每次重繪整個屏幕并不是一個壞的idea。

今天就講到這里,下一節我們將講述與FrameRate相關的知識。

上一篇: XNA基礎(01) —— 游戲循環

XNA基礎(02) —— 繪制基礎


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 四虎影视在线观看2413 | 国产精品合集久久久久青苹果 | 青草青草久热精品视频在线观看 | 亚洲精品视频网 | 国产亚洲欧美另类久久久 | 立即播放免费毛片一级 | 午夜国产精品色福利视频 | 麻豆视频一区二区 | 久久久日韩精品国产成人 | 爱爱一区 | 久久亚洲精品国产精品婷婷 | 久久精品亚洲精品国产色婷 | 四色成人 | 久久99蜜桃精品久久久久小说 | 狠狠色丁香婷婷综合小时婷婷 | 欧美色射 | 亚洲乱码中文字幕久久 | 欧美香蕉爽爽人人爽观看猫咪 | 欧美一区二区高清 | 97影院午夜在线观看视频 | 国产午夜精品一区二区 | 一级a做爰片欧欧美毛片4 | 深夜在线免费观看 | 久久综合九色综合97婷婷女人 | 精品久久久久久无码中文字幕 | 一级一片 | 国产香港特级一级毛片 | 久久亚洲热 | 91视频国产高清 | 一区二区三区在线 | 欧 | 亚洲欧美日韩在线不卡中文 | 国产99福利视频在线 | 久久久成人啪啪免费网站 | 免费观看毛片 | a级毛片免费完整视频 | 欧美高清理论片在线观看 | 99色视频在线 | 四虎国产精品免费久久影院 | 欧美亚洲国产成人综合在线 | 99热这里有免费国内精品 | 亚洲精品专区一区二区三区 |