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

Posted

技术标签:

【中文标题】看到玩家时,敌人的音频和精灵表不会启动/更改【英文标题】:Enemy audio and sprite sheet won't start/change when player is seen 【发布时间】:2015-01-29 16:15:03 【问题描述】:

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

现在,所有代码都可以正常工作,但我遇到的问题是当敌人看到玩家时,我想更改敌人的精灵表(在这种情况下是黑眼虫),到一个不同的精灵表,表明它是“敌对的”。同时,音频提示将开始播放,直到播放器超出范围才会停止。

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

我不知道为什么,但是敌人的精灵不会切换精灵表,并且当玩家使用我的代码查看时音频不会开始播放。我究竟做错了什么?

代码如下:

  //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
                       
    

在这个'wander'计时器中调用改变精灵表的函数,它应该遍历每个敌人以检查是否应该改变精灵表。

这样,音频就可以正常工作了,它会在玩家在范围内时开始播放,并在玩家超出范围时停止。

但我仍然不太确定如何为敌人更改精灵表。我更改了代码,以便在 Enemies 类而不是 Windows 窗体中设置实际的图像/精灵表,所以它们都在同一个地方,但我不确定从那里去哪里。

针对cmets,你们的意思是这样的吗?

   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 = new Enemies( ...

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

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

至于声音:您不需要布尔列表。您需要一个以false 开头的bool,只有在看到一个时才设置为true。那么你需要一个简单的if。你的循环对我来说没有任何意义。尝试将其简化为单个布尔值。

【讨论】:

哦,我什至没有意识到,非常感谢。我现在就去做。谢谢! :D 我想我最初尝试只使用一个布尔值作为音频,但由于我正在检查是否有敌人“看到”播放器,所以它总是设置为 false,因为总是在至少有一个敌人无法“看到”玩家 @ThatOneCanadian 如果敌人看不到玩家,则不要将布尔值更改为 false,只有在敌人可以看到玩家时才将其更改为 true播放器。 所以我按照你对音频的建议做了,效果很好,但我仍然无法为以前存在的敌人更改精灵表:( @ThatOneCanadian 您需要在 Enemies 类中使用一个方法,该方法采用您的第一个构造函数参数的参数,并使用该参数来更改此敌人精灵。

以上是关于看到玩家时,敌人的音频和精灵表不会启动/更改的主要内容,如果未能解决你的问题,请参考以下文章

Unity - 如何在运行时更改播放器精灵表?

敌人的精灵不会向左翻转

除非我运行一些命令,否则脉冲音频不会在启动时启动

播放或暂停音频时更改 innerHTML

web/javascript的自动音频精灵生成器?

Web应用程序的背景音频