2011-04-18 78 views
0

嘿傢伙。我有這裏的代碼完全正常工作.....它目前正在使用System.Collections.Generic;
但我想改變它使用非泛型隊列類 我有很多麻煩抓住概念..任何幫助和方向將不勝感激! 我試圖從網上的例子:
//這裏編輯的代碼更改通用隊列隊列<T>類到非通用隊列類

Queue Letters = new Queue(); //new code 
    FallingCharacter myFallingCharacter = new FallingCharacter();//new code 
    Letters.Enqueue(myFallingCharacter); //new code 

    //Queue<FallingCharacter> Letters = new Queue<FallingCharacter>(); 

原始代碼是:

partial class Game1 : Microsoft.Xna.Framework.Game 
{ 

    public enum GameState 
    { 
     StateMainMenu, 
     StatePlaying, 
     StateGameOver, 
     StateHelp, 
    } 


    GameState currentState = GameState.StateMainMenu; 

    KeyboardState kbState; 
    Keys[] pressedKeys; 


    Queue<FallingCharacter> Letters = new Queue<FallingCharacter>(); 

    float nextLetterTime = 0.6f; 
    int NextSpeedup = 20; // in 20 points lets speed it up 
    int iSpeed = 2; 

    int Score = 0; 

    GraphicsDeviceManager graphics; 
    SpriteBatch spriteBatch; 
    SpriteFont spriteFont; 
    public Game1() 
    { 
     graphics = new GraphicsDeviceManager(this); 
     Content.RootDirectory = "Content"; 

     graphics.PreferredBackBufferWidth = 800; 
     graphics.PreferredBackBufferHeight = 600; 
     graphics.ApplyChanges(); 
    } 


    protected override void LoadContent() 
    { 
     spriteBatch = new SpriteBatch(GraphicsDevice); 
     spriteFont = Content.Load<SpriteFont>("GameFont"); 

     base.LoadContent(); 
    } 


    public void OnKeyPressed(Keys k) 
    { 

     if ((currentState == GameState.StateMainMenu || 
      currentState == GameState.StateGameOver) 
      && k == Keys.Enter) 
     { 
      currentState = GameState.StatePlaying; 

      nextLetterTime = 0.0f; 
      NextSpeedup = 20; // in 20 points lsets speed it up 
      iSpeed = 1; 
      Score = 0; 
     } 
     else if (currentState == GameState.StatePlaying) 
     { 
      string sName = Enum.GetName(typeof(Keys), k); 
      if (Letters.Count > 0 && 
        String.Compare(Letters.Peek().character.ToString(), sName) == 0) 
      { 
       Score += 100; 
       Letters.Dequeue(); 

       NextSpeedup--; 

       if (NextSpeedup <= 0) 
       { 
        iSpeed++; 

        NextSpeedup = 20; 
       } 
      } 
     } 

     if (k == Keys.Escape) 
     { 
      this.Exit(); 
     } 
    } 


    protected override void Update(GameTime gameTime) 
    { 
     // The time since Update was called last 
     float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; 


     kbState = Keyboard.GetState(); 

     Keys[] newKeys = (Keys[])kbState.GetPressedKeys().Clone(); 

     if (pressedKeys != null) 
     { 
      foreach (Keys k in newKeys) 
      { 
       bool bFound = false; 

       foreach (Keys k2 in pressedKeys) 
       { 
        if (k == k2) 
        { 
         bFound = true; 
         break; 
        } 
       } 

       if (!bFound) 
       { 
        OnKeyPressed(k); 
       } 
      } 
     } 

     pressedKeys = newKeys; 

     if (currentState == GameState.StatePlaying) 
     { 

      foreach (FallingCharacter fc in Letters) 
      { 
       if (fc.Pos.Y + 50 > graphics.PreferredBackBufferHeight) 
       { 
        currentState = GameState.StateGameOver; 

        Letters.Clear(); 
        break; 
       } 
       else 
       { 
        fc.Pos.Y += (elapsed * (float)(iSpeed * 40)); 
       } 
      } 


      nextLetterTime -= elapsed; 

      if (nextLetterTime <= 0 && currentState != GameState.StateGameOver) 
      { 
       nextLetterTime = 0.75f - (iSpeed * .03f); 
       Random r = new Random(); 

       Letters.Enqueue(new FallingCharacter(
        r.Next(graphics.PreferredBackBufferWidth - 30), -30, 
        Color.LightGreen, (char)((int)'A' + r.Next(25)))); 

      } 
     } 

     base.Update(gameTime); 
    } 

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

     spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend); 

     switch (currentState) 
     { 
      case GameState.StateMainMenu: 
       { 
        spriteBatch.DrawString(spriteFont, 
         "Press Enter to begin", 
         new Vector2(graphics.PreferredBackBufferWidth/4, 
         graphics.PreferredBackBufferHeight/2), 
         Color.White); 
       } 
       break; 
      case GameState.StatePlaying: 
       { 
        spriteBatch.DrawString(spriteFont, 
         "Score: " + Score.ToString(), 
         new Vector2(10, 10), Color.White); 

        foreach (FallingCharacter fc in Letters) 
        { 
         fc.Render(spriteBatch, spriteFont); 
        } 
       } 
       break; 
      case GameState.StateGameOver: 
       { 
        spriteBatch.DrawString(spriteFont, 
         "Score: " + Score.ToString(), 
         new Vector2(10, 10), Color.White); 
        spriteBatch.DrawString(spriteFont, 
         "Game Over", 
         new Vector2(graphics.PreferredBackBufferWidth/3, 
            graphics.PreferredBackBufferHeight/2), 
         Color.LightBlue); 
        spriteBatch.DrawString(spriteFont, 
         "Press Return to Continue", 
         new Vector2(graphics.PreferredBackBufferWidth/6, 
          graphics.PreferredBackBufferHeight/2 + 50), 
         Color.LightBlue); 
       } 
       break; 
     } 

     spriteBatch.End(); 

     base.Draw(gameTime); 
    } 

} 
} 
+2

爲什麼要使用非通用隊列? – BlueMonkMN 2011-04-18 14:58:03

+0

你的編輯代碼有什麼問題。這部分對我來說很好。 – BlueMonkMN 2011-04-18 15:00:20

回答

0

所有你需要使用非泛型集合時投返回的做在使用它們之前將對象設置爲FallingCharacter。否則,它應該是幾乎相同的,與EnqueueDequeuePeek

如:

String.Compare((Letters.Peek() as FallingCharacter).character.ToString(), sName) 

foreach的可保持不變,因爲他們會隱式地做類型轉換隻要您指定FallingCharacter作爲類型即可。

如果您想要更加安全,請在盲目假設對象爲FallingCharacter之前添加一些類型檢查。

+0

的目的只是爲了確保程序運行完全一樣。是我開始正確的代碼?還是應該按照您的示例所示重新編寫它?是否可以顯示此代碼的非通用版本並解釋如何進行更改? – gronger 2011-04-18 15:15:21

+0

我不能告訴你,如果你的原始代碼本身是正確的,但從通用隊列改爲非通用隊列不應該涉及任何重大的設計更改 - 就像我說你只需要將返回的'對象'在適當的地方。否則不會編譯。但是,如果進行適當的類型轉換,它應該完全相同。 – devios1 2011-04-18 15:20:49

+0

非常感謝的人!我和我的演講者談過話了,他向我解釋了......我不得不通過添加以下代碼來編輯代碼: Queue Letters = new Queue(); (((FallingCharacter)Letters.Peek())。character.ToString(),sName)== 0) 正如你所說的......我只是很難理解爲什麼以及如何運作但都解釋了......再次感謝Chaiguy! :) – gronger 2011-04-19 05:59:12