2014-12-01 5 views
1

Для моей программы я генерирую случайным образом врагов в форме окна и их брошу вокруг, когда игрока не видно. Когда игрок попадает в зону действия игрока, они будут следовать и атаковать игрока до тех пор, пока игрок не выйдет за пределы диапазона.Enemy audio и спрайт-лист не начинаются и не меняются, когда игрок увиден

Теперь этот код работает отлично, но у меня возникают проблемы с тем, что, когда противник видит игрока, я хочу изменить лист спрайтов противника (черная глазная червь, в данном случае) , на другой лист спрайта, показывающий, что он «враждебный». В то же время звуковой сигнал начнет воспроизведение и не остановится до тех пор, пока игрок не выйдет за пределы диапазона.

Кроме того, я не уверен, если это уместно, или нет, но после определенного интервала, появится новый враг, так что есть несколько врагов на экране

Я не знаю, почему, но вражеские спрайты не будут переключаться на листы спрайтов, и звук не начнет воспроизводиться, если игрок находится в поле зрения с кодом, который у меня есть. Что я делаю не так?

Вот код:

//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 Form, поэтому он все в одном месте, но я не уверен, куда идти оттуда.

В ответ на комментарии вы, ребята, понимаете что-то подобное?

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.

Что касается звука: вам не нужен список bools. Вам нужен один bool, начиная с false, который установлен только на true, когда его видно. Тогда вам понадобится простой if. Ваша петля не имеет никакого смысла для меня. Попытайтесь упростить это до единственного bool.

+0

Ох, _oh_ Я даже не осознавал, большое вам спасибо. Я пойду об этом прямо сейчас. Благодаря! : D – ThatOneCanadian

+0

И я думаю, что сначала пытался использовать только один bool для аудио, но, поскольку я проверял, не видел ли какой-либо враг игрока, он всегда будет установлен в false, поскольку всегда был по крайней мере один враг, который мог бы 't' see 'player – ThatOneCanadian

+1

@ThatOneCanadian Затем не меняйте значение логического на false, если противник не может видеть игрока, только измените его на true, если противник * может * видеть игрока. –