2011-11-18 93 views
3

我在XNA中为Windows和Xbox创建了一个简单的2D游戏。我正在将此游戏移植到Silverlight 5中(在编写本文时,仍在RC中),它支持SpriteBatch,Texture2D以及我在游戏中使用的各种其他XNA好吃的东西。我成功地将大部分代码移植到了Silverlight,但我仍然在解决/调整大小问题。如何将Silverlight应用程序缩放到50%宽度/高度?

我的原代码和内容被配置在1280×720决议的工作 - 我想继续保持这种方式 - 但我想嵌入网页上的Silverlight的游戏,在一个更易于管理的大小:640x360(原始尺寸的一半)。

所以我的问题是这样的:如何将整个Silverlight应用程序缩小到原始大小的一半

我想我走在正确的轨道上,但我无法完全理解它的工作原理。我发现了RenderTransformScaleTransform XAML元素,他们似乎差不多完成我正在寻找,但不完全。我的XAML看起来像这样:

<!-- Some attributes omitted for brevity --> 
<UserControl x:Class="Silverlight3dApp.MainPage" 
    d:DesignWidth="1280" 
    d:DesignHeight="720"> 

    <Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RenderTransform> 
     <ScaleTransform x:Name="Scale" ScaleX="0.5" ScaleY="0.5" /> 
    </Grid.RenderTransform> 
    <DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" /> 
    </Grid> 
</UserControl> 

而我的HTML对象看起来是这样的:

<object data="data:application/x-silverlight-2," 
    type="application/x-silverlight-2" 
    width="640" 
    height="360"> 
    <!-- etc. --> 
</object> 

所以嵌入式HTML对象被设置为640×360(如需要),以及Silverlight应用程序设置为1280×720但是ScaleX和ScaleY的缩放比例均为0.5。这作品;该应用程序正在缩小到50%的大小,但绘制的内容是裁剪。我只能看到左上象限,所以我只能看到320x180的内容(原始尺寸为640x360)。

的X的这种原油图中表示,我看到在Silverlight中嵌入对象的内容,其他一切都突然冒出空:

___________ 
|XXXXX  | 
|XXXXX  | 360px 
|   | 
|___________| 
    640px 

我是一个Silverlight小白,让我有一种感觉,我”我错过了很明显的事有任何想法吗?

回答

1

我认为随着XNA集成的工作方式,您需要以50%的尺寸实际绘制。这是很容易的,如果你正在使用SpriteBatch,只使用过载开始,让你指定一个矩阵做:如果你想要去的一个非常懒惰

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, 
    SamplerState.LinearClamp, DepthStencilState.None, 
    RasterizerState.CullCounterClockwise, null, Matrix.CreateScale(.5f)); 
+0

感谢您的回应!在我的情况下,这实际上工作*完美*。完成并完成。谢谢!我已经准备好接受你的答案 - 我只是稍稍停留一下,看看是否有人有一个“纯Silverlight”解决方案,这个解决方案适用于那些使用的不仅仅是SpriteBatch的人。无论如何,伟大的回答,谢谢。附:你是SilverSprite的作者吗?如果是这样,不错的工作!我昨天只是在玩。 – Michael

+0

您可能想尝试在Canvas中包装DrawingSurface,这有时可以防止Grid执行的裁剪。是的,我写了SilverSprite,目前我正在努力让它与新的Silverlight 5工具,太多的项目,没有足够的时间。 –

0

,你可以投的眼睛或两个如何控制ViewBox。我记不起它是否具有100%的可靠性,但我认为对于初学者来说应该没问题。我已经将它用于生产中的一些后备场景。

相关问题