Menu

Categories
Books [2]
Games [15]
Global [5]
I-News [1]
Links [0]
Media [1]
Software [1]
Warez [3]

Login form

Search

Poll
Какой жанр игр вы предпочитаете больше? // Which game genres do you prefer?
Всего ответов: 59

Statistics
Online: 1
Guests: 1
Users: 0


Your IP:
54.162.237.53
Your browser:


Other counters
Урок 4

Триггеры


Да, мы собираемся узнавать о триггерах. Триггеры позволяют Вам выбирать какое окно вам нужно показать. Позже мы узнаем, что триггеры - это то, где Вы пишете ваш код для игры.
Триггер позволяет Вам проверять переменные и принимать решения основанные на этой проверке. Триггер записывается так:
#switch 4:1
Триггеры заканчиваются командой return или goto. В отличие от окон, выключатели невидимы для пользователя. Вы можете использовать их, чтобы управлять вещами без участия игрока. Триггеры управляют и объектами в игре и подготовкой окна для вывода, или выполняют команду, которая была обозначена командой choise.
Помните, триггеры это код, а окна - то, что вы видите в окне во время игры.
Давайте рассмотрим некоторые команды.
Set
В триггерах Вы можете присваивать переменным значения. В отличие от других языков, Вы не должны объявлять переменные. Все необъявленные переменные принимаются равными 0.
Как обычно, название переменной может состоять из букв и чисел. Ниже мы собираемся определить переменную, названную "talkedToGrumpos". Начнем!

Итак, скажем, что Вы поговорили с Grumpos-ом, и если хотите, вы можете теперь говорить с Fleenbot. Вы должы записать:
set talkedToGrumpos = 1
Эта переменная никогда не существовала прежде, но теперь она есть, и она равна 1. Любые ненулевые переменные в скрипте после его запуска продолжают существовать и сохраняются в сейв-файл. Так, вы не можете угадать, что равна ли переменная нулю - потому что вы возможно, присвоили ей какое-то значение, когда вы запускали этот скрипт в предыдущий раз!
Вы можете также делать вычисления с помощью команды set.
set x = 12 * 16
set y =-1 * (3 - 1 + (4 / 2))
Мы поговорим о более сложных операторах позже.

Вы можете также использовать переменные в этих выражениях:
set actualY = (yt - 1) * tileSize + yPartial
Скажу по-секрету - вам совсем не обязательно использовать слово set. Можна написать просто:
x = y * z
и всё будет прекрасно!!!
Однако, большинство людей говорит, что вы "присваиваете" переменной значение, вот почему вы узнали об этом таким путем!

Когда ваша программа завершится, вы можете установить переменную в ноль (что подразумевает что она не будет сохранена в сейв-файле). Есть команда, которая делает это явно: unset. Вы можете использовать unset, чтобы установить переменную в ноль:
unset tempX
Это - только другой способ сделать следующее:
tempX = 0
Array
Итак, мы имеем не только обычные переменные, мы также имеем вещь называемую "массив" - array, который является набором индексированных связанных значений.
Множества запиысваются так:
A[44] = 2
В движке игры используются два размера: массивы от A [ ] до D [ ] имеют 10000 элементов, так что Вы можете назначать от A [0] до А [9999].
Массивы от E [ ] до Z [ ] - могут иметь 256 элементов, так что Вы можете назначать от Q [0] до Q [99].

Вы можете использовать переменные как индекс массива, но Вы НЕ МОЖЕТЕ использовать уравнения. Чтобы использовать переменную в качестве индекса, поставьте её между долларовыми знаками:
index = index + 1
value = A[$index$]
Это очень полезно для того, чтобы проверить много связанных вещей подряд. Если Вы должны обработать набор чисел или набор событий, поместите их в массив. Например, вы можете использовать X [ ] и Y [ ] как координаты каждого пункта пути для перемещения объекта.

