Уроки моддинга
GTA Script GeneratorЗадать вопрос
  • О сайте
    • Проекту помогали
  • GTA SA, VC, III (PC, Classic)
    • Раздел 01. Основы
      • Общие сведения об уроках и минимальный набор программ
      • Установка Sanny Builder. Базовые настройки
      • Синтаксис, комментарии, опкоды, команды. Ключевые слова
      • Типы данных. Литералы. Константы
      • Типы проектов
      • Переменные. Операторы
      • 00012. Редактирование main.scm. Переменные (Часть 3)
      • 000175. Трюк с локальными массивами
      • 00073. Переменные, как члены класса. Коментарии в поиске опкодов. Макросы
      • 00017. Условия в Sanny Builder (Часть 1)
      • 00018. Условия в Sanny Builder (Часть 2)
      • 00019. Условия в Sanny Builder (Часть 3)
      • 000181. Условия в Sanny Builder (Часть 4)
      • 00045. Циклы (Часть 1 - while)
      • 00047. Циклы ( Часть 2 - for )
      • 00049. Циклы ( Часть 3 - repeat ). Вложенные циклы
      • 00087. Таблицы переходов
      • 00059. Подключение текстовых файлов, scm-функции
      • 000155. Использование SCM-функций (опкод 0AB1)
      • 000162. Используем scm-функции в качестве проверок
      • Координаты. Угол. Получение координат и угла Z
      • 000154. Вся правда о wait 0
    • Раздел 02. CLEO
      • Текст
        • 000158. Динамическая GXT-таблица или виртуальные GXT-записи
        • 00033. Работа с текстом
      • Игрок
        • 00021. Одежда СЖ
      • Транспорт
        • 00026. Создание транспорта
        • 000115. Работа с грузовиками и прицепами
        • 000172. Эктра-части автомобилей
        • 00042. Всё о поездах
        • 00080. Тюнинг транспорта, работа с компонентами тюнинга
        • 00029. Транспорт и команды, свойственны ему
        • 00046. Плавающие и лётные средства передвижения
        • 00082. Работа с частями автомобиля
      • Актёры
        • 000152. Заставляем актёра говорить. Аудио-таблицы
        • 000177. Трюк со специальными актёрами
        • 00020. Типы пешеходов, номера банд и отношение между ними
        • 00024. Модель. Создание актёра
        • 00028. Актёры и команды, свойственны им. Команды для игрока
        • 00056. Специальные актёры
        • 00060. События актёров
        • 00084. Модели поведения актёров
      • Объекты
        • 00030. Объекты и команды, свойственны им
        • 00025. Создание объекта
        • 000142. Метание объектов
      • 00027. Пикапы
      • 00031. Маркеры и сферы
      • 000122. Типы чекпоинтов, маркеров. Детальный обзор
      • 00055. Cleo. Основные понятия, отличия от main'а, простые примеры
      • 00061. Cleo-миссии
      • 00064. Работа со стартерами ( Cleo - Часть 1 )
      • 00065. Работа со стартерами ( Cleo - Часть 2 )
      • 00083. Запуск другого потока с Cleo-скрипта
      • 00079. Немного о глобальных CLEO-переменных
      • 00066. Работа со стартерами ( Дополнительные условия )
      • 000137. Группы в GTA San Andreas
      • 00098. Последовательность в анимации
      • 000120. Пути пешеходов и анимационные пути
      • 000178. RRR-файлы в GTA SA. Как их делать и использовать-
      • 000180. Длинные последовательности в анимации
      • 00022. Типы зон. Аудио-зоны
      • 00023. Работа с клавишами. Делаем сохранение
      • 00037. Анимация. Основные команды и примеры их использования
      • 00041. Работа с интерьерами
      • 00036. Катсцены и всё, что необходимо для примитивного видеоролика
      • 000174. Снова статистика игрока
      • 00040. Как создать свой чит-
      • 00090. Работа с гаражами
      • 000176. Выделение памяти
      • 00076. Статистика игрока
      • 00094. Пропуск видеороликов
      • 00072. Работа со светом. Прожектор
      • 00092. Работа с файлами ( форматированное чтение )
      • 00093. Работа с файлами ( Дозапись )
      • 00071. Визуальные эффекты в GTA San Andreas
      • 00069. Взрывы и всё, что связано с огнём.
      • 00086. Движения объектов и эффектов
      • 00068. Использование RC
      • 00067. Использование турелей
      • 00057. Работа с INI-файлами ( запись и считывание )
      • 00044. Работа с панелями ( таблицами )
      • 00043. Работа с аудио
      • 00038. Рисование на экране (Часть 1 - Текст)
      • 00039. Рисование на экране (Часть 2 - Текстуры)
    • Раздел 03. MAIN.SCM
      • 0009. Редактирование main.scm. Потоки и опкоды (Часть 1)
      • 00014. Редактирование main.scm. Потоки и опкоды (Часть 2)
      • 00013. Редактирование main.scm. Потоки и опкоды (Часть 3)
      • 00062. Работа со стартерами ( MAIN.SCM - Часть 1 )
      • 00063. Работа со стартерами ( MAIN.SCM - Часть 2 )
      • 00054. Внешние скрипты в main.scm
      • 00050. Статус-тексты
      • 00053. Таймеры
      • 00035. Делаем простую миссию
    • Раздел 04. Разное
      • 00088. Интересные опкоды (Часть 1)
      • 00089. Интересные опкоды (Часть 2)
      • Интересное в скриптинге
      • 000167. Интересное в скриптинге. Часть 2
      • 00081. Защита скриптов, снятие слабой защиты
      • 000157. Защита скриптов,снятие её + Подробнее об $NOSOURCE
      • 000121. Варианты использования main.scm
      • 000179. Избавляемся от "ёлочек"
      • 000171. Контроль за перемещениями мыши
      • 000182. Колода карт в GTA San Andreas
      • Работа с магазинами
      • 00091. Создания собственных классов и кейвордов
      • 00085. Работа с битами переменных
      • 00051. Работа с HEX. HEX-буфер
      • 00097. Написания DLL библиотек и использование их с скриптах
    • Раздел 05. Игровая память
      • 00058. Работа с игровой памятью (Часть 1- статические адреса)
      • 00074. Динамические адреса памяти. ( Часть 1 - структура актёра )
      • 00075. Динамические адреса памяти. ( Часть 2 - структура автомобиля )
      • 00077. Динамические адреса памяти. ( Часть 3 - структура объекта )
      • 00096. Игровая память. Динамические адреса (структура weapon.dat)
    • Раздел 06. Алгоритмы и примеры
      • 000153. Пример полноценной миссии "Ограбление"
      • 00095. Как сделать нервометр-
      • 00052. Пример полноценной миссии "Взрывчатка"
      • 000114. Делаем спидометр!
      • 000161. Очень длинные миссии в main.scm
      • 000112. Делаем графическое меню
      • 000113. Делаем гоночную миссию ( SARMC v0.9 )
      • 000133. Делаем диалоги в миссиях
      • 00032. Делаем простой скрипт (приходим к точке и убиваем нужную цель)
    • Раздел 07. Plugin SDK (SA)
      • Простейший плагин
      • Работа с массивами объектов
      • Рисуем
      • Короны
      • Класс шрифта (CFont)
    • Раздел 08. Руководство по программам
      • Руководство по использованию программы GTA-SA Crazy IMG Editor
      • Руководство по использованию программы Ped Editor
      • Руководство по использованию программы Rus2gxtCoder
      • Руководство по использованию программы FXT Editor
      • Руководство по использованию программы GTA Animation Manager
      • Руководство по использованию программы TXD Workshop
      • Руководство по использованию программы GTA GXT Editor
      • Руководство по использованию Map Editor
      • Руководство по использованию программы MapCleaner
  • GTA 4 (PC)
    • Раздел 01. ScriptHookDotNet
      • Всё, что необходимо перед началом скриптинга GTA 4
      • Создание проекта и его открытие
      • Наш первый скрипт. Необходимые условия его написания
      • 000102. Метки и прыжки
      • 00034. Что такое Blip- Основные комадны
      • 000107. Обзор класса GAME
      • 000108. Обзор класса PLAYER(Часть 1)
      • 000109. Обзор класса PLAYER(Часть 2)
      • 000110. Обзор класса PLAYER(Часть 3)
      • 000111. Vector - Что это такое и с чем его едят
      • 000116. Обзор класса World
      • 000117. Обзор класса Model
      • 000118. Обзор класса Vehicles
      • 000119. Обзор класса Ped
      • 000126. Pickup в GTA 4
      • 000127. Обзор класса Group
      • 000141. Списки в c#. Запуск нескольких скритов в GTA 4
  • Программирование
    • C#
      • 000103. Типы данных в C#. Базовые операции над ними.
      • 000104. Блочные конструкции. Условия
      • 000105. Блочные конструкции. Циклы
      • 000106. Массивы и структуры
      • 000123. Блочные конструкции. Перечисления
      • 000124. Блочные конструкции. Оператор управдения swith
      • 000125. Блочные конструкции. Цикл foreach
      • 000128. Как делать функции c#- Часть 1
      • 000129. Как делать функции c#- Часть 2
      • 000130. Альтернативные условия
      • 000131. Как делать функции c#- Часть 3
      • 000132. ООП в c# Часть 1
      • 000135. ООП в c# Часть 2 - Полиморфизм
      • 000136. Как делать функции c#- Часть 4
      • 000138. Детальнее о static
      • 000139. Блочные конструкции. Исключения
      • 000140. Делегаты и события в c#
      • 000143. Знакомство с формами
      • 000144. Панель элементов
      • 000149. Кнопки, Текст-боксы и метки
      • 000151. Запуск другой формы из основной, ListBox, MenuStrip
      • 000160. Сериализация и десериализация XML в c#
      • 000163. Консоль. Основные команды
      • 000165. Цикл foreach для своих классов
      • 000168. Перегрузка операторов в c#
      • 000169. Анонимные и динамические типы в c#
      • 000170. Анонимные функции и лямбда-выражения в c#
      • 000173. C# введение в Linq
      • 00048. Детальнее о ref, out и checked
      • 000150. Подключаем dll-библиотеку, работа с файлами
    • C++
      • Выбор среды компилирования, типы данных, первая программа
      • Математика, адреса данных
  • Полезные ссылки
    • Уроки от Vital (видео)
    • База опкодов (SBL)
    • Сайт Sanny Builder
    • Сайт CLEO
  • На удаление
    • Раздел 99. Старые уроки
      • 00010. Управление Sanny Builder и её особенности
      • 0000. Всё, что необходимо перед началом скриптинга
      • 000156. Вступление в скриптинг GTA 3
