Как я могу масштабировать приложение Silverlight до 50% ширины / высоты? - PullRequest
3 голосов
/ 18 ноября 2011

Я создал простую 2D-игру в XNA для Windows и Xbox. Я нахожусь в процессе переноса этой игры на 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, но затем оно масштабировано до 0,5 для ScaleX и ScaleY. Этот вид работает; размер приложения сокращается до 50%, но содержимое отображается обрезано . Я вижу только верхний левый квадрант, поэтому вижу только содержимое размером 320x180 (что было бы 640x360 при исходном размере).

X на этом грубом чертеже показывают, где я вижу содержимое во встроенном объекте Silverlight, все остальное резко обрезано и пусто:

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

Я нуб Silverlight, поэтому у меня такое чувство, что я упускаю что-то очевидное. Есть идеи?

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Я думаю, что с тем, как работает интеграция XNA, вам нужно рисовать с размером 50%. Это довольно легко сделать, если вы используете SpriteBatch, просто используйте перегрузку Begin, которая позволяет вам указать матрицу:

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend,
    SamplerState.LinearClamp, DepthStencilState.None, 
    RasterizerState.CullCounterClockwise, null, Matrix.CreateScale(.5f));
0 голосов
/ 19 ноября 2011

Если вы хотите пойти по-настоящему лениво, вы можете бросить взгляд или два на то, как работает элемент управления ViewBox . Я не могу вспомнить, надежно ли это на 100%, когда дело доходит до масштабирования, но я думаю, что это должно быть хорошо для начинающих. Я использовал его для некоторых резервных сценариев в производстве.

...