Информация Гайд Почему же в CLEO лучше писать на высокоуровневых конструкциях или превращаемся из новичка в любителя

Статус
В этой теме нельзя размещать новые ответы.
Дарова, [visitor][/visitor]! В этой теме разберем наболевшую тему для новичков - писать код CLEO не на метках.

Вот вы думаете, что освоили технику написания кода на метках и рады этому. Спешу разочаровать! Писать код на низкоуровневых конструкциях удел психопатов; если Вы психопат, то ладно, можете продолжать то, что делаете.

Разберем пару нюансов низкоуровневых конструкций:
  1. Легко понимаем, если кодер впервые узнал, что сфера программирования вообще существует, но знает пару слов на английском (jump, else и пр.);
  2. Неудобно читаем, и в некоторых моментах сами же теряетесь (не правда ли?; не говорим про код в котором меньше 10 меток);
При написании на высокоуровневых конструкциях код так же легко читаем, конечно же при условии того, что Вы понимаете их. Тяп-ляп тоже не надо делать.

Почему же стоит всё таки писать на высокоуровневых конструкциях?
Если всё таки в CLEO это возможно допустить, то в других языках это недопустимо. Если Вы планируете больше не связываться с языками, то хотя бы займитесь саморазвитием на этом чудо-языке.
Я Вас не убедил? - ну и ладно. Можете проваливать!
Что-то зацепило? - неплохо. А выдержите ли Вы следующий этап? Понять эти высокоуровневые конструкции.

P.S. Все примеры для примеров, скомпилировать просто так их не получится: необходимо добавлять директиву {$CLEO}, нулевой оффсет и прочее для правильной компиляции.

Самая простая конструкция. Имеет суфиксы "and" и "or", которые разделены пробелом между if.
В себе может содержать только какое-то условие, которое верно (true) или ложно (false). В if and и if or этих условий может быть несколько (больше одного).

Пример if:
CLEO:
1@ = 1000
if 1@ > 1000
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. 1@ равен 1000, а проверяется строго больше 1000" color 0xFFFFFF
else
    if 1@ == 1000
    then
         0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. 1@ равен 1000" color 0xFFFFFF
    end
end

// Также можно
if 1@ >= 1000
then
    0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. 1@ равен 1000" color 0xFFFFFF
end

1@ = 999
if 1@ >= 1000
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. 1@ меньше и не равен 1000" color 0xFFFFFF
else
    0AF8: samp add_message_to_chat "А ответвление от условия сработает, т.к. ветвь else означает то, что условие не было выполнено" color 0xFFFFFF
end

Пример if and (из-за особенностей CLEO количество условий не должно превышать 8):
CLEO:
1@ = 1000
2@ = 15
if and
    1@ >= 1000
    2@ >= 16
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. %d равен 15, а условие проверяет больше или равно 16" color 0xFFFFFF 2@
end

if and
    1@ == 1000
    2@ == 15
then
   0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. %d равен 1000 и %d равен 15" color 0xFFFFFF 1@ 2@
end

if and
    1@ < 1000
    2@ > 15
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. %d равен 1000, %d равен 15" color 0xFFFFFF 1@ 2@
    0AF8: samp add_message_to_chat "а условие проверяет: %d строго меньше 1000 и %d строго больше 15 " color 0xFFFFFF 1@ 2@
else
    0AF8: samp add_message_to_chat "А ответвление от условия сработает, т.к. ветвь else означает то, что условие не было выполнено" color 0xFFFFFF
end

Пример if or (из-за особенностей CLEO количество условий не должно превышать 8):
CLEO:
1@ = 1000
2@ = 15
if or
    1@ >= 1000
    2@ >= 16
then
    0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. %d больше или равен 1000. Этого достаточно для срабатывания условия" color 0xFFFFFF 1@
end

if or
    1@ == 1000
    2@ == 15
then
   0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. %d равен 1000 ИЛИ %d равен 15" color 0xFFFFFF 1@ 2@
end

if or
    1@ < 1000
    2@ > 15
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. %d равен 1000, 2@ равен 15" color 0xFFFFFF 1@
    0AF8: samp add_message_to_chat "а условие проверяет: %d строго меньше 1000 ИЛИ %d строго больше 15" color 0xFFFFFF 1@ 2@
else
    0AF8: samp add_message_to_chat "А ответвление от условия сработает, т.к. ветвь else означает то, что условие не было выполнено" color 0xFFFFFF
end

Обычно используется для перебора чего-либо или ожидания какого-то условия. Цикл, как цикл, но есть несколько типов.

Цикл while, выполняется пока условие верно (true):
CLEO:
while true // выполняется бесконечно
    wait 0
