GTA Builder Форум

GTA Vice City => Скриптинг => Тема начата: Prographer от Июнь 30, 2016, 03:58:51 pm

Название: Инкремент переменной
Отправлено: 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
Запустив игру мы увидим, что функция выводит постоянно одно и то же значение. Хотелось бы узнать почему?
Название: Re: Инкремент переменной
Отправлено: mfisto от Июнь 30, 2016, 04:51:42 pm
Оно выводит одно и тоже так как ты не передаешь это значение в функцию. Короче говоря значение переменной сбрасывается на 0 что и должно быть при использование не переданной переменной в функцию.
Название: Re: Инкремент переменной
Отправлено: Prographer от Июнь 30, 2016, 05:55:57 pm
Оно выводит одно и тоже так как ты не передаешь это значение в функцию. Короче говоря значение переменной сбрасывается на 0 что и должно быть при использование не переданной переменной в функцию.
Странно. Обычно во всех языках программирования, в интерпретируемых, скриптовых как LUA, функции могут получить доступ к глобальным переменным, (имею в виду глобальную переменную относительно сценария) явно не обращаясь к ней.

Кстати, а в Cleo есть понятие области видимости? То есть, например, если объявить переменную внутри функции, то будет ли она доступна изнутри?
Название: Re: Инкремент переменной
Отправлено: mfisto от Июль 01, 2016, 03:03:48 am
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@
Название: Re: Инкремент переменной
Отправлено: Shagg_E от Июль 01, 2016, 11:41:58 am
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
Название: Re: Инкремент переменной
Отправлено: mfisto от Июль 01, 2016, 03:12:48 pm
Цикл
while true
...
end
используется как вечный цикл
если написать
while false
end
цикл никогда не выполнится, что есть просто как факт.
При декомпиляции вида while true будет типа
:noname
...
jump @noname
Название: Re: Инкремент переменной
Отправлено: Prographer от Июль 01, 2016, 06:38:59 pm
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, чтобы можно было заменить написание большого количества однотипных операций одной функцией. Допустим, рисования спрайтов или создание системы частиц.
Название: Re: Инкремент переменной
Отправлено: Shagg_E от Июль 02, 2016, 06:22:33 am
аа ясн