Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 敌人的音频和精灵表赢了';当看到玩家时,不要启动/更改_C#_Audio_Detection_Sprite Sheet - Fatal编程技术网

C# 敌人的音频和精灵表赢了';当看到玩家时,不要启动/更改

C# 敌人的音频和精灵表赢了';当看到玩家时,不要启动/更改,c#,audio,detection,sprite-sheet,C#,Audio,Detection,Sprite Sheet,对于我的程序,我在windows窗体上生成随机放置的敌人,当玩家不在视线范围内时让他们四处游荡。当玩家进入玩家的射程内时,他们会跟随并攻击玩家,直到玩家再次离开射程 现在,所有这些代码都工作得很好,但我遇到的问题是,当敌人看到玩家时,我想将敌人的精灵表(在本例中是黑眼蠕虫的东西)更改为不同的精灵表,显示它是“敌对的”。同时,音频提示将开始播放,直到播放器超出范围后才会停止 另外,我不确定这是否相关,但在一段时间后,一个新的敌人将出现,因此屏幕上有多个敌人 我不知道为什么,但敌人的精灵不会切换精灵

对于我的程序,我在windows窗体上生成随机放置的敌人,当玩家不在视线范围内时让他们四处游荡。当玩家进入玩家的射程内时,他们会跟随并攻击玩家,直到玩家再次离开射程

现在,所有这些代码都工作得很好,但我遇到的问题是,当敌人看到玩家时,我想将敌人的精灵表(在本例中是黑眼蠕虫的东西)更改为不同的精灵表,显示它是“敌对的”。同时,音频提示将开始播放,直到播放器超出范围后才会停止

另外,我不确定这是否相关,但在一段时间后,一个新的敌人将出现,因此屏幕上有多个敌人

我不知道为什么,但敌人的精灵不会切换精灵表,而且当玩家看到我的代码时,音频也不会开始播放。我做错了什么

代码如下:

  //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
            }           
    }
在这个“漫游”计时器中调用了更改精灵表的函数,它应该遍历每个敌人,以检查是否应该更改精灵表

这样,音频工作正常,当播放器在范围内时开始,当播放器超出范围时停止

但我仍然不太确定我将如何为敌人更换精灵床单。我修改了代码,使实际的图像/精灵表设置在敌人类中,而不是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;

        }
    }
然后在计时器中,我将引用neutral敌意函数作为ChangeSpriteSheet的参数。我是朝着正确的方向走,还是完全偏离了方向

敌人=新的敌人(

这条线没有做你认为它做的事情。它创建了一个新的敌人,并让你的
敌人
变量指向它。注意:
en
变量或你列表中敌人的实例没有改变

您需要编写一个方法,让现有的敌人更改其spritesheet,然后在
en
变量上调用它


至于声音:你不需要一个bool列表。你需要一个单一的
bool
开始为
false
,只有在看到一个时才设置为
true
。然后你需要一个简单的
if
。你的循环对我来说没有任何意义。试着把它简化为单个bool。

哦,我甚至没有意识到,谢谢你我现在就开始。谢谢!:而且我想我一开始试着只用一个bool作为音频,但是因为我在检查是否有敌人“看到”了播放器,所以总是设置为false,因为总有至少一个敌人看不到播放器player@ThatOneCanadian然后不要将布尔值更改为false如果敌人看不到玩家,只有在敌人能看到玩家的情况下才将其更改为true。因此我按照你的建议制作了音频,效果非常好,但我仍然无法更改以前存在的敌人的精灵表:(@ThatOneCanadian)您需要在敌人类中使用一个方法,该方法接受第一个构造函数参数的参数,并使用该参数更改敌人精灵。