Как только у вас появятся переменные, как вы будете проверять их значение и принимать решения? С помощью волшебного слова "если" - if.
If
Команда If позволяет вам проверять значение любого количества вещей, и затем делать действие, основанное на том, были ли эти сравнения верны или нет.
Пример использования для перехода куда-либо ещё:
if (currentX = = 10) goto 30:3
Обратите внимание, что при выполнении сравнения, они должны быть в круглых скобках, и проверка на равенство обозначается двумя символами равенства. Это по примеру языка Cи. (Вы можете использовать и один значек равенства, но два выглядят эстетичнее).

Есть множество различных сравнений, которые вы можете делать:
if (currentX != 10) goto 30:3            //не равно
if (currentX > 10) goto 30:3             //больше чем
if (currentX < 10) goto 30:3            //меньше чем
if (currentX >= 10) goto 30:3          //больше или равно
if (currentX <= 10) goto 30:3          //меньше или равно
if (currentX) goto 30:3                    //отлично от нуля (то же что currentX != 0)
Виды условий сравнения:
AND (и) - записывается так: &&
OR (или) - записывается так: ||
XOR (исключительное или) - записывается так: ^^

Это может быть немного запутывающим, так что давайте посмотрим примеры:
if (currentX > 16 && currentY > 16) goto 30:3
Обе из этих вещей должны быть верны чтоб состоялся переход в окно 30:3.
if (currentX < 16 || currentX > 320) goto 30:3
Так, если currentX - меньше чем 16 или больше чем 320, состоится переход в окно 30:3.
if (x < 40 ^^ y < 40) goto 30:3
Это проверяет, является ли только x или только y меньше чем сорок, так что переход в окно 30:3 состоится, если мы находимся в нижнем левом или верхнем правом секторе размером 80 x 80. Переход не состоится, если мы находимся в верхнем левом секторе (потому что они тогда оба меньше чем 40), или если мы находимся в нижнем правом секторе (потому-что и x и y не будут меньше чем сорок). Только когда одно из них, а не другое верно, выражение будет верным, состоится переход в окно 30:3.

Но что, если вы хотите сделать что-то другое, если сравнение ложно? Для этого мы имеем команду else.
Else
Вы используете else, чтобы сказать, что если сравнение верно, сделайте это, а иначе, сделайте то.
if (playerDied) goto 30:3          //запустить процедуру смерти игрока
else counter = counter + 1       //счет как долго игрок жив
Вы можете писать и более сложный код в if или в else. Все, что вы должны сделать - взять это в круглые скобки - {}. Пример:
if (playerDied)
{
    deathCounter = deathCounter - 1
    dyingAnimCounter = dyingAnimCounter + 1
    if (dyingAnimCounter > 6) dyingAnimCounter = 1
}
else
{
    playerAnimCounter = playerAnimCounter + 1
    if (playerAnimCounter > 4) playerAnimCounter = 1
}
<последующий код>
Так или иначе, если playerDied является отличным от нуля, будет выполнена первая секция кода. Если это ноль, то будет выполнена вторая секция (секция else). Затем выполнение продолжается с <последующий код> после else.

Есть другой способ создания подраздела кода, и он очень полезный. Это команда gosub.
Gosub
Эта команда позволяет вам выполнить совсем другой триггер, а затем вернуться к исходному.

ВАЖНО!
Есть другая причина использовать подтриггеры:
Внутри триггера может быть выполнено только до 30 операторов!!! Если перед goto будет 31 оператор, то у игрового движка снесёт башню. Так что будьте осторожны.
Так как gosub запускает другой триггер, это наилучший способ обойти ограничение в 30 операторов.
Итак, gosub:
gosub 30:3
<следующий оператор>
Эта команда выполнит триггер 30:3, а затем будет выполнен <следующий оператор>.
Это полезно, потому что позволяет вам писать куски кода, которые можна использоватьв разных частях программы.
Define
Эта команда сообщает компилятору делать замены строк на числа в файле перед попыткой компилирования. Рассмотрим пример:
#define POOPER "20001"
#define DRAW "10"