Powered by GitBook
On this page

Was this helpful?

  1. GTA SA, VC, III (PC, Classic)
  2. Раздел 01. Основы

00045. Циклы (Часть 1 - while)

Циклы (Часть 1 - while)|Этот урок посвящен очень важной теме - циклам. А именно тем циклам, которые существенно упрощают написание скриптов.|wmysterio|wmysterio||||Есть три типа циклов: "while", "for", "repeat". Мы рассмотрим простое использование циклов. Прежде всего нужно понять как работают эти циклы и я постараюсь на примерах объяснить их использование. Поехали! :)

В этом уроке я расскажу о цикле while. Конструкция:

while 1@ == 0 // условие
wait 0
 // ...действия...
end

Суть этого цикла в том, что пока выполняется условие будут выполняются какие то-действия внутри блока. Если дословно перевести "while", то получится "Пока". Таким образом выйдет:

Пока 1@ == 0
Ждать 0
 ...действия...
КонецЦикла

После слова "while" обязательно должно быть условие! Напишем простой пример скрипта:

while not actor.Dead($PLAYER_ACTOR)
wait 0
 player.Money($PLAYER_CHAR) += 100
end

× **ВАЖНО:** в этом цикле обязательно нужно ставить задержку! Минимальная задержка - 0, но если нам не нужно выполнять его очень часто ( например: в стартерах ), то можно её увеличить.

