XNA nullreferenceexception, каркасные классы - PullRequest
1 голос
/ 22 июля 2011

Я возился с некоторыми треугольниками и сделал это.Сначала я думал, что все «методы», которые я написал, были созданы, но эти «методы»: устройство, содержание и эффект;на самом деле все нули.Код почти в порядке, что я должен был написать вместо них?

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);
    }
}

}

Ответы [ 3 ]

1 голос
/ 22 июля 2011

Те (устройство, контент и эффект) не являются «методами», они являются полями (или переменными или членами). Вы должны назначить их перед их использованием. Контент и устройство, вероятно, должны быть назначены в конструкторе класса. Вы можете найти существующий экземпляр ContentManager в своем классе Game. Эффект может быть назначен в конструкторе или загружен.

Кроме того, вы назначаете только две вершины - это не приведет к ничьей.

1 голос
/ 22 июля 2011

Вы не создали экземпляры объектов Content, Device или Effect. Поскольку вы используете свой собственный класс, я бы добавил к нему constructor, который принимает эти объекты, например:

triangle(GraphicsDevice _device, ContentManager _content)
{
    device = _device;
    content = _content;
    content.RootDirectory = "Content";
}

Кроме того, в вашем bob методе вы должны сделать следующее:

public void bob()
{
    effect = content.Load<Effect>("effects");
}
0 голосов
/ 22 июля 2011

Ну, единственное, что вы на самом деле инициализируете, это ваш массив "вершин".Я не понимаю, где вы на самом деле пытаетесь инициализировать другие переменные, если только вы не включили в свой вопрос какой-то код, например, где вы на самом деле вызываете свой

Triangle testTriangle =  new Triangle();

Вам следует инициализировать остальные переменные вашего класса, device, содержимое и эффект в функции инициализации вашего класса, если вы не планируете устанавливать их в другом месте.Прошло немного времени с тех пор, как я в последний раз использовал XNA, но, если я правильно помню, Device и Content могут быть инициализированы для вас при создании нового игрового шаблона, поэтому все, что вам нужно будет сделать, это установить их равными testTriangle.Device и testTriangle.Content.Если нет, я бы настоятельно рекомендовал посмотреть учебники на сайте XNA, поскольку они фантастические, и я на 100% уверен, что вы сможете выяснить, как их инициализировать.

...