#switch POOPER:DRAW
Так, вместо того чтобы напечатать #switch 20001:10, у нас есть что-то более удобочитаемое. Но с командой define могут быть проблемы. Взгляните:
#define POOPER "20001"
#define DRAW "10"
#define DRAWPOOPER "11"

#switch POOPER:DRAWPOOPER
dparse начнет просматривать код. Он начнет заменять во всем тексте кода слово POOPER на 20001. В результате выйдет следующее:
#define POOPER "20001"
#define DRAW "10"
#define DRAWPOOPER "11"     
//другой define не затронут

#switch 20001:DRAW20001
Это - не то, что мы бы хотели. Поэтому приходится идти на ухищрения, чтобы такое случайно не произошло. Вы можете использовать любые символы, какие хотите. Например долларовые знаки для строк, и знаки процента для чисел. Это неважно. Итак:
#define %POOPER "20001"
#define $FuncA "10"
#define |VALUEB| "11"
#define! !@#$%Goop%$#@! "String"
#define $PLocCheck "x = pooperX
                                      y = pooperY
                                      gosub 20001:10"
Команда define всегда ищет то, что находится между кавычками. Только в названии переменной, которая перед define, нельзя использовать пробелы. Обратите внимание, что когда я использовал define, чтобы заменить кусок кода, я не мог использовать define в этом куске. Команда define не может быть вложенной.
И это плохой способ для выполнения макросов. Почему?
Поскольку вы можете иметь только 16 операторов в триггере, то если вы используете кучу таких макросов, вы рискуете включить слишком много операторов, сами того не зная. Так что либо не используйте для этого define, либо называйте их типа 8PLOCCHECK, чтоб вы знали, сколько в нём строк!

Подсказка №1:
Все define для ваших окон и триггеров лучше делать в начале файла, чтоб удостоверится, что вы случайно не определите два одинаковых.

Подсказка №2: Обычно легче заменить сразу всю пару bank:entry одним оператором define:
#define @PooperMain "20001:1"

Подсказка №3:
Вы можете использовать define чтобы давать массивам от А [ ] до Z [ ] более понятные названия! Смотрите:
#define EnemyX[   "E ["
Тогда всюду, где компилятор увидит что-то типа:
EnemyX[1] = 1
Он заменит это следующим:
E[1] = 1
Круто, да?

ПОМНИТЕ: Все define обрабатываются перед компиляцией кода. Вы не можете использовать их во время выполнения программы, и вы не можете использовать вложенные define!

И напоследок ещё одна команда:
Console
Эта команда позволяет вам вызывать консоль изнутри вашего кода. Вы можете сделать вещи, которые изменят окно, изменят уровень на котором находится игрок, или какие-то внутренние вещи.

Самая полезная из консольных команд - echo. Она посылает строку текста в консоль:
console "echo, We are in MovePooper! "
Команда echo - исключительно полезна для отладки кода. Например, если вам интересно, будет ли триггер должным образом вызван, поместите в него команду echo, и когда вы запустите вашу программу, вызовите консоль. Если вы не видите сообщения, то вы можете предположить что триггер не сработал. Так как консоль обычно загромождена командами и сообщениями, строку лучше выделить чтоб не пропустить её. Например:
console "*|*|*| -- If you see this the switch worked! -- |*|*|*"
Если Вы хотите использовать кавычки в команде echo, используйте обратный слеш и кавычку - \" типа так:
console "bind x \"invoke 1:1\""
Это пошлет в консоль такую строку:
bind x "invoke 1:1"
Вы можете также вывести значения переменных, но вы должны сперва определить их, например:
console "echo pooperX = %f", pooperX
Где мы хотим, чтобы вывело значение переменной pooperX, мы помещаем %f, это значит что она будет действительным числом. Технически pooperX был целым числом, но так как мы всего лишь выводим его значение, то ничего страшного не будет. После завершающих кавычек " мы помещаем запятую , а потом саму переменную, значение которой хотим вывести там где находится символ %f.
Так, если pooperX равен 3, в консоли вы будете видеть:
pooperX = 3
Типы переменных:
%f - действительное число (число с десятичными знаками)
%d - целое число (число без десятичных знаков)
%s - строка (переменная, содержащая текст)

