2

私はicosphereの構築に取り組んでおり、コードの描画部分まで到達しましたが、NullReferenceExceptionが未処理のエラーでした。私はそれが指しているコードのbtを知っていますが、実際に何が間違っているのか、それを修正する方法がわかりません。

クラスコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Icosahedron_Test
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Camera camera;

    VertexPositionColor[] verts;
    VertexBuffer vertexBuffer;

    BasicEffect effect;

    Matrix worldTranslation = Matrix.Identity;
    Matrix worldRotation = Matrix.Identity;

    int radius = 1; //planet radius
    int refinement = 2;  // number of times to refine surface
    TriXYZ[] vertices; // array containin vertex locations

    Icosahedron planet;

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

    /// <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()
    {
        camera = new Camera(this, new Vector3(0, 0, 5),
            Vector3.Zero, Vector3.Up);
        Components.Add(camera);


        planet = new Icosahedron(radius, refinement, vertices); // create the planet object ( the icosphere )
        vertices = planet.InitializeArray();  // fill the initial verticies list (TriXYZ[])

        //Here is where you will get the world radius and number of time to refine. For now, use constants

        vertices = planet.Refine(vertices, refinement);  // subdivide the triangles as many times as is specified by refinement variable

        // at this point, I should be able to move on to draw and create the list for drawing the triangles of the icosphere

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

        //Initialize Verticies
        VertexPositionColor[] verts;

        verts = planet.BuildList(vertices);

        //set vertex data in vertexBuffer
        vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionColor),
            verts.Length, BufferUsage.None);
        vertexBuffer.SetData(verts);

        //Initialize BAsic effect
        effect = new BasicEffect(GraphicsDevice);
    }

    /// <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();

        //Translation
        KeyboardState keyboardState = Keyboard.GetState();
        if (keyboardState.IsKeyDown(Keys.Left))
            worldTranslation *= Matrix.CreateTranslation(-.01f, 0, 0);
        if (keyboardState.IsKeyDown(Keys.Right))
            worldTranslation *= Matrix.CreateTranslation(.01f, 0, 0);
        if (keyboardState.IsKeyDown(Keys.Up))
            worldTranslation *= Matrix.CreateTranslation(0, .01f, 0);
        if (keyboardState.IsKeyDown(Keys.Down))
            worldTranslation *= Matrix.CreateTranslation(0, -.01f, 0);
        //Rotation
        worldRotation *= Matrix.CreateFromYawPitchRoll(
            MathHelper.PiOver4 / 60,
            0,
            0);


        base.Update(gameTime);
    }

    /// <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.CornflowerBlue);
        GraphicsDevice.SetVertexBuffer(vertexBuffer);

        //Set object and camera info
        effect.World = worldRotation * worldTranslation * worldRotation;
        effect.View = camera.view;
        effect.Projection = camera.projection;
        effect.VertexColorEnabled = true;

        //Begin effect and draw for pass
        foreach (EffectPass pass in effect.CurrentTechnique.Passes)
        {
            pass.Apply();

            GraphicsDevice.DrawUserPrimitives<VertexPositionColor>
                (PrimitiveType.TriangleList, verts, 0, (verts.Length/3));
        }

        base.Draw(gameTime);
    }
}
}

それが指しているコードの部分はこれです:

GraphicsDevice.DrawUserPrimitives<VertexPositionColor>
    (PrimitiveType.TriangleList, verts, 0, (verts.Length/3));

誰かがこの問題の原因を見ていますか?

4

6 に答える 6

7

verts変数が割り当てられることはないため、はnullです。メソッドはスコープ内にLoadContent()作成し、クラスのメンバーであるスコープを無視します。verts

于 2011-07-19T16:54:28.143 に答える
1

これは、この種の問題に対する一般的な答えです。

デバッガーでコードを実行します。未処理のnull参照が原因で停止した場合は、停止したコード行の各項目にマウスを合わせます。nullの場合は「null」と表示されます。ツールチップが機能しない場合は、各アイテムをクリックし、QuickWatch(Shift + F9)を使用して値を表示します。

于 2011-07-19T16:54:47.227 に答える
0

verts.Lengthにアクセスしようとすると、vertsはおそらくnullになります。そこにブレークポイントを設定し、自分自身を調べて、デバッガーに確認します。

于 2011-07-19T16:54:24.847 に答える
0

アクセスするときverts.Length vertsはnullだと思います。Debug.WriteLine()しかし、出力を追加して正確に何が起こるかを確認したり、単にブレークポイントを設定したりDebugger.Break()呼び出したりできないのはなぜですか?

于 2011-07-19T16:54:29.237 に答える
0

vertsがnullであると思い切って推測します。これは、初期化に基づいています。

于 2011-07-19T16:55:43.940 に答える
0

ここにあるすべての投稿に加えて、VSで例外処理を有効にしていることを確認してください。

ここに画像の説明を入力してください

[共通言語ランタイムの例外]チェックボックスをオンにすると、VSが問題が発生した正確な行に誘導される可能性があります。

編集

これは、VSメニューの[デバッグ]->[例外]にあります。

お役に立てれば。

よろしく。

于 2011-07-19T16:57:38.493 に答える