Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a theme in the appropriate section
    No need to write everything in the chat!
  • Sell or buy?

    Use the services of a guarantor
    We will make your transaction safe
  • Don't want a BAN?

    Please read our rules
    Don't disturb the order
  • Visit the market

    There you can sell or buy
    Everything related to game servers
  • 0
FiQ

Удаление источника звука

Здравствуйте.

Создал необходимые конфиги для источника звука.

Суть исполнения такова:
При вызове функции: Создается источник звука ( изначально определенный ), который крепится к игроку и соответственно воспроизводится звук. 

При повторном вызове функции ( в идеале с мощью другой функции ) : удаляется ранее прикрепленный источник звука к игроку, соответственно прекращается воспроизведение звука .  

Мои неудачные попытки реализации:

 

test_sound1 = {
		private["_sound1","_sound1Flag"];
		_sound1Flag = false;
		if(_sound1Flag)	then{ 
		deleteVehicle _sound1;
		_sound1Flag = false;
		}else{  
		_sound1 = createSoundSource ["2000_baksov_mp3", [0,0,0], [], 0];
		_sound1 attachTo [player,[0,0,1]];
		_sound1Flag = true;
	};
};
test_sound1 = {
		private["_sound1","_sound1Flag"];
		
		if(_sound1Flag)	then{ 
		_sound1 = createSoundSource ["2000_baksov_mp3", [0,0,0], [], 0];
		_sound1 attachTo [player,[0,0,1]];
		_sound1Flag = false;
		}else{  
		deleteVehicle _sound1;
		_sound1Flag = true;
	};
};
test_sound1 = {
		private["_sound1",];
		
		if(sound1Flag)	then{ 
		_sound1 = createSoundSource ["2000_baksov_mp3", [0,0,0], [], 0];
		_sound1 attachTo [player,[0,0,1]];
		sound1Flag = false;
		}else{  
		deleteVehicle _sound1;
		sound1Flag = true;
	};
};

В последнем варианте создана глобальная переменная, значение которой указано по дефолту "Истина" в initPlayerLocal.sqf 

Источник звука при первом вызове прикрепляется к игроку, т.е. функция срабатывает правильно. При втором вызове  - звук не атачится, но и не удаляется первый источник звука. При третьем вызове так же прикрепляется еще один источник звука и получается каша из двух звуков. 

 

Задумка:

Что-то типа плеера, у которого есть несколько кнопок, каждая из которых вызывает функцию с воспроизведением музыки ( аттачит источник звука ) и одна доп. кнопка которая бы удаляля все источники звука приаттаченные на игроке с помощью все тех же функций упомянутых ранее. Ну или же при повторном вызове одной и той же функции при первом вызове: аттачился звук, при повторном вызове функции: удалялся ранее приаттаченный источник звука.

Наведите на правильный путь в исполнении данной задумки.

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0
34 минуты назад, FiQ сказал:

private["_sound1",];

После этого можно было бы и не смотреть далее...

34 минуты назад, FiQ сказал:

создана глобальная переменная

Ок.

35 минут назад, FiQ сказал:

deleteVehicle _sound1;

Глобальные переменные "освоены" только на половину?(подсказка в данной строке)...

37 минут назад, FiQ сказал:

но и не удаляется первый источник звука.

Еще бы... см. выше.

 

P.S.

А я ж тебе советовал купить букварь)

 

Share this post


Link to post
Share on other sites

  • 0

NoNameUltima Разобрался 

Сделал "_sound1" в "sound1" и заработало :D  Спасибо, не подумал. 

