2014-04-17 53 views
0

所以我剛剛完成了一個班,爲我的遊蕩&追求敵人,但一旦我經歷了,並宣佈課程,並在我運行遊戲時做了必要的編碼我得到一個NullReferenceException彈出,然後告訴我Virtual_Alien字段永遠不會被分配,並且總是默認值爲null。字段永遠不會分配,並將始終有默認值null

我在這裏做錯了什麼?

主要的遊戲代碼:

private Roaming_Aliens roamingAlien; 
private Virtual_Aliens virtualAlien; 
public Vector2 playerPosition; 
public Player mainPlayer = new Player(); 


protected override void LoadContent() 
    { 
     // Create a new SpriteBatch, which can be used to draw textures. 
     // Create a new SpriteBatch, which can be used to draw textures. 
     spriteBatch = new SpriteBatch(GraphicsDevice); 


     mainPlayer.position = playerPostion; 

     // now assign that image to each of the characters we have 
     roamingAlien.LoadContent(Content); 
     virtualAlien.LoadContent(Content); 

     mainPlayer.LoadContent(Content); 
     score.LoadContent(Content); 
     // mainBackground.LoadContent(Content); 

    } 

protected override void Update(GameTime gameTime) 
    { 
     currentKey = Keyboard.GetState(); 

     if (currentKey.IsKeyDown(Keys.Escape)) 
     { 
      this.Exit(); 
     } 



     mainPlayer.Update(gameTime); 

     score.Update(gameTime); 

     virtualAlien.Update(gameTime); 

     roamingAlien.Wander(); 
} 

protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.CornflowerBlue); 

     spriteBatch.Begin(); 

     //mainBackground.Draw(spriteBatch);   

     mainPlayer.Draw(spriteBatch); 
     virtualAlien.Draw(spriteBatch); 
     roamingAlien.Draw(spriteBatch); 
     spriteBatch.End(); 
    } 

虛擬外星人代碼:

public class Virtual_Aliens 
{ 
    private enum TankAiState 
    { 
     Chasing,   
     Wander 
    } 


    private float maxSpeed; 
    private float maxRotation; 
    private float chaseDistance; 
    private float hysteresis; 

    private Texture2D texture; 
    private Vector2 drawingOrigin; 
    private Vector2 position; 
    private TankAiState tankState = TankAiState.Wander; 
    private float orientation; 

    private Random random = new Random(); 
    private Rectangle viewportbounds; 
    public Rectangle boundingBox; 
    public Vector2 playerPosition; 

    private Vector2 heading; 


    public Virtual_Aliens(Rectangle pos, Rectangle b) 
    { 
     position = new Vector2 (100, 100); 

     boundingBox = new Rectangle(pos.X, pos.Y, pos.Width, pos.Height); 

     viewportbounds = new Rectangle(b.X, b.Y, b.Width, b.Height); 

     orientation = 0.0f; 

     heading = new Vector2(0, 0); 

     maxSpeed = 2.0f; 

     maxRotation = 0.20f; 

     random = new Random(); 

     hysteresis = 15.0f; 

     chaseDistance = 250.0f; 

    } 

    public void LoadContent(ContentManager Content) 
    { 
     texture = Content.Load<Texture2D>("images/asteroid"); 
    } 

    private Vector2 OrientationAsVector(float orien) 
    { 
     Vector2 orienAsVect; 

     orienAsVect.X = (float)Math.Cos(orien); 
     orienAsVect.Y = (float)Math.Sin(orien); 

     return orienAsVect; 
    } 


    Vector2 wanderPosition = new Vector2(); 

    public void Wander() 
    { 
     // The wander effect is accomplished by having the character aim in a random 
     // direction. Every frame, this random direction is slightly modified. 

     // the max +/- the agent will wander from its current position 
     float wanderLimits = 0.5f; 

     // this defines what proportion of its maxRotation speed the agent will turn 
     float turnFactor = 0.15f; 

     // randomly define a new position 
     wanderPosition.X += MathHelper.Lerp(-wanderLimits, wanderLimits, (float)random.NextDouble()); 
     wanderPosition.Y += MathHelper.Lerp(-wanderLimits, wanderLimits, (float)random.NextDouble()); 

     // normalize the wander position, ... 
     if (wanderPosition != Vector2.Zero) 
      wanderPosition.Normalize(); 

     // now find the new orientation based on the wanderPosition 
     orientation = TurnToFace(wanderPosition, orientation, turnFactor * maxRotation); 

     // determine the heading vector based on orientation 
     heading = OrientationAsVector(orientation); 

     // finally update the agents position based upon the new heading and its speed 
     // assume a wandering agent only moves at 0.5 of maxSpeed 
     position += heading * 0.5f * maxSpeed; 

     WrapForViewport(); 
    } 


