Я работаю над созданием икосферы, и дошел до отрисовки части кода, но я продолжаю получать исключение NullReferenceException - необработанная ошибка. Я знаю, на какой код он указывает, но я не знаю, что на самом деле не так или как это исправить.
Вот код класса:
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));
Кто-нибудь видит, что вызывает эту проблему?