Frameworks XNA nullreferenceexception,框架类

Frameworks XNA nullreferenceexception,框架类,frameworks,xna,nullreferenceexception,instantiation,Frameworks,Xna,Nullreferenceexception,Instantiation,我在摆弄一些三角形,然后做了这个。起初,我认为,我写的所有“方法”都是实例化的,但那些“方法”:设备、内容和效果;实际上都是空的。代码很好,我应该写什么来代替这些 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Micros

我在摆弄一些三角形,然后做了这个。起初,我认为,我写的所有“方法”都是实例化的,但那些“方法”:设备、内容和效果;实际上都是空的。代码很好,我应该写什么来代替这些

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace Learning_Test1
{
class Triangle
{
    GraphicsDevice device;
    ContentManager content;
    Effect effect;

    VertexPositionColor[] vertices;

    public void bob()
    {
        content.RootDirectory = "Content";
        content.Load<Effect>("effects");
    }

    public void Initialize()
    {
        vertices = new VertexPositionColor[3];

        vertices[0].Position = new Vector3(1, 0, 0);
        vertices[0].Color = Color.Red;

        vertices[1].Position = new Vector3(0, 0, 1);
        vertices[1].Color = Color.Green;

        vertices[1].Position = new Vector3(-1, 0, 0);
        vertices[1].Color = Color.Blue;
    }

    public void Update()
    {
    }

    public void Draw()
    {
        effect.CurrentTechnique = effect.Techniques["PretransformedPS"];

        foreach (EffectPass pass in effect.CurrentTechnique.Passes)
        {
            pass.Apply();
        }

        device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 1, VertexPositionColor.VertexDeclaration);
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Microsoft.Xna.Framework;
使用Microsoft.Xna.Framework.Content;
使用Microsoft.Xna.Framework.Graphics;
名称空间学习测试1
{
阶级三角
{
图形设备;
ContentManager内容;
效应;
VertexPositionColor[]顶点;
公共图书馆
{
content.RootDirectory=“content”;
内容。荷载(“效应”);
}
公共无效初始化()
{
顶点=新的顶点曝光颜色[3];
顶点[0]。位置=新向量3(1,0,0);
顶点[0]。颜色=颜色。红色;
顶点[1]。位置=新向量3(0,0,1);
顶点[1]。颜色=颜色。绿色;
顶点[1]。位置=新向量3(-1,0,0);
顶点[1]。颜色=颜色。蓝色;
}
公共无效更新()
{
}
公众抽签()
{
effect.currentTechnical=effect.technologies[“预变压器”];
foreach(EffectPass-in-effect.currentTechnology.passs)
{
pass.Apply();
}
device.DrawUserPrimitives(PrimitiveType.TriangleList,顶点,0,1,VertexExpositionColor.VertexDeclaration);
}
}

}

实际上,您唯一要初始化的是“顶点”数组。我看不出您实际上在哪里尝试初始化其他变量,除非您的问题中没有包含一些代码,例如,您实际上在哪里调用

Triangle testTriangle =  new Triangle();
您应该在类的初始化函数中初始化其余的类变量、设备、内容和效果,除非您计划在其他地方设置它们。我上次使用XNA已经有一段时间了,但如果我没记错的话,在创建新游戏模板时,可能会为您初始化设备和内容,所以您需要做的就是将它们设置为等于testTriangle.Device和testTriangle.Content。如果不是的话,我强烈建议你看看XNA网站上的教程,因为它们非常棒,我100%相信你能从那里找到初始化它们的方法

那些(设备、内容和效果)不是“方法”,而是字段(又名变量或成员)。您需要在使用它们之前分配它们。内容和设备可能应该在类的构造函数中分配。您可以在游戏类中找到现有ContentManager实例。可以在构造函数中指定效果,也可以加载效果


此外,您只指定了两个顶点-这将导致不绘制任何内容。

您没有实例化对象
内容
设备
效果
。当您使用自己的类时,我会向它添加一个
构造函数
,它接受这些对象,例如:

triangle(GraphicsDevice _device, ContentManager _content)
{
    device = _device;
    content = _content;
    content.RootDirectory = "Content";
}
此外,在您的
bob
方法中,您应该执行以下操作:

public void bob()
{
    effect = content.Load<Effect>("effects");
}
public void bob()
{
效果=内容。负荷(“效果”);
}