Windows phone 7 如何在WP8 720p设备上纠正Windows Phone XNA游戏的触摸屏偏移错误?

Windows phone 7 如何在WP8 720p设备上纠正Windows Phone XNA游戏的触摸屏偏移错误?,windows-phone-7,xna,Windows Phone 7,Xna,在WP8 720p设备上运行的XNA应用程序(WP7或WP7.5应用程序)将自动进行字母装箱,以便480x800 BackBuffer大小保持不变(我认为是为了兼容性) 这很好,只是XNA兼容层中似乎有一个bug。触摸面板根据顶部信箱空白区域的大小报告关闭的触摸位置 这有两个问题: 用户的触摸将似乎关闭,使游戏和菜单导航变得困难 因为它在负方向关闭,用户将根本无法触摸屏幕底部的东西 我试着通过将53/2像素偏移分解来解决这个问题(53是缩放坐标中额外空间的总量,除以2,因为它只被一个信箱栏关闭-

在WP8 720p设备上运行的XNA应用程序(WP7或WP7.5应用程序)将自动进行字母装箱,以便480x800 BackBuffer大小保持不变(我认为是为了兼容性)

这很好,只是XNA兼容层中似乎有一个bug。触摸面板根据顶部信箱空白区域的大小报告关闭的触摸位置

这有两个问题:

  • 用户的触摸将似乎关闭,使游戏和菜单导航变得困难
  • 因为它在负方向关闭,用户将根本无法触摸屏幕底部的东西
  • 我试着通过将53/2像素偏移分解来解决这个问题(53是缩放坐标中额外空间的总量,除以2,因为它只被一个信箱栏关闭-顶部的那个)。这确实纠正了触摸位置,但由于触摸面板内部将负值钳制为0,这意味着游戏顶部仍然存在死区(因为-22到-1应该转换为0到22,但如果所有负输入值都被钳制为0,则信息将丢失,负范围内的所有内容都将始终转换为22)

    有人遇到过这个问题并找到了解决办法吗


    我甚至尝试将TouchPanel.DisplayHeight/Width重置为设备的实际720p值,但不知怎的,在下一次帧更新时,它被重置为480x800。

    几天前我正在制作一个游戏。 它是为7.1打包的,但在720p模拟器上运行良好

    我对兼容性层了解不多,如果它受到图像大小的影响,那么下面是: 我为WVGA、WXGA和720p创建了单独的图像。使用了它们,了解了字母盒,并决定对所有人使用720p图像


    可能没什么帮助,但你还是去吧。

    我刚开始工作,TouchPanel.DisplayHeight需要很早设置为853(如果你检测到你使用的是这些720p设备之一)。我在主Silverlight页面的OnNavigatedTo上进行设置(实际上是SL/XNA)

    接下来,您必须将每个触摸位置和手势位置偏移+53.0f/2.0f

    我不知道为什么之前这不起作用,因为这是我上面提到的解决方案,它似乎不起作用,因为TouchPanel一直重置为800高度


    但是,我在reduced Repo(新的SL/XNA应用程序)和我的主游戏应用程序中都能使用它。

    这是一个很好的解决方案,我在这里发现: 它不仅解决了触摸屏的问题,而且还从侧面去除了黑块。当然,这取决于您的程序,这可能会导致更多问题,因为分辨率和屏幕比例会发生变化

    if (Environment.OSVersion.Version.Major == 8)
    {
        int? scaleFactor = null;
        var content = System.Windows.Application.Current.Host.Content;
        var scaleFactorProperty = content.GetType().GetProperty("ScaleFactor");
        if (scaleFactorProperty != null)
        {
            scaleFactor = scaleFactorProperty.GetValue(content, null) as int?;
        }
        if (scaleFactor == null)
            scaleFactor = 100;
    
        if (scaleFactor == 150)
        {
            SharedGraphicsDeviceManager sdm = SharedGraphicsDeviceManager.Current;
    
            sdm.PreferredBackBufferHeight = 800;
            sdm.PreferredBackBufferWidth = 450;
    
            TouchPanel.DisplayHeight = 800;
            TouchPanel.DisplayWidth = 450;
        }
    }
    

    能否在每帧之前手动设置触摸屏参数?