﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>μ &#187; XNA</title>
	<atom:link href="http://www.icyfire.me/category/programmer/xna/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.icyfire.me</link>
	<description>太阳底下没有新鲜事。</description>
	<lastBuildDate>Sun, 08 Aug 2010 05:42:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>XNA里的Draw方法（上）</title>
		<link>http://www.icyfire.me/2007/12/xna%e9%87%8c%e7%9a%84draw%e6%96%b9%e6%b3%95%ef%bc%88%e4%b8%8a%ef%bc%89/</link>
		<comments>http://www.icyfire.me/2007/12/xna%e9%87%8c%e7%9a%84draw%e6%96%b9%e6%b3%95%ef%bc%88%e4%b8%8a%ef%bc%89/#comments</comments>
		<pubDate>Mon, 10 Dec 2007 18:21:21 +0000</pubDate>
		<dc:creator>icyfire</dc:creator>
				<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://www.onlyif.cn/?p=11</guid>
		<description><![CDATA[最近在研究XNA，XNA里一共提供7个绘制Texture的方法，下面是我学习过程中一点点的总结。]]></description>
			<content:encoded><![CDATA[<p><strong><font color="#3366ff">XNA</font></strong>的<strong><font color="#3366ff">SpriteBatch</font></strong>类提供了7个重载的<strong><font color="#3366ff">Draw</font></strong>方法。</p>
<p><span id="more-11"></span></p>
<p><strong><font color="#0066cc" size="2">SpriteBatch.Draw (Texture2D, Vector2, Color)</font></strong></p>
<p>这个是最基本的方法。<strong><font color="#3366ff">Vector2</font></strong>指定了Texture在屏幕中的位置。</p>
<p>先加载一张图片：<br />
<a href="wp-content/uploads/2007/12/1164812913671.jpg" title="1164812913671.jpg" rel="lightbox"><img src="wp-content/uploads/2007/12/1164812913671.jpg" alt="1164812913671.jpg" /></a></p>
<p>&nbsp;</p>
<p><coolcode lang="java"><br />
protected override void LoadGraphicsContent(bool loadAllContent)<br />
{<br />
    if (loadAllContent)<br />
    {<br />
        spriteBatch = new SpriteBatch(graphics.GraphicsDevice);<br />
        background = content.Load<texture2D>("Content\\texture");<br />
    }<br />
}<br />
</coolcode><br />
然后把图片显示出来：<br />
<coolcode lang="java"><br />
protected override void Draw(GameTime gameTime)<br />
{<br />
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);</p>
<p>    spriteBatch.Begin();<br />
    spriteBatch.Draw(background, Vector2.Zero, Color.White);<br />
    spriteBatch.End();</p>
<p>    base.Draw(gameTime);<br />
}<br />
</coolcode><br />
运行效果如下：<br />
<a href='wp-content/uploads/2007/12/draw01.PNG' title='draw01.PNG'><img src='wp-content/uploads/2007/12/draw01.PNG' alt='draw01.PNG' /></a><br />
<strong><font color="#3366ff">Vector2.Zero</font></strong>相当于一个值为(0,0)的Vector2。</p>
<hr />
<p><strong><font color="#0066cc" size="2">SpriteBatch.Draw (Texture2D, Vector2, Nullable&lt;rectangle&gt;, Color)</font></strong></p>
<p>这个方法里，Vector2指定了Texture在屏幕的位置，而rectangle则指定了要绘制的Texture的区域。也就是只绘制Texture上面的一部分。下面我们尝试在屏幕中心绘制图像中间的1/4。<br />
<coolcode lang="java"><br />
protected override void Draw(GameTime gameTime)<br />
{<br />
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);</p>
<p>    Rectangle sourceRect;<br />
    sourceRect.X = background.Width / 4;<br />
    sourceRect.Y = background.Height / 4;<br />
    sourceRect.Width = background.Width / 2;<br />
    sourceRect.Height = background.Height / 2;</p>
<p>    Vector2 position = new Vector2();<br />
    position.X = (graphics.GraphicsDevice.Viewport.Width - background.Width / 2) / 2;<br />
    position.Y = (graphics.GraphicsDevice.Viewport.Height - background.Height / 2) / 2;</p>
<p>    spriteBatch.Begin();<br />
    spriteBatch.Draw(background, position,sourceRect, Color.White);<br />
    spriteBatch.End();</p>
<p>    base.Draw(gameTime);<br />
}<br />
</coolcode><br />
效果如下：<br />
<a href='wp-content/uploads/2007/12/draw03.png' title='draw03.png'><img src='wp-content/uploads/2007/12/draw03.png' alt='draw03.png' /></a></p>
<blockquote><p>需要注意的是，如果绘制的区域比图像本身要大，则多余的区域会进行填充而不是拉伸。还有一点，rectangle的值是可以为<strong><font color="#3366ff">null</font></strong>的。当rectangle为null时，此时方法相当于<strong><font color="#0066cc">SpriteBatch.Draw (Texture2D, Vector2, Color)</font></strong>。</p></blockquote>
<p><strong><font color="#0066cc" size="2">SpriteBatch.Draw (Texture2D, Rectangle, Color)</font></strong></p>
<p>这个方法里。Rectangle指定了Texture在屏幕中某块区域进行绘制。Rectangle包含了位置（X,Y）以及宽高（Width,Height）这4个属性。图像会被拉伸或者缩小以填充那块区域。依旧采用上面的图做例子。<br />
<coolcode lang="java"><br />
protected override void Draw(GameTime gameTime)<br />
 {<br />
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);</p>
<p>    Rectangle rect;<br />
    rect.X = 0;<br />
    rect.Y = 0;<br />
    rect.Width = graphics.GraphicsDevice.Viewport.Width;<br />
    rect.Height = graphics.GraphicsDevice.Viewport.Height;</p>
