看到玩家时,敌人的音频和精灵表不会开始/更改

本文关键字:精灵 开始 更改 音频 玩家 敌人 | 更新日期: 2023-09-27 18:32:34

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

现在,所有这些代码都运行良好,但我遇到的问题是,当敌人看到玩家时,我想将敌人的精灵表(在这种情况下是黑眼睛的蠕虫(更改为不同的精灵表,表明它是"敌对的"。同时,音频提示将开始播放,直到玩家超出范围才会停止。

另外,我不确定这是否相关,但是在一定的间隔后,会出现一个新的敌人,所以屏幕上有多个敌人

我不知道为什么,但是敌人的精灵不会切换精灵表,当玩家使用我的代码出现在视野中时,音频也不会开始播放。我做错了什么?

代码如下:

  //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 的参数。我是在朝着正确的方向前进,还是完全偏离了方向?

看到玩家时,敌人的音频和精灵表不会开始/更改

敌人 = 新敌人( ...

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

你需要编写一个方法,让现有的敌人改变它的精灵表,然后在你的en变量上调用它。

至于声音:你不需要布尔值列表。您需要一个从false开始的单个bool,该仅在看到一个时设置为true。然后你需要一个简单的if.你的循环对我来说没有任何意义。尝试将其简化为单个布尔值。