Модератор: BV
Хакер писал(а):В стартовой заставке ничего не сказано про пробел
Хакер писал(а):но как ей управлять — непонятно
ger_kar писал(а):дошел до 8 уровня. Больше всего времени потратил на 5
Так там же сразу можно поставить нужную карту. В меню можно перебирать карты стрелками влево/вправо.Хакер писал(а):Чит-кодов нет? А то лениво опять 5 раундов проходить из-за креша.
ger_kar писал(а):Так там же сразу можно поставить нужную карту. В меню можно перебирать карты стрелками влево/вправо.
ger_kar писал(а):Я все уже все карты прошел. Крешей никаких не происходило.
Mikle писал(а):Вечером, когда попаду домой, могу скинуть исходник, сам бы проверил, но у меня ошибка не ловится.
Хакер писал(а):нтересно, на дизайн уровней ушло наверное намного больше времени, чем на код самой игры?
Хакер писал(а):ты не делаешь обработки ошибок после обращений к DX, но какое-то обращение, судя по всему, сбойнуло.
ger_kar писал(а):Интересно, а можно ли пройти например 5 уровень различными вариантами, или вариант прохождения только один?
DSBBang(BangInd).SetVolume -500
DSBBang(BangInd).SetFrequency Rnd * 5000 + 30000
DSBBang(BangInd).SetCurrentPosition 0
DSBBang(BangInd).Play 0, 0, 0
DSBStep(StepInd).SetVolume v
DSBStep(StepInd).SetFrequency Rnd * 5000 + 40000
DSBStep(StepInd).SetCurrentPosition 0
DSBStep(StepInd).Play 0, 0, 0
DSBFire(FireInd).SetVolume -700
DSBFire(FireInd).SetFrequency Rnd * 3000 + 20000
DSBFire(FireInd).SetCurrentPosition 0
DSBFire(FireInd).Play 0, 0, 0
DSBRub.SetVolume -1000
DSBRub.SetFrequency 32000
DSBRub.SetCurrentPosition 0
DSBRub.Play 0, 0, 0
DSBFly.SetVolume -900
DSBFly.SetFrequency 22000
DSBFly.SetCurrentPosition 0
DSBFly.Play 0, 0, 0
DSBTNT.SetVolume -700
DSBTNT.SetFrequency 44100
DSBTNT.SetCurrentPosition 0
DSBTNT.Play 0, 0, 0
DSBDeath.SetVolume -700
DSBDeath.SetFrequency 44100
DSBDeath.SetCurrentPosition 0
DSBDeath.Play 0, 0, 0
C:\soft\devtools\vs6\vc6\Include>egrep -r "DSERR_(CONTROLUNAVAIL|GENERIC|INVALIDPARAM|PRIO)" *
DSOUND.H:#define DSERR_CONTROLUNAVAIL MAKE_DSHRESULT(30)
DSOUND.H:#define DSERR_INVALIDPARAM E_INVALIDARG
DSOUND.H:#define DSERR_GENERIC E_FAIL
DSOUND.H:#define DSERR_PRIOLEVELNEEDED MAKE_DSHRESULT(70)
MSDN писал(а):DSERR_GENERICAn undetermined error occurred inside the DirectSound subsystem.
Хакер писал(а):Документация даёт вот такое описание для этой ошибки, из которого мало что следует
Mikle писал(а):Некоторые звуковые карты (их драйвера) ведут себя так - при вынимании из гнезд всех разъёмов происходит удаление самого звукового устройства из системы, что видно в диспетчере устройств, у меня в игре проверка на наличие звуковой карты происходит в начале, при инициализации, но случай исчезновения звуковой карты по ходу игры не предусмотрен.
Тогда иду дизассемлировать код DSound.dll и восстанавливать псевдокод методов.
Во-первых, надо сказать, что реализация интерфейса IDirectSoundBuffer, которую видит стороннее приложение — это шаблонный экземпляр шаблонного класса CImpDirectSoundBuffer<...>, который оборачивает вокруг классов CDirectSoundPrimaryBuffer и CDirectSoundSecondaryBuffer (оба реализуют IDirectSoundBuffer). Обёртка создана видимо для какого-то обобщённого контроля и обобщённой защиты от дурака.
Метод SetVolume:
- Код: Выделить всё
HRESULT CImpDirectSoundBuffer<class EncapsulatedBufferClass>::SetVolume(LONG lVolume)
{
HRESULT hr;
g_pDllLock->Lock(); // CMutexLock::Lock
if(this == NULL || this->MagicField != DS_MAGIC_DSBF)
{
hr = DSERR_INVALIDPARAM;
goto finish;
}
hr = this->RealBuffer->IsInit();
if(FAILED(hr)) goto finish;
if(lVolume < -10000 || lVolume > 0) hr = DSERR_INVALIDPARAM;
if(FAILED(hr)) goto finish;
hr = this->RealBuffer->SetVolume(lVolume);
finish:
g_pDllLock->Unlock(); // CMutexLock::Unlock
return hr;
}
Здесь поле «RealBuffer» — указатель на оборачиваемый экземпляр CDirectSoundSecondaryBuffer. Метод-обёртка проверяет некоторые вещи и вызывает метод SetVolume оборачиваемого объекта. Вот его реализация:
- Код: Выделить всё
HRESULT CDirectSoundSecondaryBuffer::SetVolume(LONG lVolume)
{
HRESULT hr = DS_OK;
if(!(this->SomeFlags & 0x80)) return DSERR_CONTROLUNAVAIL;
if(this->CurrentVolume != lVolume)
{
hr = this->SetAttenuation(lVolume, this->m_Pan);
if(SUCCEEDED(hr)) this->CurrentVolume = lVolume;
}
return hr;
}
Как видим, реальный метод SetVolume проверяет некий флаг (поддерживается ли изменение громкости, по видимому), а также не совпадает ли новая громкость со старой, и если не совпадает, то пересчитывает ослабление с учётом панорамы и новой громкости (а так же меняет внутренее свойство объекта, хранящее громкость). Из ошибок пока DSERR_GENERIC/E_FAIL нигде не выбрасывается.
Идем смотреть метод SetAttenuation:
Хакер писал(а):Кстати, серьёзный косяк, который вывел меня из себя — это то, что игра не отображается в панели задач.
Ну не стабильно прям, а вчера пару раз поймал. И сегодня один раз. Вчера после того как FireFox закрыл глюк не воспроизводился больше. Сегодня сразу с FireFox испытывал. И один раз глюк опять поймался. Можно и через TeamViewer попробовать.Хакер писал(а):ger_kar, у тебя прямо стабильно глюк воспроизводится?
ger_kar писал(а):что ошибка происходит в момент массовых взрывов.
Хакер писал(а):Я думаю, что дело в какой-то ситуации в духе нехватки ресурсов или неудовлетворяемом одновременном обращении к ресурсу. В ходе которого ядерная часть даёт код ошибки, который конвертируется в итоге в E_FAIL.
ger_kar писал(а):Вот прям сейчас взялся проходить игру еще раз создав те условия, которые я упомянул выше. И на 3 карте словил ошибку. И еще заметил такую особенность, что ошибка происходит в момент массовых взрывов.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6