Silverlight和XNA:这个紫色的方块毁了我的生命

时间:2014-07-06 05:43:14

标签: c# silverlight xaml xna

请帮助我这个问题已经从我的生活中消磨了几个小时。所以我将我的游戏从XNA移植到silverlight,但我无法使.xaml代码正常工作。这个神秘的巨型紫色方块覆盖了屏幕并阻挡了运行游戏的DrawingSurface。这个错误是神秘的,让我绝对疯了,我仍然不知道它从哪里来的真实。下面是不同的.xaml版本来说明我的意思:

更糟糕的情况是,我只有正常的代码才能正常工作:

        <Grid   Background="white" x:Name="LayoutRoot" >
            <DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" VerticalAlignment="Center" HorizontalAlignment="Center" Height="600" Width="800" />
        </Grid>

这会生成一个页面,它只是中间的游戏,完全被紫色方块完全阻挡(我不能发布超过2个链接,所以我不会链接图像,但我做了以后场景)。

在这个例子中,我将绘图表面移动到足以使其不覆盖整个游戏画面,以便您可以更好地了解我的意思:

    <Grid   Background="white" x:Name="LayoutRoot" >
        <DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" VerticalAlignment="Center" HorizontalAlignment="Center" Height="600" Width="800" Margin="434,0,-434,0" />
    </Grid>

生成此图片:http://greygods.com/Silverlight3dApp3/purpleissue2.PNG

我得到的最好的解决方法是这个.xaml代码,它基本上以某种方式将紫色方块移开,我几乎不知道为什么这样可行或者紫色屏幕仍​​然来自哪里:

<Grid   Background="white" x:Name="LayoutRoot" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0*" />
            <ColumnDefinition Width="800*" />
        </Grid.ColumnDefinitions>

        <DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" VerticalAlignment="Center" HorizontalAlignment="Center" Height="600" Width="800" Margin="0,0,0,0" Grid.Column="1" />
</Grid>

这会创建一个这样的页面,似乎可以修复它:http://greygods.com/Silverlight3dApp3/purpleissue3.PNG

现在的事情是,虽然我有这方面的工作,我不能做任何复杂的嵌套控制结构或任何东西,它总是回来(我想在网格外做一个视口,以便它放大浏览器大小,但该死的紫色方块回来了)。任何时候我想改变xaml代码该死的紫色方块回来了。请帮帮我。

其他提示:

- 画布控件对象会导致同样的问题。

-Viewbox不会导致问题(但似乎无法获得键盘焦点)。

编辑新信息:

这是我的整个xaml文件,它设法运行得足够好,我也可以在网格周围获得一个视图框。解决方法的策略主要是创建一个0行和列,并将您的实际视觉效果放在该行/列中我认为您甚至不需要该行也有0,只是列足够但我放了两个在这个例子中:

<UserControl x:Class="Silverlight3dApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Loaded="UserControl_Loaded"
    mc:Ignorable="d" >

    <Viewbox Stretch="Fill">
    <Grid   Background="white" x:Name="LayoutRoot" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0" />
            <ColumnDefinition Width="800" />
        </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="0" />
                <RowDefinition Height="500" />
            </Grid.RowDefinitions>


            <DrawingSurface x:Name="myDrawingSurface" Draw="myDrawingSurface_Draw" VerticalAlignment="Center" HorizontalAlignment="Center" Height="480" Width="800" Grid.Column="1" Grid.Row="1" />
    </Grid>
    </Viewbox>
</UserControl>

这看起来就像你期望的那样,我的游戏在480-800窗口中正常运行,然后延伸到包含整个浏览器,它很棒。

这也是我的xaml.cs文件:

namespace Silverlight3dApp
{
    public partial class MainPage : UserControl
    {

        Game1 game;
        Microsoft.Xna.Framework.GameTime gt;

        readonly TimeSpan TargetElapsedTime = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / 60);
        readonly TimeSpan MaxElapsedTime = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / 60); //was / 10

        TimeSpan accumulatedTime;

        public MainPage()
        {           
            InitializeComponent();  
        }


        private void myDrawingSurface_Draw(object sender, DrawEventArgs e)
        {

            TimeSpan elapsedTime = e.DeltaTime;

            if (elapsedTime > MaxElapsedTime)
            {
                elapsedTime = MaxElapsedTime;
            }

            accumulatedTime += elapsedTime;

            while (accumulatedTime >= TargetElapsedTime)
            {
                game.Update(e);
                accumulatedTime -= TargetElapsedTime;
            }

            // Render scene

            game.Draw(e);
            e.InvalidateSurface();


        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            if (GraphicsDeviceManager.Current.RenderMode != RenderMode.Hardware)
            {
                MessageBox.Show("Please activate enableGPUAcceleration=true on your Silverlight plugin settings, right click -> permissions -> select this game -> allow. Then refresh the page", "Warning", MessageBoxButton.OK);
            }
            else
            {
                game = new Game1();  
                game.Attach(LayoutRoot); //was LayoutRoot
                gt = new Microsoft.Xna.Framework.GameTime();
                game.Initialize();  // Create game
            }
        }

    }
}

0 个答案:

没有答案