Четверг, 21 Ноября 2024, 16:13

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [358]
Статьи об общих понятиях связанных с созданием игр.
Программирование [83]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [147]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [167]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [132]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Типа какой из этих игр вы предпочитаете создавать игры?
Всего ответов: 15797
Главная » Статьи » Движки и Гейммейкеры

GML: Условия, циклы
Условия
Очень часто программе приходится выбирать действие, которое нужно выполнить, основываясь на каких-либо данных. Например если объект находится за пределами экрана, то программа должна поместить его в центр экрана, а если объект находится в пределах экрана, то его нужно, допустим, переместить вправо на 5 пикселей. Делать такой выбор позволяет оператор if. Его синтаксис может быть разным, в зависимости от количества команд, используемых оператором. Сначала рассмотрим самый простой вариант, а потом более сложные:

if (условие) Команда;


Условие - это любое число, если оно больше или равно 0.5, то выполнится команда, если меньше 0.5, то команда выполнена не будет. Например:

if (b) b-=1;


Такое условие дословно можно понимать как "Если переменная b больше или равно 0.5, то уменьшить b на единицу".

if (b-a+0.5) b=a;


А это "Если переменная b больше или равна переменной a, то b присвоить значение a".

Для удобства в языках программирования есть операции сравнения. Результатом выполнения таких операций может быть либо 1, либо 0, единицу еще называют истиной, а ноль - ложью. В GML даже есть константы true и false, равные 1 и 0 соответственно. Если оператор сравнения возвращает 1, то такой случай мы будем называть "условие верно", а если 0 - "условие не верно" Вот эти операции:
> - больше
< - меньше
>= - больше, либо равно
<= - меньше, либо равно
== - равно
!= - не равно

Их применяют также как и арифметические операции.
Например:

h=a>b;


Если переменная a больше b, то переменная h будет равна 1, иначе h будет равно 0. Эти операции сравнения чаще всего используются в условиях. Например:

if (a==b) b*=a;


Если переменная a равна b, то оператор "==" вернет единицу и команда "b*=a;" выполнится.

Восклицательный знак "!" читается как "не" и может употребляться перед переменной или условием. Немного выше был приведен пример "if (b) b-=1;", теперь добавим в него восклицательный знак:

if (!b) b-=1;


Теперь этот код можно понимать так: "Если переменная b НЕ больше или равна 0.5, то уменьшить b на единицу", иными словами "Если переменная b меньше 0.5, то уменьшить b на единицу"

Восклицательный знак - это просто операция, которая возвращает 0, если переменная, стоящая справа от него больше или равна 0.5, и возвращает 1, если переменная меньше 0.5. Также восклицательный знак может употребляться вместе со всеми операциями сравнения, но в этом мало смысла, так как, например, условие "!(a>b)" будет совершенно идентично условию "(a<=b)".

Когда необходимо в одном условии сделать несколько сравнений, то используют логические операции: "&&", "||" и "^^". Их называют "И", "Или" и "Исключающая или" соответственно. Результатом этих логических операций, как и у операций сравнения, может быть либо 1, либо 0.

Вот таблица зависимости результата логических операций от переменных. В таблице переменные a и b равны 1 или 0, но они могут принимать и другие значения, просто для удобочитаемости мы обозначим единицей любое число большее или равное 0.5, а нулем - число меньшее 0.5.

a b a && b a || b a ^^ b
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0


Вот пример их применения:

if ( k>100 || m>100 ) Команда;


Команда выполнится, если k или m будут больше 100. Также команда 1 выполнится, если обе переменные больше 100, но команда не выполнится, если обе переменные меньше 100. Можно еще усложнить условие:

if ( k>100 || m>100 || s>100 ) Команда;


Команда выполнится, если хоть одна переменная (k, m или s) будет больше 100.

if ( k>100 && m>100 && s>100 ) Команда;


Теперь команда будет выполнена, если каждая из переменных k, m и s больше 100

Если у вас в условии много разных логических операций, то можно воспользоваться скобками, для определения приоритета операций:

if ( (x>100 || x<0) && (y>100 || y<0) ) Команда;


Или можно использовать еще один оператор if внутри другого оператора if:

if (x>100 || x<0) if (y>100 || y<0) Команда;


Теперь рассмотрим другую форму оператора if:

if (условие) Команда 1; else Команда 2;


Здесь если условие верно, то выполнится команда 1, иначе будет выполнена команда 2.

Еще команду можно заменить блоком команд, заключенных в фигурные скобки. Например:

If (a>b)
{
c+=5;
a+=5;
if (a>5) a+=1;
}
else
{
c-=5;
a-=5;
}


Есть еще один оператор условия switch, очень похожий на if.
Вот его синтаксис:

switch (переменная)
{
case значение1: блок команд1; break;
case значение2: блок команд2; break;
default: бок команд 3;
}


Этот код идентичен следующему коду:

if (переменная==значение1){блок команд1;}
else if (переменная==значение2){блок команд2;}
else {блок команд 3;}


