You are not logged in.
я вообще скрипт mp3-плеера пишу, завтра напишу комментарии и выложу исходник.
EDIT:
вот код с комментами:
{$CLEO}
const
MP3_ADDRESS = 10@
CURRENT_TRACK = 14@
MP3_STATE = 7@
TRACK = 17@
ARTIST = 18@
TRACK_ARTIST = 19@
VOLUME = 8@
VOLUME_PERCENT = 9@
MP3_NAME = 12@
MP3_ID = 5@
end
var
0@ : Integer
1@ : Integer
2@ : Integer
10@: Integer
11@: Integer
12@: Integer
14@: Integer
19@: Integer
4@: Integer
9@: Float
8@: Float
end
0AC8: MP3_ADDRESS = allocate_memory_size 260000 // поддержка максимум 1000 mp3-файлов
0AC8: TRACK = allocate_memory_size 30 // память под название трека из ID3
0AC8: ARTIST = allocate_memory_size 30 // память под имя артиста из ID3
0AC8: TRACK_ARTIST = allocate_memory_size 100 // память под строку, которая будет выведена на экран (Трек - Артист)
VOLUME_PERCENT = 100 // громкость в процентах
VOLUME = 1.0 // громкость для опкода 0ABC
:FIND_MP3
wait 0
CURRENT_TRACK = 0
11@ = CURRENT_TRACK
11@ *= 260
11@ += MP3_ADDRESS
if
0AE6: 1@ = find_first_file "mp3_player\*.mp3" get_filename_to 11@ //IF and SET
then
CURRENT_TRACK += 1 // тут происходит поиск mp3-файлов
11@ = CURRENT_TRACK // и запись их имён в память
11@ *= 260 // на каждый mp3-файл отводится 260 символов...
11@ += MP3_ADDRESS // хотя скорее 259, иначе следующее название будет продолжением предыдущего
while 0AE7: 11@ = find_next_file 1@ //IF and SET // надо будет исправить... =)
CURRENT_TRACK += 1
11@ = CURRENT_TRACK
11@ *= 260
11@ += MP3_ADDRESS
wait 0
end
0AE8: find_close 1@
4@ = CURRENT_TRACK
4@ -= 1
CURRENT_TRACK = 0
0AB1: call_scm_func @MP3_LOAD 2 CURRENT_TRACK MP3_ADDRESS MP3_NAME MP3_ID // сделал в виде scm-функции, чтобы было проще
else // в MP3_NAME получаем имя mp3-файла, в MP3_ID - его ID в игре
0AE8: find_close 1@ // может там содержится не ID, но мне всё равно так проще =)
jump @FIND_MP3
end
:PLAY // на этой метке осуществляется запуск первого mp3-файла
wait 0
if
0ab0: 101
jf @PLAY
MP3_STATE = 1
while 0ab0: 101
wait 0
end
gosub @MP3_GET_ID3 // получаем в MP3_NAME ID3 тэги...
0ACA: show_text_box MP3_NAME // и выводит в текстбокс
jump @SET_STATE // переходим на метку установки статуса mp3
:PLAY_PAUSE
wait 0 // т.к. установка определённого статуса mp3-файла происходит в цикле,
if // после запуска mp3 сначала нужно сменить следующую операцию над ним
MP3_STATE == 1 // (продолжение воспроизведения)
then
MP3_STATE = 3
end
0AB9: get_audiostream MP3_ID state_to 6@ // получаем текущий статус mp3-файла
if
0ab0: 101 // если нажата кнопка Num 5, идём дальше, если нет - проверяем другие нажатия и т.д.
jf @STOP
while 0ab0: 101 // ждём, когда игрок отпустит клавишу
wait 0
end
if
6@ == 1 // если он на данный момент воспроизводится,
then
MP3_STATE = 2 // то применяем к нему операцию приостановки
0ACA: show_text_box "Pause" // и выводим текстбокс "Pause"
else
MP3_STATE = 3 // в случае, если mp3 на данный момент приостановлен, продолжаем его воспроизведение
0ACA: show_text_box "Play" // и выводим текстбокс "Play"
end
jump @SET_STATE
//-------------------------
:STOP // ну тут если нажать Num *, то остановим файл и выведем "Stop"
if
0ab0: 106
jf @NEXT // если не нажать - идём дальше
while 0ab0: 106
wait 0
end
MP3_STATE = 0
0ACA: show_text_box "Stop"
jump @SET_STATE
:STOP_1
if
6@ == -1
jf @SET_STATE
if
not MP3_STATE == 0
then
jump @NEXT_1
else
jump @SET_STATE
end
//--------------------------
:NEXT
if
0ab0: 102 // если нажать Num 6, то....
jf @PREV
:NEXT_1
0AAD: set_audiostream MP3_ID perform_action 0 // останавливаем текущий mp3-файл
audiostream.Release(MP3_ID) // и выгружаем его из памяти
if // убеждаемся, что текущий трек не является последним
CURRENT_TRACK == 4@ // 4@ - переменная содержащая общее кол-во mp3-файлов (учитывая, что первым является номер 0)
then
CURRENT_TRACK = 0 // если всё-таки является, то загрузим первый файл
else
CURRENT_TRACK += 1 // а если нет - загрузим следующий
end
0AB1: call_scm_func @MP3_LOAD 2 CURRENT_TRACK MP3_ADDRESS MP3_NAME MP3_ID // загружаем mp3
while 0ab0: 102
wait 0
end
if
MP3_STATE == 2
then
MP3_STATE = 0
end
gosub @MP3_GET_ID3 // получаем его ID3 теги
0ACA: show_text_box MP3_NAME // и выводим их в текстбоксе
jump @SET_STATE
//-------------------------
:PREV // тут аналогично предыдущей метке...
if
0ab0: 100
jf @VOLUME_PLUS
0AAD: set_audiostream MP3_ID perform_action 0
audiostream.Release(MP3_ID)
if
CURRENT_TRACK == 0
then
CURRENT_TRACK = 4@
else
CURRENT_TRACK -= 1
end
0AB1: call_scm_func @MP3_LOAD 2 CURRENT_TRACK MP3_ADDRESS MP3_NAME MP3_ID
while 0ab0: 100
wait 0
end
if
MP3_STATE == 2
then
MP3_STATE = 0
end
gosub @MP3_GET_ID3
0ACA: show_text_box MP3_NAME
jump @SET_STATE
//-------------------------
:VOLUME_PLUS // тут управление громкостью
if
0ab0: 107
jf @VOLUME_MINUS
if
VOLUME_PERCENT < 100
then
VOLUME_PERCENT += 2
008F: VOLUME = integer VOLUME_PERCENT to_float
VOLUME /= 100.0 // решил проценты переводить в дробное число
0ABC: set_audiostream MP3_ID volume VOLUME // ибо, если делать наоборот, получается на 1 процент меньше...
end
0ACE: show_formatted_text_box "Volume: %d%%" VOLUME_PERCENT // форматирование и вывод в текстбокс
{while 0ab0: 107
wait 0
end}
jump @STOP_1
//-------------------------
:VOLUME_MINUS // аналогично предыдущей метке
if
0ab0: 109
jf @STOP_1
if
VOLUME_PERCENT > 0
then
VOLUME_PERCENT -= 2
008F: VOLUME = integer VOLUME_PERCENT to_float
VOLUME /= 100.0
0ABC: set_audiostream MP3_ID volume VOLUME
end
0ACE: show_formatted_text_box "Volume: %d%%" VOLUME_PERCENT
{while 0ab0: 109
wait 0
end}
jump @STOP_1
//-------------------------
:SET_STATE // тут устанавливаем громкость и статус
0ABC: set_audiostream MP3_ID volume VOLUME
0AAD: set_audiostream MP3_ID perform_action MP3_STATE
jump @PLAY_PAUSE
//=====================================================
:MP3_LOAD // это scm-функция загрузки mp3-файла
2@ = 0@
2@ *= 260
2@ += 1@
0A99: chdir "mp3_player"
audiostream.Load(3@, 2@)
0A99: chdir 0
0AB2: ret 2 2@ 3@
//=====================================================
:MP3_GET_ID3 // а это gosub для получения ID3 тэгов
0A99: chdir "mp3_player"
0A9A: 13@ = openfile MP3_NAME mode "rb" // IF and SET
0A99: chdir 0
0A9C: 16@ = file 13@ size
//----------------------------------
16@ -= 128
0AD5: file 13@ seek 16@ from_origin 0 //IF and SET
0A9D: readfile 13@ size 2 to 15@
0A9D: readfile 13@ size 1 to 20@
if and
0039: 15@ == 0x4154
0039: 20@ == 0x47
then
0A9C: 16@ = file 13@ size
//----------------------------------
16@ -= 125
0AD5: file 13@ seek 16@ from_origin 0 //IF and SET
0AD7: read_string_from_file 13@ to TRACK size 30 //IF and SET
0AD5: file 13@ seek 16@ from_origin 0 //IF and SET
0AD7: read_string_from_file 13@ to 21@v size 30 //IF and SET
//----------------------------------
16@ += 30
0AD5: file 13@ seek 16@ from_origin 0 //IF and SET
0AD7: read_string_from_file 13@ to ARTIST size 30 //IF and SET
0AD5: file 13@ seek 16@ from_origin 0 //IF and SET
0AD7: read_string_from_file 13@ to 22@v size 30 //IF and SET
0A9B: closefile 13@
//----------------------------------
if
8846: not string 21@v empty // same as 0844
then
if
8846: not string 22@v empty // same as 0844
then
0AD3: string TRACK_ARTIST format "%s - %s" TRACK ARTIST
else
0AD3: string TRACK_ARTIST format "%s - %s" TRACK "Unknown Artist"
end
MP3_NAME = TRACK_ARTIST
return
else
if
8846: not string 22@v empty // same as 0844
then
0AD3: string TRACK_ARTIST format "%s - %s" "Unknown Track" ARTIST
MP3_NAME = TRACK_ARTIST
return
else
return
end
end
else
0A9B: closefile 13@
return
end
Last edited by Voron295 (16-05-2011 13:56)
Offline
Народ, извините если повторяюсь, но у меня проблема. CLEO save не пашет что ли? Когда я начинаю новую
игру у меня все сохранения работают и после перезапуска игры, а если я загружаю и снова сохраняюсь, то
игра вылетает. В чем дело??? CLEO 4 ставил сразу после установки, подправил в папке ...\GTA SA\Data
пару файлов и закинул старые скрипты с CLEO 3 (когда я в прошлый раз ставил GTA SA устанавливал CLEO 3 и сохранил все скрипты, которые делал сам и которые скачал) и поставил GTA-SA_Parkour MOD. РУДЗ!!!
Offline
Ну что ж ищи баги в самих скриптах. Была у меня такая же проблема поисправлял скрипты теперь все ок.
Offline
Выкладываю первую публичную версию 4.2a. Буковка 'a' обозначает 'alpha', то есть версия не является стабильной и не предназначена для публичного использования.
Новых "фич" нет, из нововведений - открытие исходного кода. Теперь любой желающий может с ним ознакомиться. Никаких лицензий не прикрепляю, поскольку то, чем мы тут занимаемся, все равно "не вполне законно".
PS: Если появится группа людей, заинтересованная в разработке, возможно имеет смысл переехать на sourceforge или google code. А может быть Deji возьмется за разработку и выпустит что-то вроде CLEO 5 (это обсуждалось в английской ветке, если кто-то не в курсе). В общем, поживем - увидим.
[You must login to view hidden text.]
Last edited by Alien (29-10-2011 09:59)
Offline
Offline
UPD. Блин, что-то игра ошибку выбивает в самом начале - Error loading plugin cleo.asi
Хм. Интересно, попробуйте пересобрать из исходников. Посмотрите, создался ли в корне файл cleo.log и выложите его содержимое (если игра установлена в Program Files, переустановите куда-нибудь, куда разрешена запись без админ-прав).
Offline
Хм. Интересно, попробуйте пересобрать из исходников. Посмотрите, создался ли в корне файл cleo.log и выложите его содержимое
где взять make.exe? и вообще, не проще ли было просто сделать в виде проекта для, скажем, вижуал студио 10?
P.S. прошу простить меня за подобные вопросы, я ещё начинающий программист)
Last edited by Voron295 (29-10-2011 10:18)
Offline
Может быть и проще, но у меня лично с каких-то пор имеется предпочтение к GNU toolchain. Кроме того, код является специфичным к GCC, компилятор Microsoft его не соберет.
make.exe брать в интернете (нужна сборка под винду).
Вообще, удобно будет использовать этот toolchain (там уже есть GNU make).
Еще понадобится Cygwin, с его поиском и установкой проблем быть не должно.
Offline
Может быть и проще, но у меня лично с каких-то пор имеется предпочтение к GNU toolchain. Кроме того, код является специфичным к GCC, компилятор Microsoft его не соберет.
А разве есть разница между компиляторами одного и того же языка?
Offline
А разве есть разница между компиляторами одного и того же языка?
Ну этот вопрос явно не мне надо задавать, ибо я сам являюсь может быть хоть и не "начинающим программистом", но программистом-любителем то уж точно... Ну, попробую ответить.
Да, разница есть...
Во-первых, язык кучу раз перестандартизировался (в последний раз это произошло в августе этого года, и на данный момент не существует ни одного компилятора, который бы полностью имплементировал все нововведения этого стандарта. А я все равно уже начал использовать эти нововведения в CLEO - не удержался
). По этому поводу мне вообще кажется, что нет такого языка C++, есть только языки, определяемые соответствующими ANSI/ISO стандартами C++.
Во-вторых, разработчики коммерческих компиляторов часто кладут болт на обеспечение совместимости со стандартами. GCC тут старается более или менее им следовать, но это не всегда удается.
В-третьих, у большинства компиляторов имеются некоторые специфические только для них (или для целевой платформы) расширения языка. Например, описанные тут или тут). Когда имеешь дело с низкоуровневыми хаками, без них просто не обойтись (без того же inline-ассемблера, например). Поэтому приходится писать код, специфический для какого-то конкретного компилера...
PS: чего-то мы нафлудили много. Вы лучше попробуйте решить проблему с Error loading plugin. Вопрос к другим скачавшим - у вас есть такая же ошибка?
Offline
Offline
Ну, вообще-то я никаких вылетов в приведенном коде не наблюдал и не наблюдаю. Что касается опкодов вызова нативного кода, то с ними надо работать очень осторожно и четко понимать, что делаешь. Вполне возможно, что в вызываемой функции не сохраняется какой-нибудь регистр (меняться могут только eax, ecx, edx) или неверно указан stack_align.
Единственный баг, который, признаю, есть - это баг со звуком (на машинах с аппаратным ускорением 3d audio positioning ломается внутриигровая звуковая подсистема). Баг остается.
Ах да, еще был баг с тем, что скриптовая музыка продолжает играть, когда окно сворачивают. Этот баг должен быть исправлен, но я не проверял.))
Offline
Offline
Alien, ожидаются ли исходники Cleo для Vice City? Или хотя бы версия CLEO Vice City с поддержкой этого:
http://www.gtagarage.com/mods/show.php?id=2508
Добавление своих анимаций - очень нужная вещь, а с клео тот плагин почему-то не совместим 
Пишу сюда, т.к. Alien не заметил видимо лс еще с июля 
Last edited by Shag (01-11-2011 15:52)
Offline
В последней версии CLEO проблема с опкодами, созданными с помощью CLEO SDK. Проблема в этой фунции
CLEO_GetFloatOpcodeParam
Вылетает не только с моими опкодами, но и с плагином Sanchez'a frOpcodes.cleo, который тоже использует эту функцию.
PS раньше, несколько месяцев назад, frOpcodes.cleo у меня работал.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Проблема решена.
Ошибка была в совместимости с scm-log'ом.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Sanny Builder не может знать, какая из двух проверок должна быть использована - для дробных или для целых чисел:
001D: 27@ > 33@ // (int)
0025: 27@ > 33@ // (float)
Поэтому надо либо указывать номер опкода, либо предварительно объявить тип переменных в конструкции var..end (см. справку СБ, раздел Кодинг - Переменные).
Last edited by Den_spb (07-01-2012 16:59)
Offline
Рад что есть планы сделать новую версию Cleo.
Очень бы хотелось, что бы изменили проверки двух переменных, например:
в место 001D: 27@ > 33@ // (int) можно было писать просто 27@ > 33@
Ну, если уж на то пошло, то это не от CLEO зависит, а от SannyBuilder'а, а насколько мне известно, Seemann больше не собирается выпускать новых версий.
Offline
var
27@: int
33@: int
end
if
27@ > 33@
Last edited by DK22Pac (07-01-2012 20:40)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
CLEO4 SDK
Игра вылетает, если добавляю опкод с неопределённым кол-вом параметров (-1).
Хотел добавить опкод
0D00: store_memory_array 0xB7C4D6 elements 3 size 2 to 0@ 1@ 2@
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Здравствуйте, ребята, запилил, значит, 100 дополнительных опкодов.
http://www.gtaforums.com/index.php?showtopic=518780
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Offline
Меня с недавних пор интересует история CLEO. Собственно, имеется вопрос: где можно посмотреть на CLEO 2, или хотя бы почитать историю версий. И что с первой версией CLEO: она вообще была опубликована? И последний вопрос: почему название такое, CLEO? Это аббревиатура, или нет?
Offline
Меня с недавних пор интересует история CLEO. Собственно, имеется вопрос: где можно посмотреть на CLEO 2, или хотя бы почитать историю версий. И что с первой версией CLEO: она вообще была опубликована? И последний вопрос: почему название такое, CLEO? Это аббревиатура, или нет?
Если вкратце: http://www.gtaforums.com/index.php?showtopic=548332
Offline