XNA - 输入字符串的格式不正确

XNA - Input string was not in correct format

对于我的加载方法,我在其中读取了精灵位置。当我 运行 游戏并按 'L' 加载时,它显示 "Input message was not in correct format"。

这是我的全部代码:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using System.IO;
using System.Text;

namespace PickUpTheCrewGame
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class PickUpTheCrewGame : Microsoft.Xna.Framework.Game
    {
        // states for the enums
        public enum State
        {
            Menu,
            Playing,
            Gameover,
        }

        //Setting the variables
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        SpriteFont messageFont;
        SpriteFont playerScoreFont;
        Texture2D backgroundTexture;
        Rectangle backgroundRectangle;
        Texture2D menuImageTexture;
        Rectangle menuImageRectange;
        Texture2D gameoverImageTexture;
        Rectangle gameoverImageRectangle;
        Sprite BlueBall;
        Sprite GreenBall;
        Sprite OrangeBall;
        Sprite PinkBall;
        Sprite RedBall;
        Sprite c;
        Sprite YellowBall;
        public Texture2D menuImage;
        public Texture2D gameoverImage;

        //---player scoresyer
        int playerScore = 0;
        int highScore = 0;

        //Lists
        List<sharks> sharks = new List<sharks>();
        List<Sprite> crew = new List<Sprite>();
        List<int> highscoreList = new List<int>();



        //Set First State
        State gameState = State.Menu;

        HUD hud = new HUD();

        /// <summary>
        /// Constructor for the PickUpTheCrew Game
        /// </summary>
        public PickUpTheCrewGame()
        {
            graphics = new GraphicsDeviceManager(this);

            Content.RootDirectory = "Content";

            //sreen size
            graphics.PreferredBackBufferWidth = 1280;
            graphics.PreferredBackBufferHeight = 720;
            menuImage = null;
            gameoverImage = null;


        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            //enable the mousepointer
            //IsMouseVisible = true;
            base.Initialize();
        }

        /// <summary>
        /// Highscore method
        /// </summary>
        /// <returns></returns>
        public bool IsHighScore()
        {
            if(playerScore >hud.highScore)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// Writing the Save File
        /// </summary>
        /// <param name="filename"></param>
        public void Save(string filename)
        {
            System.IO.TextWriter textOut = null;
            try
            {
                textOut = new System.IO.StreamWriter(filename);
                Save(textOut);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (textOut != null) textOut.Close();
            }
        }

        /// <summary>
        /// Saving the information into the save file
        /// </summary>
        /// <param name="textOut"></param>
        private void Save(TextWriter textOut)
        {
            try
            {
                foreach (Sprite crew1 in crew)
                {
                    textOut.WriteLine(crew1.location.X);
                    textOut.WriteLine(crew1.location.Y);
                }

                foreach (sharks enemySprite in sharks)
                {
                    textOut.WriteLine("Shark");
                    textOut.WriteLine(enemySprite.location.X);
                    textOut.WriteLine(enemySprite.location.Y);
                }
            }
            catch
            {

            }
        }
        /// <summary>
        /// This method loads the file from save document
        /// </summary>
        /// <param name="filename"></param>
        public void Load(string filename)
        {
            System.IO.TextReader textIn = null;
            //try
            //{
            textIn = new System.IO.StreamReader(filename);
            Load(textIn);
            //}
            //catch (Exception e)
            //{
            //    throw e;
            //}
            //finally
            //{
            if (textIn != null) textIn.Close();
            //}
        }
        /// <summary>
        /// Load method for the data in the file
        /// </summary>
        /// <param name="textIn"></param>
        private void Load(TextReader textIn)
        {
            foreach (Sprite crew1 in crew)
            {
                crew1.location.X = int.Parse(textIn.ReadLine());
                crew1.location.Y = int.Parse(textIn.ReadLine());
            }
            foreach (sharks enemySprite in sharks)
            {
                enemySprite.location.X = int.Parse(textIn.ReadLine());
                enemySprite.location.Y = int.Parse(textIn.ReadLine());
            }
            throw new NotImplementedException();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            hud.LoadContent(Content);

            //-----LOAD THE MENU BACKGROUND-----
            menuImageTexture = Content.Load<Texture2D>("menuImage");
            menuImageRectange = new Rectangle(0, 0,
                Window.ClientBounds.Width,
                Window.ClientBounds.Height);

            //------LOAD INGAME BACKGROUND-----
            backgroundTexture = Content.Load<Texture2D>("Background");
            backgroundRectangle = new Rectangle(
             0, 0, // top left hand corner
             Window.ClientBounds.Width,
             Window.ClientBounds.Height); // size of screen display

            //GAMEOVER IMAGE BACKGROUND
            gameoverImageTexture = Content.Load<Texture2D>("gameoverImage");
            gameoverImageRectangle = new Rectangle(
                0, 0,
                Window.ClientBounds.Width,
                Window.ClientBounds.Height);


            //------- Loading in Captains crew-------

            c = new Sprite(new Vector2(400, 150), new Vector2(400, 150),
                  Content.Load<Texture2D>("WhiteBall"), Color.White);

            BlueBall = new Sprite(new Vector2(640, 450),
                Content.Load<Texture2D>("BlueBall"));
            crew.Add(BlueBall);

            GreenBall = new Sprite(new Vector2(750, 200),
                Content.Load<Texture2D>("GreenBall"));
            crew.Add(GreenBall);

            OrangeBall = new Sprite(new Vector2(115, 400),
                Content.Load<Texture2D>("OrangeBall"));
            crew.Add(OrangeBall);

            RedBall = new Sprite(new Vector2(500, 600),
                Content.Load<Texture2D>("RedBall"));
            crew.Add(RedBall);

            YellowBall = new Sprite(new Vector2(800, 400),
                Content.Load<Texture2D>("YellowBall"));
            crew.Add(YellowBall);

            PinkBall = new Sprite(new Vector2(25, 175),
                Content.Load<Texture2D>("PinkBall"));
            crew.Add(PinkBall);

            //--------Loading in the Sharks------
            sharks s = new sharks(new Vector2(1100, 50),
                Content.Load<Texture2D>("BlackBall"));
            sharks.Add(s);
            s = new sharks(new Vector2(950, 170),
                Content.Load<Texture2D>("BlackBall"));
            sharks.Add(s);
            s = new sharks(new Vector2(300, 350),
                Content.Load<Texture2D>("BlackBall"));
            sharks.Add(s);

            messageFont = Content.Load<SpriteFont>("messageFont");

            // TODO: use this.Content to load your game content here
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            //----------This gets the time value---------
            float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;

            //--------------keyboard input---------------
            //Exit
            if (Keyboard.GetState().IsKeyDown(Keys.Escape))
                this.Exit();
            //Save
            if (Keyboard.GetState().IsKeyDown(Keys.S))
                Save("test.txt");
            //Load
            if (Keyboard.GetState().IsKeyDown(Keys.L))
                Load("test.txt");

            //Directional Movement
            if (Keyboard.GetState().IsKeyDown(Keys.Left))
                c.velocity.X = -350;

            if (Keyboard.GetState().IsKeyDown(Keys.Right))
                c.velocity.X = 350;

            if (Keyboard.GetState().IsKeyDown(Keys.Down))
                c.velocity.Y = 350;

            if (Keyboard.GetState().IsKeyDown(Keys.Up))
                c.velocity.Y = -350;


            //UPDATING PLAYING STATE
            switch (gameState)
            {
                case State.Playing:
                    c.Update(elapsed);
                    foreach (Sprite cr in crew)
                    {
                        cr.Update(elapsed);
                    }
                    c.col = Color.White;

                    //----sharks intersects with whiteball----
                    foreach (sharks s in sharks)
                    {
                        if (c.bounds.Intersects(s.bounds))
                        {
                            gameState = State.Gameover;
                            break;
                        }
                    }
                    foreach (sharks s in sharks)
                    {
                        s.Update(elapsed, c.location);
                    }



                    hud.Update(gameTime);
                    //----sprites intersect with whiteball----
                    foreach (Sprite crew1 in crew)
                    {
                        if (c.bounds.Intersects(crew1.bounds))
                        {
                            //gameState = State.Gameover;
                            playerScore += 1;
                            crew1.bounds.X = 1000000;
                            crew1.bounds.Y = 1000000;
                            crew1.location.Y = 1000000;
                            crew1.location.X = 1000000;
                            break;
                        }
                    } break;


                //UPDATING MENU STATE
                case State.Menu:
                    {
                        //Get keyboard state
                        KeyboardState keyState = Keyboard.GetState();
                        if (keyState.IsKeyDown(Keys.Enter))
                        {
                            gameState = State.Playing;
                        }
                        break;
                    }

                //UPDATING GAMEOVER STATE
                case State.Gameover:
                    {
                        //Get keyboard state
                        KeyboardState keyState = Keyboard.GetState();
                        if (keyState.IsKeyDown(Keys.Back))
                        {
                            if (IsHighScore())
                            {
                                hud.highScore = playerScore;
                                SavehighScore("highScore.txt");
                            }
                            playerScore = 0;
                            sharks.Clear();
                            crew.Clear();
                            gameState = State.Menu;
                        }
                        break;
                    }
            }
            base.Update(gameTime);
        }

        /// <summary>
        /// This makes the highscore file
        /// </summary>
        /// <param name="filename"></param>
        private void SavehighScore(string filename)
        {
            TextWriter textOut = null;
            try
            {
                if (File.Exists(filename))
                    File.Delete(filename);

                textOut = new StreamWriter(filename);
                textOut.WriteLine(hud.highScore);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (textOut != null) textOut.Close();
            }


            //throw new NotImplementedException();
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();

            switch (gameState)
            {
                //DRAWING PLAYING STATE
                case State.Playing:
                    {
                        spriteBatch.Draw(backgroundTexture, backgroundRectangle,
             Color.White);
                        c.Draw(spriteBatch);
                        //FOR EACH CREW DRAW
                        foreach (Sprite cr in crew)
                        {
                            cr.Draw(spriteBatch);
                        }
                        //FOREACH SHARK DRAW
                        foreach (sharks s in sharks)
                        {
                            s.Draw(spriteBatch);
                        }

                        hud.Draw(spriteBatch);

                        spriteBatch.DrawString(messageFont, playerScore.ToString(),
                new Vector2(200, 0),
                Color.White);

                        //spriteBatch.DrawString(messageFont, highScore.ToString(),
                           // new Vector2(200, 100), Color.White);

                        spriteBatch.DrawString(messageFont, " Player Scores - ",
                            new Vector2(0, 0), Color.White);
                        break;

                        //spriteBatch.DrawString(messageFont, " High Score - ",
                            //new Vector2(200, 200), Color.White);
                        //break;

                    }
                //DRAWING MENU STATE
                case State.Menu:
                    {
                        spriteBatch.Draw(menuImageTexture, menuImageRectange, Color.White);
                        break;
                    }
                //DRAWING GAMEOVER STATE
                case State.Gameover:
                    {
                        spriteBatch.Draw(gameoverImageTexture, gameoverImageRectangle, Color.White);
                        spriteBatch.DrawString(messageFont, "Your Final Score was - "  + playerScore.ToString(),new Vector2 (0,0), Color.White);
                        spriteBatch.DrawString(messageFont, "Your High score - " + hud.highScore.ToString(), new Vector2(0, 100), Color.White);
                        break;
                    }
            }


            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

这是错误的来源:

private void Load(TextReader textIn)
        {
            foreach (Sprite crew1 in crew)
            {
                crew1.location.X = int.Parse(textIn.ReadLine());
                crew1.location.Y = int.Parse(textIn.ReadLine());
            }
            foreach (sharks enemySprite in sharks)
            {
                enemySprite.location.X = int.Parse(textIn.ReadLine());
                enemySprite.location.Y = int.Parse(textIn.ReadLine());
            }
            throw new NotImplementedException();
        }

这是我的存档文件(test.txt)

640
450
750
200
1216
656
500
600
800
400
1216
656
Shark
1100
50
Shark
950
170
Shark
164.5326
199.6745

如果您能帮助解释为什么会发生这种情况,我将不胜感激。 如果您需要的话,我还有其他代码。 谢谢

一旦输入流读取行 "Shark" 并尝试将其转换为 int,它就会失败,因为 "Shark" 无法转换为 int。您需要在 Load 方法中考虑到这一点,或者从输入文件中取出 "Shark" 行。

您在尝试阅读 164.5326199.6745 时会遇到类似的错误。这些字符串不能转换为整数,因为它们是浮点数。要么更改您的输入文件以删除这些数字的小数部分,要么改用 float.Parsedouble.Parse