GTA Builder Форум
GTA Vice City => Скриптинг => Тема начата: Prographer от Июнь 30, 2016, 03:58:51 pm
-
Всем привет! Есть такой код
{$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
Запустив игру мы увидим, что функция выводит постоянно одно и то же значение. Хотелось бы узнать почему?
-
Оно выводит одно и тоже так как ты не передаешь это значение в функцию. Короче говоря значение переменной сбрасывается на 0 что и должно быть при использование не переданной переменной в функцию.
-
Оно выводит одно и тоже так как ты не передаешь это значение в функцию. Короче говоря значение переменной сбрасывается на 0 что и должно быть при использование не переданной переменной в функцию.
Странно. Обычно во всех языках программирования, в интерпретируемых, скриптовых как LUA, функции могут получить доступ к глобальным переменным, (имею в виду глобальную переменную относительно сценария) явно не обращаясь к ней.
Кстати, а в Cleo есть понятие области видимости? То есть, например, если объявить переменную внутри функции, то будет ли она доступна изнутри?
-
call_scm_func так устроена что внутри нее все переменные там и оcтаются если ты их оттуда либо не вытащишь либо не передашь в нее для этого можно использовать синтаксис. Скажем вот так.
call_scm_func @Marker params_count 1 0@
...
:Marker
wait 0
0@ += 5
01E3: text_1number_styled 'REWARD' number 0@ time 1000 style 6
ret 1 0@
В этом случае переменная как передается так и отдается но учти что тут есть одна особенность. Сами переменные передаются по порядку.
Например
5@ = 4
9@ = 11.0
call_scm_func @Primer params_count 2 5@ 9@
...
:Primer
//здесь уже в переменной 0@ будет 4 а в переменной 1@ будет 11.0.
//если ты захочешь вывести переменные то надо сделать вот так
ret 2 0@ 1@ // ну или вот так ret 2 1@ 0@ но тогда в самом объявлении функции надо написать
//call_scm_func @Primer 2 5@ 9@ 5@ 9@ либо call_scm_func @Primer 2 5@ 9@ 9@ 5@ если ты передал как ret 2 1@ 0@
-
Prographer> Короче, если нужна экономия переменных(если в функции должны быть какие-то дополнительные вычисления, связанные с использованием большого числа переменных) - используй scm функцию, как написал mfisto. Если нет, и функция нужна лишь для лаконичности кода - используй gosub:
{$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
-
Цикл
while true
...
end
используется как вечный цикл
если написать
while false
end
цикл никогда не выполнится, что есть просто как факт.
При декомпиляции вида while true будет типа
:noname
...
jump @noname
-
Prographer> Короче, если нужна экономия переменных(если в функции должны быть какие-то дополнительные вычисления, связанные с использованием большого числа переменных) - используй scm функцию, как написал mfisto. Если нет, и функция нужна лишь для лаконичности кода - используй gosub:
{$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
Смысл просто в том, чтобы продемонстрировать, что функция не работает. Сейчас, когда mfisto объяснил почему так происходит, код конечно кажется бессмысленным.
По поводу функций также хотелось бы сказать, что они позволяют сделать скрипт не только лаконичным, но и функциональным. У меня, помнится, даже когда-то была идея сделать своеобразный фреймворк на Cleo, чтобы можно было заменить написание большого количества однотипных операций одной функцией. Допустим, рисования спрайтов или создание системы частиц.
-
аа ясн