我正在XNA中创建一个在PC上运行的游戏。
在初始屏幕上,用户有三个选项。如果他们按“Enter”,游戏将开始,如果他们按“M”他们将进入帮助菜单,如果他们按“W”我想要将它们带到我的网站。
我正在使用Process.Start将浏览器打开到我的网站。
问题是,当我按“W”时,有时会打开1个浏览器与网站。但是,大多数情况下它会同时打开3到7个浏览器。
为什么同时打开多个浏览器?
按“W”时,如何只打开1个浏览器?
这是我的代码。我还没有建立我的网站,所以我使用yahoo.com作为目的地:
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");
}
}
谢谢,
麦克
答案 0 :(得分:3)
处理此问题的常用方法是始终跟踪前一帧的键盘状态。如果一个键没有在前一帧上下来,但是在这个帧下面,那么你知道它只是被按下了。如果按键在前一帧上按下,那么你知道它被按下了。
// 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函数来清理一些东西。
bool KeyPressed(Keys key)
{
return keyState.IsKeyDown(key) && !previousKeyState.IsKeyDown(key);
}
答案 1 :(得分:1)
您使用的代码每秒运行大约60次;你只能按下你的键100ms左右,但在那段时间它会检查W是否被按下约7次。因此,它会打开大量的浏览器窗口。
尝试在打开浏览器时记录时间戳(使用DateTime.Now
),然后在允许打开另一个窗口之前检查是否已经过了一段时间(~2秒?)。或者,通过打开浏览器创建一个设置为false的布尔标志,这样浏览器只能打开一次。
答案 2 :(得分:0)
谢谢你们,这就是问题所在。
Callum Rogers解决方案最简单:
我声明了一个布尔值:
bool launchFlag = false;
然后检查它并在网站启动后将其设置为true。
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秒,它只启动了1个浏览器!
谢谢,
麦克