Показать сообщение отдельно
Старый 06.10.2020, 20:36   #48
KlassenAS вне форума KlassenAS
Аватар для KlassenAS
Senior Member
Сообщений: 341
Репутация: 285
KlassenAS is a jewel in the rough KlassenAS is a jewel in the rough KlassenAS is a jewel in the rough
Enforcer
Информация о репутации (KlassenAS)
×
За активное участие в жизни форума и помощь пользователям вы можете получить очки репутации. За определённое количество очков репутации вам будет присвоенно соответствующее звание. Полученное звание всегда будет отображаться в нижней части области Вашего профиля, слева от сообщения.
Detective
0
Gangster
55
Thug
100
Judge
159
KlassenAS / 285
Enforcer
260
Priest
396
Snitch
780
Hitman
800
Councilor
1200
Deputy
2501
Overseer
4896
Press
6020
Don
20000
Цитата:
Сообщение от Abradox Посмотреть сообщение
W и S не надо! Нужно что-то типа F3 и F4
Ну, если в настройках игры назначишь F3 и F4 в качестве дополнительных, для управления персонажем, то будут тебе F3 и F4.
Повторюсь: если в настройках игры клавиша не назначена ни на одну из функций, то скрипты её не видят.
Я использовал дополнительные вперёд и назад. При управлении машиной они не используются. У меня им соответствуют W и S. А у тебя может быть что угодно.

Цитата:
Сообщение от GOLOD55 Посмотреть сообщение
Полагаю, стрим делетается из памяти при его дестрое
Да, всё верно. Я проверил. Переменная, используемая в команде Stream_Create 1, не указывает команде, с каким идентификатором надо делать поток, а лишь хранит идентификатор этого потока. То есть, если мы два раза подряд напишем в скрипте:
Stream_Create 1
Stream_Create 1
То будет создан новый поток, его идентификатор сохранится в переменной, и идентификатор предыдущего потока мы потеряем, а сам поток в памяти останется.
Так что, если мы хотим один поток поменять на другой, старый поток дестроить надо обязательно.

Так же я выяснил, что если создать подряд несколько потоков, то их номера будут просто идти друг за другом, например, 132, 133, 134. Следовательно, мы можем через одну и ту же переменную отдавать команды разным потокам, меняя её значение. Для этого понадобятся ещё две, в которых мы запомним номера первого и последнего потока.

Благодаря этому у меня получилось сделать скрипт, легко изменяемый под любое количество потоков-радиостанций.
Пока переключение оставил W и S, при настройках, как на скринах.
Поменять можно и потом, в любой момент.
Неактивные "радиостанции" пока находятся просто на паузе. Потом их можно будет мютить, убирая громкость.
Так же, пока что, одной радиостанции соответствует один аудиофайл.

Особенность переключения радиостанций: поскольку в скриптах отсутствует понятие "события", они не могут реагировать на непосредственное нажатие клавиш.
Поэтому скрипт проверяет, нажата ли клавиша, через определённые промежутки времени. Если нажатие попадёт между считываниями, оно не будет обработано.
Поэтому клавишу переключения радиостанции нужно удерживать примерно полсекунды. Зато, если удерживать клавишу, радиостанции переключаются циклически.

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

Затестил его, вроде работает без сбоев.
Собственно, сам скрипт:

Развернуть для просмотра

Dim_Act 1
Dim_Flt 10
GetActivePlayer 0
Human_GetProperty 0,0,Energy
If Flt[0]=0,-1,dan_on
Act_SetState 100,Off
Label dan_on

Let Flt[0]=0 //логика
Let Flt[1]=0 //поток 00
Let Flt[2]=-1 //сиденье
Let Flt[3]=0 //ещё пригодится )
Let Flt[4]=0 //ещё пригодится )
Let Flt[5]=0 //Нажатие клавиши вперёд 1
Let Flt[6]=0 //Запоминаем последний поток
Let Flt[7]=0 //Запоминаем первый поток
Let Flt[8]=0 //ещё пригодится )
Let Flt[9]=0 //номер радиостанции 0-3

CommandBlock 1
Stream_Create 1,"radio\radio00.ogg"
Let Flt[7]=Flt[1]
Stream_Create 1,"radio\radio01.ogg"
Stream_Create 1,"radio\radio02.ogg"
Stream_Create 1,"radio\radio03.ogg"
Let Flt[6]=Flt[1]
Let Flt[1]=Flt[1]-3
CommandBlock 0

Label CHECK
CommandBlock 0
Wait 350
Human_GetSeatIdx 0,2
If Flt[2]=-1,CAR_OUT,CAR_IN

Label CAR_IN
Ctrl_Read 5,UP1
If Flt[5]=0,-1,RADIO_UP
Label READ_DOWN
Ctrl_Read 5,DOWN1
If Flt[5]=0,-1,RADIO_DOWN
Label CHECKPLAY
CommandBlock 1
If Flt[0]=0,-,CHECK
CityMusic_Off
Stream_Play 1
Let Flt[0]=1
CommandBlock 0
Wait 500
GoTo CHECK

Label CAR_OUT
CommandBlock 1
If Flt[0]=1,-,CHECK
Stream_Pause 1
CityMusic_On
Let Flt[0]=0
CommandBlock 0
Wait 500
GoTo CHECK

Label RADIO_UP
CommandBlock 1
Let Flt[5]=0
Stream_Pause 1
Let Flt[1]=Flt[1]+1
If Flt[1]>Flt[6],-1,CHANGEDUP
Let Flt[1]=Flt[1]-4
Label CHANGEDUP
Stream_Play 1
CommandBlock 0
GoTo READ_DOWN

Label RADIO_DOWN
CommandBlock 1
Let Flt[5]=0
Stream_Pause 1
Let Flt[1]=Flt[1]-1
If Flt[1]<Flt[7],-1,CHANGEDDOWN
Let Flt[1]=Flt[1]+4
Label CHANGEDDOWN
Stream_Play 1
CommandBlock 0
GoTo CHECKPLAY
[свернуть]

Тестим, находим баги, ругаемся на меня матом )
Позже проверю, любой ли mp3 может быть воспроизведён игрой.

UPD: Проверил, действительно, воспроизводит любой mp3, независимо от битрейта и частоты дискретизации. Так что я теперь хз, почему пять лет назад использовал wav. Наверное, потому, что тогда знал меньше )
Миниатюры
Нажмите на изображение для увеличения
Название: Game.exe Screenshot 2020.10.06 - 23.22.16.59.jpg
Просмотров: 379
Размер:	724.6 Кб
ID:	1373   Нажмите на изображение для увеличения
Название: Game.exe Screenshot 2020.10.06 - 22.26.55.95.jpg
Просмотров: 337
Размер:	746.2 Кб
ID:	1374  

Последний раз редактировалось KlassenAS; 06.10.2020 в 21:14.
цитата
Поблагодарили: 2
EmptyBowl (07.10.2020), Firefox3860 (06.10.2020)