Improve item firing sound in network

This commit is contained in:
Benau 2018-07-28 01:00:41 +08:00
parent b0f20ca5a5
commit 5f90a61c3d
3 changed files with 83 additions and 40 deletions

View File

@ -109,6 +109,23 @@ void Powerup::rewindTo(BareNetworkString *buffer)
}
} // rewindTo
//-----------------------------------------------------------------------------
void Powerup::update(int ticks)
{
// Remove any sound ticks that should have played
const int remove_ticks = World::getWorld()->getTicksSinceStart() - 1000;
for (auto it = m_played_sound_ticks.begin();
it != m_played_sound_ticks.end();)
{
if (*it < remove_ticks)
{
it = m_played_sound_ticks.erase(it);
continue;
}
break;
}
} // update
//-----------------------------------------------------------------------------
/** Sets the collected items. The number of items is increased if the same
* item is currently collected, otherwise replaces the existing item. It also
@ -132,7 +149,11 @@ void Powerup::set(PowerupManager::PowerupType type, int n)
m_number=n;
if(m_sound_use != NULL)
// Don't re-create sound sound during rewinding
if (RewindManager::get()->isRewinding())
return;
if (m_sound_use != NULL)
{
m_sound_use->deleteSFX();
m_sound_use = NULL;
@ -160,7 +181,7 @@ void Powerup::set(PowerupManager::PowerupType type, int n)
break;
case PowerupManager::POWERUP_BUBBLEGUM:
m_sound_use = SFXManager::get()->createSoundSource("goo");
m_sound_use = SFXManager::get()->createSoundSource("goo");
break ;
case PowerupManager::POWERUP_SWITCH:
@ -191,7 +212,7 @@ Material *Powerup::getIcon() const
//-----------------------------------------------------------------------------
/** Does the sound configuration.
*/
void Powerup::adjustSound()
void Powerup::adjustSound()
{
m_sound_use->setPosition(m_kart->getXYZ());
// in multiplayer mode, sounds are NOT positional (because we have multiple listeners)
@ -212,18 +233,19 @@ void Powerup::adjustSound()
}
} // adjustSound
//-----------------------------------------------------------------------------
void Powerup::playSound()
{
if (!RewindManager::get()->isRewinding())
m_sound_use->play();
} // playSound
//-----------------------------------------------------------------------------
/** Use (fire) this powerup.
*/
void Powerup::use()
{
const int ticks = World::getWorld()->getTicksSinceStart();
bool has_played_sound = false;
auto it = m_played_sound_ticks.find(ticks);
if (it != m_played_sound_ticks.end())
has_played_sound = true;
else
m_played_sound_ticks.insert(ticks);
const KartProperties *kp = m_kart->getKartProperties();
// The player gets an achievement point for using a powerup
@ -240,7 +262,7 @@ void Powerup::use()
m_kart->playCustomSFX(SFXManager::CUSTOM_SHOOT);
// FIXME - for some collectibles, set() is never called
if(m_sound_use == NULL)
if (!has_played_sound && m_sound_use == NULL)
{
m_sound_use = SFXManager::get()->createSoundSource("shoot");
}
@ -255,8 +277,11 @@ void Powerup::use()
case PowerupManager::POWERUP_SWITCH:
{
ItemManager::get()->switchItems();
m_sound_use->setPosition(m_kart->getXYZ());
playSound();
if (!has_played_sound)
{
m_sound_use->setPosition(m_kart->getXYZ());
m_sound_use->play();
}
break;
}
case PowerupManager::POWERUP_CAKE:
@ -265,9 +290,11 @@ void Powerup::use()
case PowerupManager::POWERUP_PLUNGER:
if(stk_config->m_shield_restrict_weapons)
m_kart->setShieldTime(0.0f); // make weapon usage destroy the shield
Powerup::adjustSound();
playSound();
if (!has_played_sound)
{
Powerup::adjustSound();
m_sound_use->play();
}
projectile_manager->newProjectile(m_kart, m_type);
break ;
@ -286,9 +313,11 @@ void Powerup::use()
// E.g. ground not found in raycast.
if(!new_item) return;
Powerup::adjustSound();
playSound();
if (!has_played_sound)
{
Powerup::adjustSound();
m_sound_use->play();
}
}
else // if the kart is looking forward, use the bubblegum as a shield
{
@ -329,16 +358,20 @@ void Powerup::use()
}
}
if (m_sound_use != NULL)
if (!has_played_sound)
{
m_sound_use->deleteSFX();
m_sound_use = NULL;
}
m_sound_use = SFXManager::get()->createSoundSource("inflate");//Extraordinary. Usually sounds are set in Powerup::set()
//In this case this is a workaround, since the bubblegum item has two different sounds.
if (m_sound_use != NULL)
{
m_sound_use->deleteSFX();
m_sound_use = NULL;
}
//Extraordinary. Usually sounds are set in Powerup::set()
m_sound_use = SFXManager::get()->createSoundSource("inflate");
//In this case this is a workaround, since the bubblegum item has two different sounds.
Powerup::adjustSound();
playSound();
Powerup::adjustSound();
m_sound_use->play();
}
} // end of PowerupManager::POWERUP_BUBBLEGUM
break;
@ -362,12 +395,15 @@ void Powerup::use()
// or the kart "throwing" the anvil? Ideally it should be both.
// Meanwhile, don't play it near AI karts since they obviously
// don't hear anything
if(kart->getController()->isLocalPlayerController())
m_sound_use->setPosition(kart->getXYZ());
else
m_sound_use->setPosition(m_kart->getXYZ());
if (!has_played_sound)
{
if(kart->getController()->isLocalPlayerController())
m_sound_use->setPosition(kart->getXYZ());
else
m_sound_use->setPosition(m_kart->getXYZ());
playSound();
m_sound_use->play();
}
break;
}
}
@ -422,11 +458,14 @@ void Powerup::use()
// or the kart "throwing" the anvil? Ideally it should be both.
// Meanwhile, don't play it near AI karts since they obviously
// don't hear anything
if(m_kart->getController()->isLocalPlayerController())
m_sound_use->setPosition(m_kart->getXYZ());
else if(player_kart)
m_sound_use->setPosition(player_kart->getXYZ());
playSound();
if (!has_played_sound)
{
if(m_kart->getController()->isLocalPlayerController())
m_sound_use->setPosition(m_kart->getXYZ());
else if(player_kart)
m_sound_use->setPosition(player_kart->getXYZ());
m_sound_use->play();
}
}
break;

View File

@ -23,7 +23,8 @@
#include "items/powerup_manager.hpp" // needed for powerup_type
#include "utils/no_copy.hpp"
#include "utils/random_generator.hpp"
#include <set>
class AbstractKart;
class BareNetworkString;
@ -48,7 +49,8 @@ private:
/** The owner (kart) of this powerup. */
AbstractKart* m_kart;
void playSound();
std::set<int> m_played_sound_ticks;
public:
Powerup (AbstractKart* kart_);
~Powerup ();
@ -60,7 +62,7 @@ public:
void hitBonusBox (const ItemState &item);
void saveState(BareNetworkString *buffer) const;
void rewindTo(BareNetworkString *buffer);
void update(int ticks);
/** Returns the number of powerups. */
int getNum () const {return m_number;}

View File

@ -1273,6 +1273,8 @@ void Kart::eliminate()
*/
void Kart::update(int ticks)
{
m_powerup->update(ticks);
// Make the restitution depend on speed: this avoids collision issues,
// otherwise a collision with high speed can see a kart being push
// high up in the air (and out of control). So for higher speed we