我在XNA for Windows和Xbox中创建了一个简单的2D游戏。我正在将这个游戏移植到Silverlight 5(在撰写本文时,仍然在RC中),它支持SpriteBatch,Texture2D以及我在游戏中使用的各种其他XNA好东西。我成功地将大部分代码移植到Silverlight,但我仍在努力解决分辨率/大小问题。
我的原始代码和内容配置为以 1280x720 的分辨率工作 - 我希望保持这种方式 - 但我想将Silverlight游戏嵌入到更多网页上可管理的尺寸: 640x360 (原始尺寸的一半)。
所以我的问题是:如何将整个Silverlight应用程序缩小到原始大小的50%?
我认为我走在正确的轨道上,但我无法让它发挥作用。我发现了RenderTransform
和ScaleTransform
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菜鸟,所以我有一种感觉我错过了一些明显的东西。有什么想法吗?
答案 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%可靠,但它对于它的缩放应该是可靠的,但我认为对于初学者来说应该没问题。我已经将它用于生产中的一些后备场景。