2014-12-01 38 views
1

對於我的程序,我在窗口窗體上生成隨機放置的敵人,並在玩家不在視線時讓他們四處遊蕩。當玩家進入玩家範圍內時,他們會跟隨並攻擊玩家,直到玩家再次離開範圍。現在,所有的代碼都可以正常工作,但是我遇到的麻煩是,當敵人看到玩家時,我想改變敵人的精靈表(在這種情況下是黑眼睛的蠕蟲) ,到一個不同的精靈表,表明它是「敵對的」。同時,音頻提示將開始播放,直到播放器超出範圍纔會停止播放。當玩家被看到時,敵方音頻和精靈表不會開始/改變

而且,我不知道這是否是相關與否,但有一定的時間間隔後,一個新的敵人會出現,所以在屏幕上多個敵人

我不知道爲什麼,但敵方精靈不會切換精靈表,並且當玩家看到我所擁有的代碼時,音頻不會開始播放。我究竟做錯了什麼?

下面的代碼:

//The timer to determine direction, the current sprite sheet for the enemies, and whether or not the audio is enabled 
    private void wander_Tick(object sender, EventArgs e) 
    { 
     int count = 0; 
     List<bool> seenOrNot = new List<bool>(); // a List of bools 

     //Iterates through a list of enemies 
     foreach (Enemies en in enemyList) 
     { 
      Enemies enemy = en; 

       if (CurrentPosition.Hostile[count]) 
       { 
        //The 'hostile' sprite sheet for the enemy 
        enemy = new Enemies(Properties.Resources.WormSheet, CurrentPosition.enemyX[count], CurrentPosition.enemyY[count], Sapling.ReturnWidth(), Sapling.ReturnHeight()); 
        seenOrNot.Add(true); //The player has been seen 
       } 
       else 
       { 
        //The 'neutral' sprite sheet for the enemy 
        enemy = new Enemies(Properties.Resources.WormSheetNeutral, CurrentPosition.enemyX[count], CurrentPosition.enemyY[count], Sapling.ReturnWidth(), Sapling.ReturnHeight()); 
        seenOrNot.Add(false); //The player hasn't been seen 
       } 
       en.Direction(); //Generates a random number every tick of the timer 
       count++; 
     } 

     //This foreach loop will play audio when any of the enemies sees the player 
     foreach (Boolean b in seenOrNot) 
     { 
      if (seenOrNot.Contains(true)) 
      { 
       wplayer.controls.play();//Plays music when player is in view 
      } 
      else 
      { 
       wplayer.controls.stop();//Stops the music 
      } 
     } 
    } 

任何幫助表示讚賞,一如既往:)

所以我有這樣的代碼迄今功能改變精靈表:

public void ChangeSpriteSheet() 
    { 
     if (Hostile) 
     { 
      enemySprite = Properties.Resources.WormSheet; 
      CurrentPosition.seen = true; 

     } 
     else 
     { 
      enemySprite = Properties.Resources.WormSheetNeutral; 
     } 

    } 

而我改變了這個漂泊計時器:

private void wander_Tick(object sender, EventArgs e) 
    { 
     CurrentPosition.seen = false; 
     int count = 0; 
     foreach (Enemies en in enemyList) 
     { 
      en.ChangeSpriteSheet(); //Changes the sprite sheet for the current enemy 

      en.Direction(); //Generates a random number every tick of the timer 
      count++; 
     } 

     //This foreach loop will play audio when any of the enemies sees the player 
      if (CurrentPosition.seen) 
      { 
       wplayer.controls.play();//Plays music when player is in view 
      } 
      else 
      { 
       wplayer.controls.stop();//Stops the music 
      }   
    } 

在這個'流浪'定時器中調用更改精靈表的函數,它應該遍歷每個敵人以檢查精靈表是否應該更改。

這樣,音頻就可以正常工作,它會在播放器進入距離時開始播放,當播放器離開時停止播放。

但我仍然不太確定如何去改變敵人的精靈表。我更改了代碼,以便實際的圖像/精靈表被設置在Enemies類而不是Windows窗體中,所以它們都在同一個地方,但我不確定從那裏去哪裏。

針對評論,你們是否有這樣的意思?

public Image NeutralHostile() //Returns the current sprite sheet 
    { 
     return enemySprite; 
    } 

    public void ChangeSpriteSheet(Image image) 
    { 

     if (Hostile) 
     { 
      image= Properties.Resources.WormSheet; 
      CurrentPosition.seen = true; 
     } 
     else 
     { 
      image = Properties.Resources.WormSheetNeutral; 

     } 
    } 

然後在計時器我參考NeutralHostile功能作爲ChangeSpriteSheet的參數。我正朝着正確的方向走,還是我完全離開?

回答

1

敵人=新的敵人(...

此行是不是做了什麼你認爲它它創建了一個新的敵人,它可以讓你的enemy變量點注意:在en變量或者列表中敵人的實例尚未更改

你需要寫,它可以讓現有的敵人改變它的spritesheet的方法,然後調用它在你的en變量。

至於聲音:你不需要的bool的列表。您需要一個bool開始false只有當看到一個時,它只設置爲true。那麼你需要一個簡單的if。你的循環對我沒有任何意義。嘗試將其簡化爲單個布爾值。

+0

哦,_oh_我什至沒有意識到,非常感謝你。我現在就去解決這個問題。謝謝! :D – ThatOneCanadian 2014-12-01 15:59:10

+0

我認爲我最初只使用了一個單一的布爾音頻,但由於我正在檢查是否有任何敵人「看到」了該播放器,它總是會被設置爲假,因爲總是有至少一個敵人能夠「T‘看’的球員 – ThatOneCanadian 2014-12-01 16:11:39

+1

@ThatOneCanadian那就不要布爾的值更改爲false,如果敵人看不到的球員,只將其更改爲true,如果敵人*可以*看到球員。 – 2014-12-01 16:26:44