Пока СЖ не умрёт он будет получать 100$. Как только он склеит ласты, он и перестанет получать деньги. Довольно трудно объяснить принцип работы цикла и в новичков часто возникают проблемы с написанием скриптов с этими конструкциями. Я постараюсь как-можно проще описать суть цикла, ведь это важный фундамент для написания хороших скриптов.

Рассмотрим пример из жизни. Прежде всего придумаем условие: "Сергей на работе?". Дальше придумаем что будет, если он на работе: "Он получает деньги". Таким образом можно образовать цикл как:

Пока Сергей на работе
 Он получает деньги
КонецЦикла

Сергей перестаёт получать деньги

Следовательно если Сергей не на работе - деньги ему не светят, то есть цикл завершается.

Особенностью цикла в том, что он выполняются по кругу неограниченное количество раз. Выйти с цикла, как уже сказано, можно только тогда, когда условие возле "while" перестает выполняется. Но есть способ прервать цикл принудительно, даже если условие выполняется. Для этого используется команда - break ( прервать ). Давайте напишем скрипт с теми же деньгами:

while not actor.Dead($PLAYER_ACTOR)
wait 0
 0@ = player.money($PLAYER_CHAR)

 if
 0@ > 5000
 then
 break
 end

 player.Money($PLAYER_CHAR) += 100