end

1@ = 0
while 1@ < 1000 // выполняется пока 1@ меньше 1000
    1@ += 1
end

1@ = 1000
while 1@ < 1000 // выполняется пока 1@ меньше 1000, т.е. даже не пройдет одну итерацию
    1@ += 1
end

1@ = 0
while true // может выполняться бесконечно, но внутри цикла есть его обрывание
    if 1@ > 1000
    then
        break // обрывание и выход из цикла. На этом моменте 1@ равен 1001.
        // Если изменить условие на 1@ >= 1000, то обрывание произойдет на значении 1@ равном 1000
    end
    1@ += 1
end

1@ = 0
while true // выполняется бесконечно, но тело цикла имеет некоторые особенности
    wait 0
    if 1@ == 1000
    then
        // в данный момент 1@ достигнуло значения 1000
        // но цикл всё ещё продолжает работать и проверяет 1@ на соответствие значения 1000
        continue // цикл начинает новую итерацию, заканчивая данную итерацию не доходя до конца цикла,
        //          т.е. "1@ += 1" не выполнится, пока условие не станет ложным (false)
    end
    1@ += 1
end

Цикл for, выполняет перебирание от a до b с шагом c (с по умолчанию равен 1). Для перебора с возрастанием используется to, для убывания - downto:
CLEO:
for 1@ = 1 to 10 // возрастание - от 1 до 10 (с шагом 1, по умолчанию)
    // данный цикл будет выводить сообщение в чат с текущей итерацией
    0AF8: samp add_message_to_chat "1@ = %d" color 0xFFFFFF 1@
    // 1@ = 1, 1@ = 2, 1@ = 3, ..., 1@ = 10
end

for 1@ = 1 to 10 step 5 // возрастание - от 1 до 10 с шагом 5
    // данный цикл будет выводить сообщение в чат с текущей итерацией
    0AF8: samp add_message_to_chat "1@ = %d" color 0xFFFFFF 1@
    // 1@ = 1, 1@ = 6
end

for 1@ = 10 downto 1 // убывание - от 10 до 1 (с шагом 1, по умолчанию)
    // данный цикл будет выводить сообщение в чат с текущей итерацией
    0AF8: samp add_message_to_chat "1@ = %d" color 0xFFFFFF 1@
    // 1@ = 10, 1@ = 9, 1@ = 8, ..., 1@ = 1
end

for 1@ = 10 downto 1 step 5 // убывание - от 10 до 1 с шагом 5
    // данный цикл будет выводить сообщение в чат с текущей итерацией
    0AF8: samp add_message_to_chat "1@ = %d" color 0xFFFFFF 1@
    // 1@ = 10, 1@ = 5
end

Цикл repeat..until, тот же что и while, но сначала выполняется итерация цикла, а потом только проверка условия (так называемый постусловный цикл). Кстати, чтобы цикл остановился, условие должно вернуть ложь (false), вся суть в примере:
CLEO:
1@ = 1000
repeat
    1@ -= 1
until 1@ == 0 // пока 1@ не равен 0
// после цикла 1@ будет равен 0

1@ = 0
repeat
    1@ -= 1
until 1@ < 0 // пока 1@ строго больше 0
// после цикла 1@ будет равен -1

Кейворд - это некая визуальная замена для опкодов. Каждому кейворду соответствует опкод. Список для CLEO/GTASA хранится в папке Sanny Builder\data\sa\keywords.txt

Но конечно же не своих придуманных, ну или своих, но с понятными именами, но как показала практика, свои кейворды на показ лучше не выставлять.
К стандартным относятся: wait, goto, jump, else_jump, jf, if, return, gosub

Также в дистрибутиве SAMPFUNCS для разработчиков имеется файл keywords.txt, который имеет несколько полезных:
Код:
0ab0=key_down
0ab1=call
0ab2=ret
0ac8=alloc
0ac9=free
0acd=print
0ad1=printf
0ad3=format
0b43=cmdret
0b78=log
059A=return_false
0485=return_true
0AF8=chatmsg
0AF9=say

Все они дают некий процент к скорости написания кода.

Почти тоже, что и кейворды, но имеют более расширенную систему. Никак не относится к классам в ООП.
Более подробно я не буду углубляться, но могу сказать следующее: они существенно сужают поиск нужного опкода с помощью их группировки по отдельным группам.
Структура описания классов хранится в папке Sanny Builder\data\sa\classes.db (для игры GTASA соответственно).

