虽然(真)循环使我的程序无法启动

时间:2012-04-07 21:38:40

标签: c# xna

我正在尝试创建一个使用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);
    }
  }
  }

谢谢!

3 个答案:

答案 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
    {
        // ...
    }
}