    private void WrapForViewport() 
    { 

     if (position.X < 0) 
     { 
      position.X = viewportbounds.Width; 
     } 
     else if (position.X > viewportbounds.Width) 
     { 
      position.X = 0; 
     } 

     if (position.Y < 0) 
     { 
      position.Y = viewportbounds.Height; 
     } 
     else if (position.Y > viewportbounds.Height) 
     { 
      position.Y = 0; 
     } 
    } 

    private float WrapAngle(float radian) 
    { 
     while (radian < -MathHelper.Pi) 
     { 
      radian += MathHelper.TwoPi; 
     } 
     while (radian > MathHelper.Pi) 
     { 
      radian -= MathHelper.TwoPi; 
     } 
     return radian; 


    } 

    private float TurnToFace(Vector2 steering, float currentOrientation, float turnSpeed) 
    { 
     float newOrientation; 
     float desiredOrientation; 
     float orientationDifference; 

     float x = steering.X; 
     float y = steering.Y; 

     // the desiredOrientation is given by the steering vector 
     desiredOrientation = (float)Math.Atan2(y, x); 

     // find the difference between the orientation we need to be 
     // and our current Orientation 
     orientationDifference = desiredOrientation - currentOrientation; 

     // now using WrapAngle to get result from -Pi to Pi 
     // (-180 degrees to 180 degrees) 
     orientationDifference = WrapAngle(orientationDifference); 

     // clamp that between -turnSpeed and turnSpeed. 
     orientationDifference = MathHelper.Clamp(orientationDifference, -turnSpeed, turnSpeed); 

     // the closest we can get to our target is currentAngle + orientationDifference. 
     // return that, using WrapAngle again. 
     newOrientation = WrapAngle(currentOrientation + orientationDifference); 

     return newOrientation; 
    } 





    public void Update(GameTime gameTime) 
    {    


     if (tankState == TankAiState.Wander) 
     { 
      chaseDistance -= hysteresis/2; 
     } 

     else if (tankState == TankAiState.Chasing) 
     { 
      chaseDistance += hysteresis/2; 

     } 

     // Second, now that we know what the thresholds are, we compare the tank's 
     // distance from the cat against the thresholds to decide what the tank's 
     // current state is. 
     float distanceFromPlayer = Vector2.Distance(position, playerPosition); 
     if (distanceFromPlayer > chaseDistance) 
     { 
      // just like the mouse, if the tank is far away from the cat, it should 
      // idle. 
      tankState = TankAiState.Wander; 
     } 
     else 
     { 
      tankState = TankAiState.Chasing; 
     } 


     // Third, once we know what state we're in, act on that state. 
     float currentTankSpeed; 
     if (tankState == TankAiState.Chasing) 
     { 
      // the tank wants to chase the cat, so it will just use the TurnToFace 
      // function to turn towards the cat's position. Then, when the tank 
      // moves forward, he will chase the cat. 
      orientation = TurnToFace(playerPosition, orientation, maxRotation); 
      currentTankSpeed = maxSpeed; 
     } 
     else if (tankState == TankAiState.Wander) 
     { 
      Wander(); 

     } 

    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     drawingOrigin = new Vector2(texture.Width/2, texture.Height/2); 

     spriteBatch.Draw(texture, position, null, Color.White, orientation, drawingOrigin, 1.0f, SpriteEffects.None, 0.0f); 

    } 

    public Vector2 PlayerPosition 
    { 
     set 
     { 
      playerPosition = value; 
     } 
     get 
     { 
      return playerPosition; 
     } 

    } 



} 

回答

2

您聲明(兩次實際上)一個名爲virtualAlien(類型Virtual_Aliens)的變量。但是,你永遠在使用它所有的地方給它分配任何東西(

您申報需要的樣子:

Virtual_Alien virtualAlien = new Virtual_Alien(); 

這是它分配給Virtual_Alien類的新實例,讓您如果您需要稍後才能使用的參數,則將實例化放在所有需要的信息可用的時間點,然後在調用實例化代碼之前對可能發生的變量的任何使用添加空檢查。

romaingAlien成員似乎也有類似問題。

+0

是修復它,但然後我有談論不爲0的論點是有問題,因爲在類的構造器的虛擬的漫遊外星人類載列 '公共Virtual_Aliens(矩形POS,矩形構造器一個錯誤b)' –

+0

漫遊外星人1也沒有這個錯誤,並且在虛擬外星人不同的情況下工作正常。 編輯:剛纔看到你的意思。這是第一篇文章中的拼寫錯誤,我會改變它 –

+0

你還有問題嗎?就像我說的,如果你需要參數,請移動實例,但確保你做空檢查。 – BradleyDotNET

相關問題