Классы имеют следующую структуру - Группа.свойство/метод.
Примеры:
Actor.PutAt($PLAYER_ACTOR, 0.0, 15.0, 50.0) - аналог опкода 00A1: put_actor $PLAYER_ACTOR at 0.0 15.0 50.0
0@ = Car.Health(1@)
- аналог опкода 0227: 0@ = car 1@ health; также данный метод может и устанавливать здоровье машине: Car.Health(1@) = 1000 - аналог 0224: set_car 1@ health_to 1000

Табуляция - Ваш спаситель в чужом коде (ведь свой Вы уже выучили, пока писали его :pardon:).
Обычно табуляция используется для того, чтобы код стал выглядеть по-человечески и хотя бы понятен другому кодеру.
Как я делаю табуляцию (4 пробела или 1 нажатие клавиши Tab для одной конструкции, также называют лесенкой):
CLEO:
// данная конструкция не вложена, отступ = 0
while true
    // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 1 (или 4 пробела)
    wait 0
end // конец конструкции (while true), отступ = оступ_начала_данной_конструкции = 0

// данная конструкция не вложена, отступ = 0
for 0@ = 0 to 10
    // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 1 (или 4 пробела)
    // тут что-нибудь, не придумал
end // конец конструкции (for 0@ = 0 to 10), отступ = оступ_начала_данной_конструкции = 0

// данная конструкция не вложена, отступ = 0
if 1@ > 1000
then
    // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 1 (или 4 пробела)
    0AF8: samp add_message_to_chat "Переменная 1@ больше тысячи" color 0xFFFFFF

    // данная конструкция вложена, отступ = предыдущий_отступ = 1 (или 4 пробела)
    if 2@ >= 50
    then
        // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 2 (или 8 пробелов)
        0AF8: samp add_message_to_chat "Переменная 2@ больше/равно пятидесяти" color 0xFFFFFF

        // данная конструкция вложена, отступ = предыдущий_отступ = 2 (или 8 пробелов)
        while true
            // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 3 (или 12 пробелов)
            wait 0
        end // конец конструкции (while true), отступ = оступ_начала_данной_конструкции = 2 (или 8 пробелов)
    end // конец конструкции (if 2@ >= 50), отступ = оступ_начала_данной_конструкции = 1 (или 4 пробела)
end // конец конструкции (if 1@ > 1000), отступ = оступ_начала_данной_конструкции = 0

// данная конструкция не вложена, отступ = 0
if and
    1@ == 1000 // одна из особенностей конструкции, отступ_отд = (предыдущий_отступ + 1 табуляция) = 1 (или 2 пробела)
    2@ == 15 // ..., отступ_отд = (предыдущий_отступ + 1 табуляция) = 1 (или 2 пробела)
    // заметьте что некоторые табуляции не влияют на последующие, как и данная конструкция
then
   // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 2 (или 8 пробелов)
   0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. 1@ равен 1000 и 2@ равен 15" color 0xFFFFFF
end // конец конструкции (if and ...), отступ = оступ_начала_данной_конструкции = 0

Это предложение, скорее всего, заведет Вас в тупик, подумай Всё ещё не поняли как делается табуляция? Очень легко: для каждой конструкции устанавливается количество отступов. Если конструкция вложена в другую, то значит, что для неё будет 1 табуляция; если она вложена дважды, то устанавливается 2 табуляции. Также это касается и для тел конструкций.

Константа - неизменяемое значение. Если в других языках с этим строго, то в CLEO указав значение константы - переменную, Вы сможете менять значение переменной (НЕ константы).

Представьте, Вы не знаете что такое RGB, и Вам тяжело сориентироваться в обычных цветах (из примера ниже), то просто тырим инфу из инета и заносим под удобные константы. Пример конечно не очень, но для использования констант сойдет:
CLEO:
const
    WHITE_COLOR = 0xFFFFFF
    RED_COLOR = 0xFF0000
    GREEN_COLOR = 0x00FF00
    MY_COLOR = 0x624206
end

0AF8: samp add_message_to_chat "Красный текст" color RED_COLOR
0AF8: samp add_message_to_chat "Зеленый текст" color GREEN_COLOR
0AF8: samp add_message_to_chat "Синий текст" color 0x0000FF
0AF8: samp add_message_to_chat "Чтобы каждый раз не искать цвет в исходниках, представим его как MY_COLOR" color MY_COLOR

Вам ещё предоставляется возможность посмотреть познавательную видюшечку (от @DarkP1xel):
осторожно, ненормативная лексика :hi:
 
Последнее редактирование:

Goldfish

Известный
106
22
Конструкции пистаты, но большие миссии на них хирово писать для сингла :))
 
Статус
В этой теме нельзя размещать новые ответы.