Для моей программы я генерирую случайным образом врагов в форме окна и их брошу вокруг, когда игрока не видно. Когда игрок попадает в зону действия игрока, они будут следовать и атаковать игрока до тех пор, пока игрок не выйдет за пределы диапазона.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. Я иду в правильном направлении, или я полностью отключен?
Ох, _oh_ Я даже не осознавал, большое вам спасибо. Я пойду об этом прямо сейчас. Благодаря! : D – ThatOneCanadian
И я думаю, что сначала пытался использовать только один bool для аудио, но, поскольку я проверял, не видел ли какой-либо враг игрока, он всегда будет установлен в false, поскольку всегда был по крайней мере один враг, который мог бы 't' see 'player – ThatOneCanadian
@ThatOneCanadian Затем не меняйте значение логического на false, если противник не может видеть игрока, только измените его на true, если противник * может * видеть игрока. –