如何将Silverlight应用程序扩展到50%宽度/高度?

时间:2011-11-18 19:31:15

标签: silverlight silverlight-toolkit

我在XNA for Windows和Xbox中创建了一个简单的2D游戏。我正在将这个游戏移植到Silverlight 5(在撰写本文时,仍然在RC中),它支持SpriteBatch,Texture2D以及我在游戏中使用的各种其他XNA好东西。我成功地将大部分代码移植到Silverlight,但我仍在努力解决分辨率/大小问题。

我的原始代码和内容配置为以 1280x720 的分辨率工作 - 我希望保持这种方式 - 但我想将Silverlight游戏嵌入到更多网页上可管理的尺寸: 640x360 (原始尺寸的一半)。

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

我认为我走在正确的轨道上,但我无法让它发挥作用。我发现了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对象设置为640x360(根据需要),Silverlight应用程序设置为1280x720,然后ScaleX和ScaleY都缩放为0.5。这种有效;应用程序的大小缩小到50%,但绘制的内容为裁剪。我只能看到左上象限,所以我只看到320x180的内容(原始大小为640x360)。

这张粗略图纸中的X表示我在Silverlight嵌入对象中看到的内容,其他所有内容都被突然裁剪并且为空:

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

我是一个Silverlight菜鸟,所以我有一种感觉我错过了一些明显的东西。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我认为通过XNA集成的工作方式,您需要实际绘制50%的大小。如果您正在使用SpriteBatch,这很容易做到,只需使用Begin的重载来指定矩阵:

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

答案 1 :(得分:0)

如果你想要一个非常懒惰的人,你可以对ViewBox控件如何工作投下一两个眼睛。我不记得它是否100%可靠,但它对于它的缩放应该是可靠的,但我认为对于初学者来说应该没问题。我已经将它用于生产中的一些后备场景。