我正在尝试创建一个使用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);
}
}
}
谢谢!
答案 0 :(得分:0)
我不是XNA的专家,但我发现你在窗口的while(true)
方法中使用Update()
循环,必须处理非场景,但窗口控制更新(实际上即使场景更新从这个角度来看,什么都不会改变)。
尝试连接某些服务时遇到无限循环。您在创建窗口的同一线程上运行它,因此阻止窗口。
我建议你使用多线程,所以运行你试图在另一个线程中连接的代码。使用ThreadPool.QueueUserWorkItem
或其他一些运行线程的方式,并向用户提供程序正在连接的信息。
答案 1 :(得分:0)
据我所知,问题在于,除非您需要经常连接,否则只要实际连接,就需要打破ConnectSteam代码。
Console.WriteLine("Logged on.");
break;
或者,您可以拥有一个isConnected变量(非常伪代码):
bool isConnected = false
while(!isConnected)
{
isConnected = LogonCode;
}
答案 2 :(得分:0)
正如其他人所指出的,问题出在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
{
// ...
}
}