<p>    spriteBatch.Begin();<br />
    spriteBatch.Draw(background, rect, Color.White);<br />
    spriteBatch.End();</p>
<p>    base.Draw(gameTime);<br />
}<br />
</coolcode><br />
我们定义了一个Rectangle。它的位置为(0,0)，宽为屏幕的宽度，高为屏幕的高度。效果如下：<br />
<a href='wp-content/uploads/2007/12/draw02.png' title='draw02.png'><img src='wp-content/uploads/2007/12/draw02.png' alt='draw02.png' /></a><br />
可以看到，图像被拉伸到了屏幕的大小。</p>
<p><strong><font color="#0066cc" size="2">SpriteBatch.Draw (Texture2D, Rectangle, Nullable&lt;rectangle&gt;, Color)</font></strong></p>
<p>这个方法里，Rectangle指定了在屏幕中绘制的区域，而Nullable&lt;rectangle&#038;gt则指定了需要绘制的Texture的区域。下面我们在屏幕中心绘制这张图像。<br />
<coolcode lang="java"><br />
protected override void Draw(GameTime gameTime)<br />
{<br />
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);</p>
<p>    Rectangle sourceRect;<br />
    sourceRect.X = 0;<br />
    sourceRect.Y = 0;<br />
    sourceRect.Width = background.Width;<br />
    sourceRect.Height = background.Height;</p>
<p>    Rectangle destinationRect;<br />
    destinationRect.X = (graphics.GraphicsDevice.Viewport.Width - background.Width) / 2;<br />
    destinationRect.Y = (graphics.GraphicsDevice.Viewport.Height - background.Height) / 2;<br />
    destinationRect.Width = background.Width;<br />
    destinationRect.Height = background.Height;</p>
<p>    spriteBatch.Begin();<br />
    spriteBatch.Draw(background, destinationRect,sourceRect, Color.White);<br />
    spriteBatch.End();</p>
<p>    base.Draw(gameTime);<br />
}<br />
</coolcode><br />
效果如下：<br />
<a href='wp-content/uploads/2007/12/draw04.png' title='draw04.png'><img src='wp-content/uploads/2007/12/draw04.png' alt='draw04.png' /></a></p>
<blockquote><p>如果Nullable&lt;rectangle&gt;的值为null的话，则效果相当于<strong><font color="#0066cc">SpriteBatch.Draw (Texture2D, Rectangle, Color)</font></strong></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.icyfire.me/2007/12/xna%e9%87%8c%e7%9a%84draw%e6%96%b9%e6%b3%95%ef%bc%88%e4%b8%8a%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
