3

可能重复:
XNA - 找不到文件问题

在这里,我试图在 windows phone 7 应用程序项目中加载 Round.png 文件。我不知道如何在运行时加载此图像。如果这是一个愚蠢的问题,作为 Windows 应用程序开发的新手,我真的很抱歉。请帮助...提前谢谢!!!

     /// <summary>
     /// This is the main type for your game
     /// </summary>
   public class Game1 : Microsoft.Xna.Framework.Game
   {
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Texture2D texRound;
    Rectangle HitRegion;
    bool isSelected = false;

    TouchCollection touches = TouchPanel.GetState();

    //start position of round, in the center of screen
    int positionX = 400;
    int positionY = 240;

    //random number Axis X and Y
    Random randomX;
    Random randomY;

    //the range for random number of start and end of X, Y
    int startX, endX;
    int startY, endY;

    //total time
    float milliseconds = 0f;

    //score count
    int count = 0;

    //game font
    SpriteFont font;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

        // Frame rate is 30 fps by default for Windows Phone.
        TargetElapsedTime = TimeSpan.FromTicks(333333);

        // Extend battery life under lock.
        InactiveSleepTime = TimeSpan.FromSeconds(1);
    }

    /// <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

        base.Initialize();
     }

    /// <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);
        texRound = Content.Load<Texture2D>("Round");
        randomX = new Random();
        randomY = new Random();

        // The X axis bound range of touch for ball
        startX = texRound.Width;
        endX = GraphicsDevice.Viewport.Width - texRound.Width;

        // The X axis bound range of touch for ball
        startY = texRound.Height;
        endY = GraphicsDevice.Viewport.Height - texRound.Height;

        // Define the HitRegion of ball in the middle of touchscreen
        HitRegion = new Rectangle(positionX - texRound.Width / 2,
        positionY - texRound.Height / 2, texRound.Width,
        texRound.Height);

        // Load the font definition file
        font = Content.Load<SpriteFont>("gamefont");

        // 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)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        // TODO: Add your update logic here

        // Accumulate the elapsed milliseconds every frame
        milliseconds +=
        (float)gameTime.ElapsedGameTime.TotalMilliseconds;
        if (milliseconds > 1000)
        {
            // When the milliseconds greater than 1000 milliseconds,
            // randomly locate a new position for the ball
            HitRegion.X = randomX.Next(startX, endX + 1);
            HitRegion.Y = randomY.Next(startY, endY + 1);
            // Reset the milliseconds to zero for new milliseconds
            // count
            // make the ball not been selected
            milliseconds = 0f;
            if (isSelected)
                isSelected = false;
        }
        base.Update(gameTime);

        Point touchPoint = new Point((int)touches[0].Position.X, (int)touches[0].Position.Y);
        if (HitRegion.Contains(touchPoint))
        {
            isSelected = true;
            count++;
        }
        else
        {
            isSelected = false;
        }
    }

    /// <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.Green);

        // TODO: Add your drawing code here

        spriteBatch.Begin();
        if (isSelected)
        {
            spriteBatch.Draw(texRound, HitRegion, Color.Red);
        }
        else
        {
            spriteBatch.Draw(texRound, HitRegion, Color.White);
        }
        spriteBatch.DrawString(font, "Score:" + count.ToString(),
        new Vector2(0f, 0f), Color.White);
        spriteBatch.End();

        base.Draw(gameTime);
    }
}

错误详情

这是错误信息

4

2 回答 2

1

内部异常中的路径看起来是正确的:\"Content\\Round.xnb\",多余的斜杠只是因为它被转义了。这是来自您的可执行文件的相对路径,默认情况下它类似于:Visual Studio Projects\MyCoolGame\MyCoolGame\bin\x86\Debug\Content\Round.xnb. 您应该将此路径与Round.xnb文件的真实路径进行比较,而不是 png。

  • 如果Round.xnb在任何地方都不存在,那么您的 png 文件不是 Content 项目的一部分,或者 Content 项目没有被构建
  • 如果文件确实存在,但在子目录中,请在加载纹理时指定子目录的名称,如:Content.Load<Texture2D>("myDir\\Round");

由于内部异常不是在寻找“Round.png.xnb”,因此您的名字正确无误,@Ricket 的回答对您没有任何帮助。

于 2012-10-07T17:18:41.827 回答
1

我假设您正确地将 Round.png 文件放在您的内容目录(或项目)中,并且按照默认设置正确编译。

右键单击该文件并打开其属性。检查“名称”字段。这就是Content.Load<>所期待的。因此,例如,如果您将名为“Circular.png”的文件拖到 Content 文件夹中,那么它将自动命名为“Circular”,但如果您将文件重命名为“Round.png”,通常它将保持名为“ Circular”,让您手动更改属性中的名称并更新代码中的所有引用。

于 2012-10-04T16:10:02.263 回答