Касательно "букваря" - не нашел :(

 

Вопрос в догоночку, а не будет ли второй игрок удалять источник звука который вызван первым игроком при вызове функции на своей стороне? Ибо протестить со вторым игроком нет возможности.

Share this post


Link to post
Share on other sites
  • 0

FiQ Ну если второй игрок сядет за комп первого игрока, то наверное будет - счелкая кнопками.

Глобальная она только в его клиенте. Как и функция.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By BorizzK
      Вот предположим мы создали где-то экземпляр класса;
      ref Class newClass = new Class();
       
      1 Он удалится сам? При каких условиях?
      2 Как его удалить принудительно если он больше не нужен?
       
    • By BorizzK
      Вобщем в процессе работы сервера происходят рандомные динамические события и вместе с ними на карте спавнятся некоторые обьекты
      Если время их жизни истекает и настает время нового события и в радиусе видимости нет игроков обьекты удаляются с карты
      Но
      Если выключение корректно (запланированный рестарт например), вызов функции удаления происходит из деструктора класса
      Все отрабатывает
      Ошибок нет
      Но после рестарта некоторые обьекты на месте
      Тогда я замутил функцию-задержку с проверкой
       
      float TimeWait(Object object, float timeW) { float cTick = GetGame().GetTickTime() + timeW; while(object || GetGame().GetTickTime() < cTick ) { if ( GetGame().GetTickTime() >= cTick ) break; } return GetGame().GetTickTime(); } и вызываю ее
       
      if (object) tW = TimeWait(object, timeW); задержка реально происходит - делал ее 60 секунда да же
      НО! обьекты эти после рестарта опять на месте
       
      Пока придумал костыль - сохраняю в профиль сервера при каждом спавне координаты и тайпнеймы заспавленных обьектов и при запуске в конструкторе проверяю это место и грохаю обьекты по тайпнеймам - места безлюдные и открытые, лагерей и тп там быть не может - потому в принципе ничего лишнего туда попасть не может
      к тому же это полезно в случае крашей
       
      и все же
      почему обьекты не удаляются при завершении работы сервера?
       
    • By krovn
      Доброго времени суток,
       
      Допиливая сборку столкнулся с проблемой что постройки из Alchemical crafting не получают урона и их невозможно уничтожить.
      Проблему частично решил - добавлением HandleDamage, но вот до БД это не доходит и даже уничтоженные объекты после рестарта появляются снова...
       
      есть идеи?
    • By NoNameUltima
      Массивы и циклы.
      *Мб кому то будет полезно.

      В. В чем различие цикла forEach от цикла for

      О. Цикл forEach создает копию массива в памяти, и служит для быстрого поиска в массиве заданного элемента.
      Но удалять внутри данного цикла элементы массива нельзя, т.к. будут смещены индексы, и изменится длина массива.(см. пример ниже для цикла for)

      В. В чем отличие цикла
       
      for "_i" from 0 to _xxx do      
      от цикла
       
              for "_i" from _xxx to 0 step -1 do   О. Цикл:
       
              for "_i" from 0 to _xxx do   Перебирает массив, и Вы можете менять элементы массива, но если Вам необходимо, внутри цикла удалять элементы массива, Вам необходим обратный цикл:
       
              for "_i" from _xxx to 0 step -1 do   Пример некорректного использования цикла:
       
              for "_i" from 0 to _xxx do   Предположим у вас есть массив:
       
      _xxx =  [0,2,9,0,2];   Как видим, в нем 4 элемента(счет идет с нуля).

      Ваша задача, удалить элементы больше 1.

      Неправильный цикл:
       
      for "_i" from 0 to count _xxx do                        //      Цикл от нуля и до 4(кол-во элементов массива)         {                 if ( (_xxx select _i) > 1 ) then        //      Если текущий элемент больше 1 -                         {                                 _xxx set [_i, -1];                      //      Заменить текущий элемент массива на -1                                 _xxx    =       _xxx - [-1];    //      Удалить в массиве элемент [-1]                         };         };    

          
      При нулевой итерации цикла, будет взято цисло из массива = 0. Число больше 1 - Цикл переходит на следующую итерацию. Первая итерация - число будет = 2. Число больше 1 - Данный элемент будет удален. Следующая итерация возьмет число 0!!!  
       
       
      В. Почему 0, почему не 9?

      О. После удаления элемента массива, его счетчик так же будет изменен, в следствии этого, т.к. элемента 1 равного 2, более не существует, его заменит элемент 2 равный 9.

      И тут сразу 2 ошибки:
       
       
       
      Мы пропустили элемент который должен был быть удален.

           Цикл идет до 4 элементов, а у нас на втором шаге их уже стало 3, т.е. - вы получите ошибку скрипта, при доступе к несуществующему элементу списка. Правильный цикл:
       
      for "_i" from (count _xxx) to 0 step -1 do      //      Цикл начиная с 4(кол-во элементов массива), и до нуля         {                 if ( (_xxx select _i) > 1 ) then        //      Если текущий элемент больше 1 -                         {                                 _xxx set [_i, -1];                      //      Заменить текущий элемент массива на -1                                 _xxx    =       _xxx - [-1];    //      Удалить в массиве элемент [-1]                         };         };  
×
×
  • Create New...