虽然(真)循环使我的程序无法启动
本文关键字:程序 启动 我的 循环 虽然 | 更新日期: 2023-09-27 18:30:17
我正在尝试制作一个使用 XNA 的 SteamRE 机器人,现在,我刚刚创建了一个新的 XNA 项目,并在上面打了 SteamRE 示例代码,如果我运行它,它工作正常,但问题是,它实际上并没有启动 XNA 窗口,所以它无法查找键盘处理等。
如果我删除 while(true) 循环,它可以工作,但它不会连接。
这是我的代码,如果你们能看看这个,也许可以帮助我,那就太好了。
namespace Steam
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
string userName = "username";
string passWord = "password";
SteamClient steamClient = new SteamClient(); // initialize our client
SteamUser steamUser;
SteamFriends steamFriends;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
steamUser = steamClient.GetHandler<SteamUser>(); // we'll use this later to logon
steamFriends = steamClient.GetHandler<SteamFriends>();
}
protected override void UnloadContent()
{
}
KeyboardState oldState = Keyboard.GetState();
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
ConnectSteam();
base.Update(gameTime);
}
public void ConnectSteam()
{
steamClient.Connect(); // connect to the steam network
while (true)
{
CallbackMsg msg = steamClient.WaitForCallback(true); // block and wait until a callback is posted
msg.Handle<SteamClient.ConnectCallback>(callback =>
{
// the Handle function will call this lambda method for this callback
if (callback.Result != EResult.OK)
{
Console.WriteLine("Failed. 1");
}
//break; // the connect result wasn't OK, so something failed
// we've successfully connected to steam3, so lets logon with our details
Console.WriteLine("Connected to Steam3.");
steamUser.LogOn(new SteamUser.LogOnDetails
{
Username = userName,
Password = passWord,
});
Console.WriteLine("Logged on.");
});
msg.Handle<SteamUser.LogOnCallback>(callback =>
{
if (callback.Result != EResult.OK)
{
Console.WriteLine("Failed. 2");
}
// we've now logged onto Steam3
});
}
}
public void ConnectToFPP()
{
KeyboardState newState = Keyboard.GetState(); // get the newest state
// handle the input
if (oldState.IsKeyUp(Keys.Space) && newState.IsKeyDown(Keys.Space))
{
steamFriends.JoinChat(110338190871147670);
}
oldState = newState; // set the new state as the old state for next time
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
base.Draw(gameTime);
}
}
}
谢谢!
在我看来,问题是,除非您需要不断连接,否则您需要在实际连接时中断 ConnectSteam 代码。
Console.WriteLine("Logged on.");
break;
或者,你可以有一个isConnected变量(非常伪编码):
bool isConnected = false
while(!isConnected)
{
isConnected = LogonCode;
}
我不是 XNA 的专家,但我看到您在Update()
窗口方法中使用while(true)
循环,该方法必须处理非场景,但窗口控件更新(实际上即使场景更新也不会从这个角度改变)。
您在尝试连接到某些服务时遇到了无限循环。您在创建窗口的同一线程上运行它,因此阻止窗口。我建议您使用多线程,因此请在尝试在另一个线程中连接的代码运行。使用ThreadPool.QueueUserWorkItem
或其他方式运行线程,并向用户提供程序正在连接的信息。
正如其他人指出的那样,问题出在while(true)
片段中。即使你成功连接,你也永远不会脱离循环。即使连接后有break;
可以解决问题,您仍然会阻止整个过程运行,直到建立连接。
最好的解决方案是删除 while,如果连接未建立,则每帧删除一次(或异步调用使用的等待时间的秒或两倍),则仅尝试一次以再次连接。由于连接代码是异步的,因此游戏将继续循环,你可以继续绘制到屏幕上并通知用户事情的进展情况。
protected override void Update (GameTime gameTime)
{
// ...
if (!connected && !tryingToConnect)
{
ConnectSteam();
// Remember to set to false once connection is established
showConnectingDialog = true;
} else
{
}
// ...
}
protected override void Draw (GameTime gameTime)
{
// ...
if (showConnectingDialog)
{
SpriteBatch.DrawString(SpriteFont, "Connecting to Steam servers...", Vector2.Zero, Color.White);
} else
{
// ...
}
}