31
Моды / Re: Radio Stations' Icons
« : Июль 24, 2016, 08:53:16 am »
Надо попробовать заменить их на те, которые находятся в меню настройки аудио.
В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.
Prographer> Короче, если нужна экономия переменных(если в функции должны быть какие-то дополнительные вычисления, связанные с использованием большого числа переменных) - используй scm функцию, как написал mfisto. Если нет, и функция нужна лишь для лаконичности кода - используй gosub:Смысл просто в том, чтобы продемонстрировать, что функция не работает. Сейчас, когда mfisto объяснил почему так происходит, код конечно кажется бессмысленным.Код: [Выделить]{$CLEO}
0000:
thread 'func'
wait 0
0@ = 0
while true // Правда, я не понимаю смысл вот этого - тут же нет условий
wait 2000
gosub @Marker
end
end_thread
:Marker
wait 0
0@ += 5
01E3: text_1number_styled 'REWARD' number 0@ time 1000 style 6
return
Оно выводит одно и тоже так как ты не передаешь это значение в функцию. Короче говоря значение переменной сбрасывается на 0 что и должно быть при использование не переданной переменной в функцию.Странно. Обычно во всех языках программирования, в интерпретируемых, скриптовых как LUA, функции могут получить доступ к глобальным переменным, (имею в виду глобальную переменную относительно сценария) явно не обращаясь к ней.
{$CLEO}
0000:
thread 'func'
wait 0
0@ = 0
while true
wait 2000
05F5: call_scm_func @Marker params_count 0
end
:Marker
wait 0
0@ += 5
01E3: text_1number_styled 'REWARD' number 0@ time 1000 style 6
05F6: ret 0
end_thread
Запустив игру мы увидим, что функция выводит постоянно одно и то же значение. Хотелось бы узнать почему?
Помимо двух таймеров, которые есть у каждого скрипта потока, можно пользоваться универсальным средством, который подходит когда эти таймеры заканчиваются.О! Интересный вариант. Спасибо, попробуюКод: [Выделить]01BD: 0@ = current_time_in_ms // используем вот этот опкод
...
//потом в цикле
01BD: 1@ = current_time_in_ms //и сравниваем его со старым значением 0@
0062: 1@ -= 0@ // (int)
if
1@ >= 4200 // вот тут можно поставить свое время в миллисекундах 1 секунда = 1000
then
break // это значит что после 4 с лишним секунд делаем выход
end
while 2@ == 1 // цикл выполняется до того, пока игрок не переключит радиостанцию
wait 0
if Actor.Driving($PLAYER_ACTOR)
jf @draw // перемещает на метку определения номера радиостанции
05E0: 2@ = read_memory 1@ size 1 virtual_protect 0 // 1@ = номер радиостанции (0x7E49C0 + 0x23C)
038D: draw_texture 2 position 3@ 75.0 scale 128.0 128.0 RGBA 255 255 255 255
end
Другими словами, спрайт должен рисоваться только определённое время, после завершения цикла рисования должен ждать смены радиостанции или выхода игрока из автомобиля.Ну, типа такого:Не знаю. Такой вариант, конечно, типичен для Cleo-синтаксиса, но его не удобно читать, по крайней мере мне.Код: [Выделить]Object.Create(5@, 345, 0@, 1@, 2@)
04D9: object 5@ set_scripted_collision_check 1
:Ololo
wait 0
if
04DA: has_object 5@ collided
jf @Ololo
код
и если снова понадобится чекать, то
04D9: object 5@ set_scripted_collision_check 0
wait 0
04D9: object 5@ set_scripted_collision_check 1
jump @Ololo
А как бы ты написал?Я так понимаю, вот так?Ну, я не люблю такой вид кода, но вроде правильно...Код: [Выделить]Object.Create(5@, 345, 0@, 1@, 2@)
04D9: object 5@ set_scripted_collision_check 1
while 04DA: has_object 5@ collided
wait 0
/* какой-то_код */
end
[условие выполнено]
Если объект динамический(прописан в object.dat, имеет коллизию из шаров) - можно проверять, соприкоснулся ли объект с землей так:Я так понимаю, вот так?
Сначала, перед циклом проверки, нужно врубить это:Код: [Выделить]04D9: object $TELO set_scripted_collision_check 1 // тут, думаю, всё понятно - без включения этой опции нельзя будет проверить касание объекта $TELO до чего-либо
В цикле проверки проверять касание земли так:Код: [Выделить]04DA: has_object $TELO collided
Когда закончили - вырубить проверку(если в дальнейшем нам объект еще понадобится)Код: [Выделить]04D9: object $TELO set_scripted_collision_check 0
P.S. переменная у меня глобальная, т.к. код выдран из мэйна. Если работаешь с CLEO - юзай локальные.
Object.Create(5@, 345, 0@, 1@, 2@)
04D9: object 5@ set_scripted_collision_check 1
while 04DA: has_object 5@ collided
wait 0
/* какой-то_код */
end
[условие выполнено]