【问题标题】:XNA Apply effect on BasicEffectXNA 在 BasicEffect 上应用效果
【发布时间】:2014-05-12 06:09:43
【问题描述】:

我正在用 XNA 4.0 制作游戏,我真的不明白效果和基本效果的东西。

我目前有这个:

foreach (ModelMesh mesh in model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        if (mesh.Name != collisionShapeName)
        {
            effect.TextureEnabled = true;

            effect.Texture = _textures[name];

            effect.SpecularColor = new Vector3(_specularColor);
            effect.SpecularPower = 32;
        }
    }
}

我找到了一个渲染阴影的教程,我需要将这段代码应用到我的身上:

foreach (ModelMesh mesh in model.Meshes)
{
    foreach (ModelMeshPart part in mesh.MeshParts)
        part.Effect = material.effect;
}

所以我把这段代码放在我的foreach (BasicEffect effect in mesh.Effects)之前,但是它不起作用,这是foreach (BasicEffect effect in mesh.Effects)这一行上抛出的错误:

无法将“Effect”类型的对象转换为“BasicEffect”类型。

我真的迷路了……

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    我在 XNA 方面做得不多,但这是一个基本的 C# 问题。

    正如错误所说,您正在尝试遍历 meshEffects,但您将它们全部转换为 BasicEffect 实例。 BasicEffectEffect 的子类,并且并非您添加的所有效果都是 BasicEffect 类型的。所以演员表失败了。

    理想情况下,您应该在添加 BasicEffect 对象之前设置它们的属性,而不是迭代 Effects 属性,但在不了解您的代码的情况下,我可以建议的最好方法是做这样的事情:

    foreach (Effect effect in mesh.Effects)
    {
        var basicEffect = effect as BasicEffect;
        if (basicEffect != null)
        {
            // Do some stuff with basicEffect
        }
    }
    

    通常,这种向下转换表明您的代码结构中的其他地方存在一些缺陷,但这可能是您在您的场景中可以做的最好的事情(如果没有对您的代码有更深入的了解,就不可能提出更好的建议)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多