首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Process.Start在XNA游戏中打开的浏览器太多

Process.Start在XNA游戏中打开的浏览器太多
EN

Stack Overflow用户
提问于 2011-09-21 23:28:51
回答 3查看 318关注 0票数 2

我正在用XNA创建一个在PC上运行的游戏。

在闪屏上,用户有三个选项。如果他们按"Enter“,游戏将开始,如果他们按"M”,他们将进入帮助菜单,如果他们按"W“,我希望将他们带到我的网站。

我正在使用Process.Start打开我的网站的浏览器。

问题是,当我按"W“时,有时它会打开一个带有网站的浏览器。然而,大多数情况下,它会同时打开3-7个浏览器。

为什么要同时打开多个浏览器?

如何使其在按下"W“时仅打开1个浏览器?

这是我的代码。我还没有建立我的网站,所以我使用yahoo.com作为目的地:

代码语言:javascript
复制
 private void UpdateSplashScreen()
    {
        KeyboardState keyState = Keyboard.GetState();

        if (gameState == GameState.StartScreen)               
        {
            if (keyState.IsKeyDown(Keys.Enter))
            {
                gameState = GameState.Level1;
                explosionTime = 0.0f;
            }

            if (keyState.IsKeyDown(Keys.M))
            {
                gameState = GameState.HelpScreen;
            }

           if (keyState.IsKeyDown(Keys.W))
           {

             Process.Start("IExplore.exe", "www.yahoo.com");

           }
        }

谢谢,

麦克

EN

回答 3

Stack Overflow用户

发布于 2011-09-22 00:39:06

处理此问题的常用方法是始终跟踪上一帧中的键盘状态。如果关键点在上一帧上没有按下,但在这一帧上,那么你就知道它只是被按下了。如果关键点是在前一帧按下的,那么你就知道它被按住了。

代码语言:javascript
复制
// somewhere in your initialization code
KeyboardState keyState = Keyboard.GetState();
KeyboardState previousKeyState = keyState;
...

private void UpdateSplashScreen()
{
    previousKeyState = keyState;     // remember the state from the previous frame
    keyState = Keyboard.GetState();  // get the current state

    if (gameState == GameState.StartScreen)               
    {
        if (keyState.IsKeyDown(Keys.Enter) && !previousKeyState.IsKeyDown(Keys.Enter))
        {
            gameState = GameState.Level1;
            explosionTime = 0.0f;
        }

        if (keyState.IsKeyDown(Keys.M) && !previousKeyState.IsKeyDown(Keys.M))
        {
            gameState = GameState.HelpScreen;
        }

       if (keyState.IsKeyDown(Keys.W) && !previousKeyState.IsKeyDown(Keys.W))
       {

         Process.Start("IExplore.exe", "www.yahoo.com");

       }
    }

我通常会创建一个KeyPressed函数来清理一些东西。

代码语言:javascript
复制
bool KeyPressed(Keys key)
{
  return keyState.IsKeyDown(key) && !previousKeyState.IsKeyDown(key);
}
票数 3
EN

Stack Overflow用户

发布于 2011-09-21 23:34:43

你正在使用的代码每秒运行大约60次;你只能按下你的键100ms左右,但在这段时间里,它会检查W是否被按下了大约7次。因此,它会打开大量的浏览器窗口。

尝试记录打开浏览器时的时间戳(使用DateTime.Now),然后检查是否已经过特定时间(~2秒?)在允许打开另一个窗口之前。或者,通过打开浏览器创建一个设置为false的布尔标志,以便浏览器只能打开一次。

票数 1
EN

Stack Overflow用户

发布于 2011-09-22 08:44:54

谢谢你们,这就是问题所在。

Callum Rogers解决方案是最简单的:

我声明了一个布尔值:

代码语言:javascript
复制
   bool launchFlag = false;

然后检查它,并在网站启动后将其设置为true。

代码语言:javascript
复制
   private void UpdateSplashScreen()
{
    KeyboardState keyState = Keyboard.GetState();

    if (gameState == GameState.StartScreen)               
    {
        if (keyState.IsKeyDown(Keys.Enter))
        {
            gameState = GameState.Level1;
            explosionTime = 0.0f;
        }

        if (keyState.IsKeyDown(Keys.M))
        {
            gameState = GameState.HelpScreen;
        }

       if (keyState.IsKeyDown(Keys.W))
       {

         if (launchFlag == false)
               {
                   Process.Start("IExplore.exe", "www.yahoo.com");
                   launchFlag = true;
               }
       }
    }

我按住W键30秒,它只启动了一个浏览器!

谢谢,

麦克

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7502454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档