Вы можете использовать их вместе. Пример:
test1 = 50
test$ = "Hello"
test2 = 5

console "echo %s, I have %d jellybeans. Would you like to win %d of them?", test$, test1, test2
Это вывело бы следующее в консоли:
Hello, I have 50 jellybeans. Would you like to win 5 of them?
Вы не можете вставить сюда уравнение, только переменную. Вы также не можете вывести напрямую значение элемента массива. Для этого нужно определить ещё одну переменную для индекса элемента:
temp = A[$index$]
console "echo A[index] = %f", temp
Примечание: в окнах вы можете выводить переменные с помощью команды body:
body "pooperX = %d", pooperX
Дополнительно, если переменная меняется, то команда body будет выводить новое значение, так что это хороший способ исследовать переменную в вашей программе.

Мы внесем в список больше консольных команд в более поздних уроках.

Есть ещё одна команда, которую вы можете использовать в окне.
Flags
Эта команда позволяет вам устанавливать некоторые флаги, определяя, как работает окно.
Использование:
flags <flagname>
Вот флаги годные к употреблению, которые вы можете установить:
  • flags passive
  •                Это создает окно без курсора, по которому нельзя щелкнуть мышью. Это хорошо для HUD или чего-то, что вы хотите держать некоторое время перед пользователем.
  • flags passive2D
  •           Это создает окно с 2D курсором, но щелчок мыши ВСЕ ЕЩЕ не закроет окно. Это хорошо для интерфейса. Таким путем вы можете управлять областями взаимодействия на интерфейсе. Например, все миниигры worldskill - окна с флагом passive2D.


    Хорошо, это в основном все команды для триггеров. Вот простой триггер с define, переменными, и т.д. Вы можете скомпилировать и загрузить его:
    map JOEY
    loadape Lesson4
    invoke 4:1
    Каждый раз, когда вы делаете invoke 4:1, этот скрипт будет выводить различные сообщения, и собщит вам состояние счетчика.

    ==>В следующем уроке мы узнаем, что окна - это еще более крутые штуки чем мы думали!
    //********************************************************************
    //DEFINES
    //********************************************************************
    #define %Lesson4 "4"
    #define %TalkToJoe "1"
    #define %JoeSaying1 "10"
    #define %JoeSaying2 "20"
    #define %JoeSaying3 "30"
    #define %JoeSaying4 "40"
    //===========================================================
    //CODE
    //===========================================================
    #switch %Lesson4:%TalkToJoe
    joeCounter = joeCounter + 1
    if (joeCounter > 4) joeCounter = 1
    if (joeCounter == 1) goto %Lesson4:%JoeSaying1
    else if (joeCounter == 2) goto %Lesson4:%JoeSaying2
    else if (joeCounter == 3) goto %Lesson4:%JoeSaying3
    else goto %Lesson4:%JoeSaying4
    //-------------------------------------------------------------------
    #window %Lesson4:%JoeSaying1
    title "Joe"
    body "ZOWIE! Joe knows the counter is %d.", joeCounter
    //-------------------------------------------------------------------
    #window %Lesson4:%JoeSaying2
    title "Joe"
    body "BOOM! Joe knows the counter is %d.", joeCounter
    //-------------------------------------------------------------------
    #window %Lesson4:%JoeSaying3
    title "Joe"
    body "WHAM! Joe knows the counter is %d.", joeCounter
    //-------------------------------------------------------------------
    #window %Lesson4:%JoeSaying4
    title "Joe"
    body "PLOP! Joe knows the counter is %d.", joeCounter


    Назад
    Copyright Z'Ha'Dum LTD © 2017