2013-04-18 88 views
0
**public GraphicsDeviceManager graphics; 
     public SpriteBatch spriteBatch; 
     private int[] Heights; 
     //public Texture2D Terrain; 
     public Texture2D[] TerrainList; 
     public Color[] Colors_TerrainTexture; 
     public int [] Coordinates_X; 
     Camera camera = new Camera(); 
     GraphicsDevice device; 

     public MapFunctions()     
     { 

     } 
public void GenerateMap_Heights(int Map_Width,int Map_Height,float Relief,float Mountain_Peak_Height) 
      { 
       Heights = new int[Map_Width]; 
       Random randomizer = new Random(); 
       double rand1 = randomizer.NextDouble() + 1; 
       double rand2 = randomizer.NextDouble() + 2; 
       double rand3 = randomizer.NextDouble() + 3; 

       float offset = Map_Height/2; 
       float peakheight = 324; 
       float flatness = Mountain_Peak_Height; 

       for (int x = 0; x < Map_Width; x++) 
       { 
        double height = peakheight/rand1 * Math.Sin((float)x/flatness * rand1 + rand1); 
        height += peakheight/rand2 * Math.Sin((float)x/flatness * rand2 + rand2); 
        height += peakheight/rand3 * Math.Sin((float)x/flatness * rand3 + rand3); 
        height += offset; 
        Heights[x] = (int)height; 
       } 
      } 

      public bool CanDraw = false; 

      public void CreateTerrain(int Map_Width, int Map_Height,int TerrainTexture_Width,Color Color_Terrain,Color Color_Background) 
      {    
       int TimesToLoop = (Map_Width/TerrainTexture_Width) + 1; 
       int[] Coordinates_X = new int[TimesToLoop]; 
       device = graphics.GraphicsDevice; 
       for (int b = 0; b <= TimesToLoop; b++) 
       { 
        if (b == TimesToLoop) 
        { 
         Colors_TerrainTexture = new Color[Map_Width % TerrainTexture_Width * Map_Height]; 
         TerrainTexture_Width = Map_Width % TerrainTexture_Width; 
        } 
        else 
        { 
         Colors_TerrainTexture = new Color[TerrainTexture_Width * Map_Height]; 
        } 
        Coordinates_X[b] = TerrainTexture_Width * b; 
        for (int x = 0; x < TerrainTexture_Width; x++) 
        {      
         for (int y = 0; y < Map_Height; y++) 
         { 
          if (y > Heights[x]) 
           Colors_TerrainTexture[x + y * TerrainTexture_Width] = Color.Green; 
          else 
           Colors_TerrainTexture[x + y * TerrainTexture_Width] = Color.Transparent; 
         } 
        }     
        Terrain = new Texture2D(device, TerrainTexture_Width, Map_Height, false, SurfaceFormat.Color); 
        Terrain.SetData(Colors_TerrainTexture); 
        TerrainList[b] = Terrain; //I get nullreference exception in this line 
       } 
       spriteBatch = new SpriteBatch(device); 
       CanDraw = true; 
      }** 

TerrainList [b] = Terrain; (这行几乎在代码的末尾)我在这一行中得到空引用异常。我从game1的LoadContent()中调用了两个函数(CreateTerrain和GenerateMap_Heights)。请帮忙,我在代码中找不到问题。XNA 4.0。空参考例外

对不起,我的英语不好。

回答

0

你曾经创造过TerrainList吗?我正在浏览代码并没有看到它。

Texture2D[] TerrainList = new Texture2D[10]; 

现在你正试图在你的数组中设置一个Texture2D,但它还没有被创建。

1

创建您地形名单,但从未对其进行初始化...

//Something like 
TerrainList = new Texture2D[]; 

现在您试图访问一个空的集合的索引。

+0

哦。谢谢。你是最好的。 :) – Jancis

+0

除了不编译... –

0

TerrainList从未在提供的代码中初始化,所以当您使用TerrainList[b]将其索引时,它将返回null。您需要创建一个Texture2D[]的实例并将其分配给TerrainList。此外,您需要确保它至少有b个元素,因为您正在使用b来索引该数组。