【问题标题】:Could not load asset as a non-content file无法将资产加载为非内容文件
【发布时间】:2017-04-24 19:58:46
【问题描述】:

为什么这种情况不断发生?我研究它并了解它们会有所帮助。 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Security.Policy;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace Pratice
{
    public class CharacterClass
{
    public Texture2D texture;
    public Vector2 position, velocity;
    public Rectangle SourceRect;
    public string path;
    public bool HasJumped;

    public CharacterClass()
    {
        HasJumped = false;
        position = new Vector2();
        texture = null;
    }

    public void Initialize()
    {

    }

    public void LoadContent(ContentManager Content)
    {
        path = "Character/BlueAnvil";
        texture = Content.Load<Texture2D>(path);
    }

    public void Update(GameTime gameTime)
    {
        position += velocity;

        //input Controls
        KeyboardState keyState = Keyboard.GetState();
        if (keyState.IsKeyDown(Keys.A))
            position.X -= 5f;
        if (keyState.IsKeyDown(Keys.D))
            position.X = 5f;
        if (keyState.IsKeyDown(Keys.Space) && HasJumped == false)
        {
            position.Y -= 10f;
            velocity.Y = -5f;
            HasJumped = true;
        }

        if (HasJumped == true)
        {
            float i = 1;
            velocity.Y += 0.15f*i;
        }

        if (position.Y + texture.Height >= 450)
            HasJumped = false;

        if (HasJumped == false)
            velocity.Y = 0f;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(texture, position, Color.White);
    }
}
}

我需要得到这个修复,这样我才能记住它。了解如何做到这一点,我需要帮助才能做到这一点。所以我需要帮助,以了解我做错了什么。

【问题讨论】:

  • “我的团队希望我成为高级程序员”——您希望我们为您完成这项工作,是吗?
  • 我不明白为什么这不起作用。我身体不明白。为什么代码不起作用?它应该在屏幕上放置一个精灵,但它会产生一个错误
  • 您是否为自己寻找答案而烦恼?这个确切的问题之前已经回答过很多次了。

标签: c# monogame


【解决方案1】:

正如 Nahuel Ianni 在他的回答中所说,游戏从内容目录加载内容文件。因此,所有内容都应该放在 Content 目录中。

换句话说,它正在查看的实际路径是“Content/Character/BlueAnvil”。确保将文件放在正确的目录中。

由此可能引起的其他问题是,如果您使用的是 Visual Studio,则文件可能不会被复制到输出中。您需要选择文件并打开属性,然后选择复制到输出并将其设置为更新或始终。

最后是文件本身的文件格式。如果它不是 .xnb,则不太可能被接受。 .xnb 文件由 XNA 或 Monogame 内容管道项目创建。在 XNA 中,所有文件都必须转换为这种格式,但 Content Pipeline 为您完成了这项工作。 在 Monogame 中,有些文件可以直接加载,但它们因操作系统而异。我记得我头顶上的 Windows 接受 .png 和 .wav 文件。我不记得其他接受的文件格式,并且找不到我上次搜索时看到的方便表。

因此,游戏实际要加载的是“Content/Character/BlueAnvil.xnb”或“Content/Character/BlueAnvil.png”

编辑:虽然我发布这个答案已经有一段时间了,而且它仍然大部分是正确的,但我觉得我应该提到 Monogame 现在已经删除了 ContentManager 加载非 .xnb 文件的能力,例如 .png 和.wav。但是,它确实具有通过 Texture2D.FromStream(graphicsDevice, fileStream) 等方法加载这些文件的功能。你应该使用哪个。

【讨论】:

    【解决方案2】:

    您的游戏应该在项目中有一个“内容”目录。在该目录中,您应该放置您的内容资产,例如图像 - BlueAnvil.png。然后你应该在游戏 ctor 中有一个设置,你将内容目录设置为“内容”:

    Content.RootDirectory = "Content";
    

    之后在游戏的LoadContent() 方法中,您必须加载资源:Content.Load&lt;Texture2D&gt;("Character/BlueAnvil"),并且它应该拉入您的纹理,前提是您已将 BlueAnvil 文件设置为如上所述的内容。 XS 在构建项目时应该执行“优化 PNG”步骤。

    内容文件夹最终位于资源包中, 将提取该资源包并从中创建您请求的 Texture2D 对象。

    【讨论】:

      【解决方案3】:

      我的内容文件夹中的单个 jpg 文件遇到了这个问题。我将该文件的“复制到输出目录”属性更改为“如果较新则复制”右键单击图片 - 属性

      【讨论】:

        【解决方案4】:

        我在代码中发现了一个问题。路径变量的字符串构造包括一个正斜杠:

        path = "Character/BlueAnvil"
        

        修改:

        path = "Character//BlueAnvil"
        

        或

        path = @"Character/BlueAnvil"
        

        【讨论】:

        • 这不是必需的。正斜杠在 C# 字符串常量中没有特殊含义。如果路径包含反斜杠,则需要使用反斜杠,但事实并非如此。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多