В операторе switch может использоваться любое количество команд case. Эта команда сравнивает переменную со значением и если они равны, то выполняется соответствующий блок команд. Если переменная не равна ни одному значению, то выполнится блок команд, стоящий после оператора default (в нашем случае это блок команд 3). Кстати, оператор default не обязателен и если из примера убрать строчку "default: бок команд 3;", то если переменная не будет равна ни одному значению, никакой блок команд выполнен не будет. Оператор break производит окончание работы оператора switch, если его не использовать, то могут выполниться другие команды, стоящие после других case. Например:

switch (переменная)
{
case значение1: блок команд1;
case значение2: блок команд2;
default: бок команд 3;
}


Если переменная равна значению1, то выполнится блок команд 1, затем выполнится блок команд 2, а потом блок команд 3. Если переменная равна значению2, то выполнится блок команд 2, а затем блок команд 3.

Вот пример использования оператора switch:

switch (x)
{
case 0: x=100; y=100; break;

case 100:
x=a*b;
a+=1;
break;

case 200: x=0; break;

default: x+=1;
}


Циклы
Циклы нужны для того, чтобы повторить несколько раз один и тот же участок кода. В GML есть целых 4 разных оператора циклов. Они отличаются своей областью применения - одни операторы удобнее использовать в одних случаях, а другие в каких-то других случаях. Правда во многих случаях можно использовать какой-то один оператор, только тогда возможно прийдется использовать дополнительные переменные и условные операторы, так что для каких случаев какой применять оператор решайте сами.

И так, вот первый и самый простой оператор цикла:

repeat (число повторений) Команда;


Здесь все очень просто, число повторений - это цифра или переменная, указывающая сколько раз оператор repeat должен повторить команду. Как и в операторе if, команда может быть блоком команд, заключенными в фигурные скобки "{}".

Кстати, посмотрите на два этих кода:

repeat (a>b) Команда;


if (a>b) Команда;


Результат их работы будет одинаковым (догадайтесь почему), но принцип действия у них разный.

Вот пример работы оператора repeat, вычисляющий сумму всех чисел от 0 до N:

i=1;
sum=0;
repeat (N) {sum+=i; i+=1;}


Следующий циклический оператор - while:

while (условие) Команда;


Последовательность действий этого оператора такая: если условие верно, то команда выполнится, затем опять проверяется условие и если оно снова верно, то команда выполнится опять и так до тех пор, пока условие будет верным. Если оно окажется не верным, то цикл прекратит свою работу. Команду тоже можно заменить на блок команд, заключенных в фигурные скобки.

Пример работы оператора while, вычисляющий сумму всех чисел от 0 до N:

i=1;
sum=0;
while (i<=N){sum+=i; i+=1;}


Теперь рассмотрим оператор do-until:

do {блок команд} until (условие)


Этот оператор сначала выполняет блок команд, потом проверяет условие. Если оно НЕ верно, то блок команд выполнится снова, а если верно, то цикл прекратится. Особенность этого цикла заключается в том, что блок команд в любом случае хотябы 1 раз будет выполнен.

Пример, вычисляющий сумму всех чисел от 0 до N, но теперь уже с помощью оператора do-until:

i=0;
sum=0;
do {sum+=i; i+=1;} until(i>N)


И последний оператор цикла - for:

for (команда1 ; условие ;команда2) команда3;


Действует он следующим образом: сначала выполняет команду 1, затем проверяет условие и если оно верно, то выполняет команду 3, после нее команду 2, а потом снова проверяет условие и если оно верно, то снова выполняет команду 3, а потом команду 2. И так до тех пор, пока условие будет верным. Все команды можно заменить на блоки команд в фигурных скобках.

И опять пример, считающий сумму всех чисел от 0 до N:

for ({i=1; sum=0;}; i<=N; i+=1) sum+=i;


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

Немного переделаем предыдущий пример:

for ({i=1; sum=0;}; i<=N; i+=1)
{
if (sum+i > 10000)break;
sum+=i;
}


Внесенные изменения не позволят сумме превысить ограничение в 10000.

Также для работы с циклами используется оператор continue. Он, в отличии от break, не завершает весь цикл, он завершает только текущую итерацию цикла.

for (i=a; i<b; i+=1)
{
if (i==0)continue;
sum=sum + 1/i;
}


В этом цикле может произойти случай, когда i равно 0 (например a=-5, а b=5), тогда в формуле sum=sum+1/i произойдет ошибка: деление на 0. С помощью оператора continue мы пропускаем случай когда i будет равно 0 и цикл продолжит свою работу.
Категория: Движки и Гейммейкеры | Добавил: Apati (22 Августа 2011)
Просмотров: 18079 | Комментарии: 2 | Рейтинг: 4.0/2 |
Теги: Game Maker Language, Game Maker, GML, цикл, программирование, gamemaker, основы, условие
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «GML: Условия, циклы», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 2
+1-
2 Gaydar1996   (07 Февраля 2013 14:53) [Материал]
Gaydar1996cry cry cry
wacko wacko wacko
cranky crazy cranky

+1-
1 minecrafter2   (09 Сентября 2012 16:13) [Материал]
minecrafter2killed killed killed killed killed wacko wacko wacko eek

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • DEngine
  • XtremeWorlds
  • CopperCube 6
  • PlayCanvas
  • Novashell
  • ORTS
  • RPG Maker Unite
  • Ursina
  • Stride
  • 3DSTATE Engine
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг