2011-06-22 98 views
1

當啓動XNA遊戲時,白色屏幕會非常快速地閃爍。在較慢的機器上,這比在快速機器上更明顯。我們使用WPF開發的菜單系統開發遊戲服裝。這個菜單啓動我們的XNA遊戲,並將其窗口設置爲前景窗口(僅當它自身具有焦點時才起作用)在XNA遊戲啓動的白色屏幕上卡住

我們遇到的問題是,如果玩家在開始遊戲後繼續按下左按鈕,系統會卡住這個白色的屏幕閃爍。屏幕保持白色,播放器無法使用鼠標退出該屏幕(alt-tab可行,但不受歡迎)。

我該如何防止這種情況發生?我確實希望將XNA遊戲設置爲前景窗口,因爲根據玩家點擊菜單系統的位置可以保持活動狀態。

這是啓動XNA遊戲的菜單系統的代碼形式。

var process = Process.Start(info); 
var currentProcess = Process.GetCurrentProcess(); 
while (!process.HasExited) 
{ 
    Thread.Sleep(50); 
    if (GetForegroundWindow() == currentProcess.MainWindowHandle) 
    { 
     Activate(process.MainWindowHandle); 
    } 
} 

這是將XNA遊戲設置爲前景窗口的代碼。

/// <summary> 
    /// Sets the window to be foreground 
    /// </summary> 
    [DllImport("User32")] 
    private static extern int SetForegroundWindow(IntPtr hwnd); 

    /// <summary> 
    /// Activate or minimize a window 
    /// </summary> 
    [DllImportAttribute("User32.DLL")] 
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
    private const int SW_SHOW = 5; 
    private const int SW_MINIMIZE = 6; 
    private const int SW_RESTORE = 9; 

    /// <summary> 
    /// The GetForegroundWindow function returns a handle to the foreground window. 
    /// </summary> 
    [DllImport("user32.dll")] 
    private static extern IntPtr GetForegroundWindow(); 

    private static void Activate(IntPtr windowHandle) 
    { 
     ShowWindow(windowHandle, SW_RESTORE); 
     SetForegroundWindow(windowHandle); 
    } 

感謝, 沃特

回答

0

那麼首先閃光的可能是由於這種情況發生時,從最小化恢復XNA窗口的DirectX設備初始化或在最初創建的設備;有事件可以捕獲這些事件。當按下左鍵時,我不知道你在做什麼,但是我會檢查以確保你不會導致另一個設備初始化發生。

重要事件包含在GraphicsDeviceManager中,特別是重置事件。確保設備重置時,不處理任何輸入。