end

Данный скрипт будет постоянно давать СЖ деньги. Если он умрёт, то осуществится выход с цикла. И тут появилось ещё одно условие: если деньги СЖ превышают 5000, то мы принудительно завершаем цикл и не важно СЖ жив или мёртв. Таким образом мы сделали два выхода с цикла.

Давайте добавим ещё один выход с цикла, когда СЖ-я арестовали:

while not actor.Dead($PLAYER_ACTOR)
wait 0
 0@ = player.money($PLAYER_CHAR)
 
 if
 0@ > 5000
 then
 break
 end

 if
 0741: actor $PLAYER_ACTOR busted
 then
 break
 end 
 
 player.Money($PLAYER_CHAR) += 100
end

Обычно скриптеры объединяют условия выхода в один if. Это экономит место кода и делает скрипт более читабельным. Вот и мы немного упростим этот цикл:

while not actor.Dead($PLAYER_ACTOR)
wait 0
 0@ = player.money($PLAYER_CHAR) 

 if or
 0@ > 5000
 0741: actor $PLAYER_ACTOR busted
 then
 break
 end 

 player.Money($PLAYER_CHAR) += 100

end

Давайте графически покажем работу цикла:

Цвета линий:

  • Желтый - обычное движение шарика;

  • Красный - движение шарика, если условие НЕ выполняется;

  • Зелёный - движение шарика, если условие выполняется;

  • Фиолетовый - это сами условия;

Попробуйте и вы создать подобный скрипт и нарисовать к нему рисунок с движениями. Это поможет вам быстрее понять работу цикла. Свои варианты присылайте на форум. В большинстве случаев, человек, научившись делать такие схемы быстрее сможет научится скриптингу.

Существует также ещё один оператор. Это команда continue ( можно перевести как "продолжить" ). Суть команды в том, что она начинает цикл сначала, не выполняя опкоды, написанные после неё. Это существенно сокращает время выполнения цикла, так как не нужно будет выполнять команды, что находятся ниже по коду. Для примера можно написать скрипт, который будет генерировать целые числа, если они положительные, то с ними произойдут арифметические изменения. Если число будет ноль - прервём цикл. Если отрицательное - будем начинать цикл сначала. Напишем такой скрипт:

$MONEY = 10 

while 10000 > $MONEY
wait 0
 0209: $TEMP = random_int_in_ranges -10 10

 if
 0 > $TEMP
 then
 continue
 end
 
 if
 $TEMP == 0
 then
 break
 end

 $TEMP *= 2
 0058: $MONEY += $TEMP // (int)
end

player.Money($PLAYER_CHAR) += $MONEY

А вот и графический вариант:

Также есть возможность использовать цикл в середине другого цикла, но об этом мы поговорим немного позже.|981|1|0|56999064png715523400292``\|69422868png590434400294``||cikly_chast_1_while|1498998674

Previous000181. Условия в Sanny Builder (Часть 4)Next00047. Циклы ( Часть 2 - for )

Last updated 3 years ago

Was this helpful?

× **ВАЖНО:** Операторы "break" и "continue" используются только в циклах! Задержку в 0 мсек рекомендовано использовать сразу же после объявления цикла, если в нём существует оператор продолжения. Во многих случаях такой способ избавляет от зацикливания, что ведёт к зависанию игры