You are not logged in.
я вообще скрипт mp3-плеера пишу, завтра напишу комментарии и выложу исходник.
EDIT:
вот код с комментами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | { $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@ == 0x 4154 0039: 20@ == 0x 47 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. Проблема в этой фунции
1 | 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
1 2 3 4 5 6 | 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).
Хотел добавить опкод
1 | 0D00: store_memory_array 0xB7C4D 6 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 дополнительных опкодов.
1 | 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
Здравствуйте, ребята, запилил, значит, 100 дополнительных опкодов.
1http:
//www.gtaforums.com/index.php?showtopic=518780
Круто! Жаль только на английском описание опкодов (
Особенно понравилась конкатенация!
Offline
Меня с недавних пор интересует история CLEO. Собственно, имеется вопрос: где можно посмотреть на CLEO 2, или хотя бы почитать историю версий. И что с первой версией CLEO: она вообще была опубликована? И последний вопрос: почему название такое, CLEO? Это аббревиатура, или нет?
Offline
Меня с недавних пор интересует история CLEO. Собственно, имеется вопрос: где можно посмотреть на CLEO 2, или хотя бы почитать историю версий. И что с первой версией CLEO: она вообще была опубликована? И последний вопрос: почему название такое, CLEO? Это аббревиатура, или нет?
Если вкратце: http://www.gtaforums.com/index.php?showtopic=548332
Offline