Hexen 2 Russian Fans Четверг
2024-12-26
11:20:04
Приветствую Вас Гость | RSS Главная страница | Статьи по скриптам - синтаксис (азы) - Форум | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: DraculaX, RaVeN, Reiko  
Статьи по скриптам - синтаксис (азы)
DraculaXДата: Четверг, 2013-05-02, 18:15:17 | Сообщение # 1
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Итак, начнём с самых азов.

Что такое скрипт?

Скрипт представляет собой набор команд, которые могут быть запущены при запуске карты open или при взаимодействии с каким-либо объектом (void). Объектами могут быть линии секторов, предметы, монстры и т.д.

Где мы пишем скрипты?

Скрипты можно писать в обычном блокноте, либо использовать продвинутые программы, специально предназначенные для программирования. Например, Notepad++. Очень удобный редактор, похожий на блокнот, знающий множество языков программирования. Так же есть специальные редакторы для думообразных игр — SlumpEd и Slade. Главное отличие этих программ от простого блокнота в том, что они выделяют разные команды определёнными цветами, в зависимости от языка программирования. Таким образом написание скриптов становится очень удобным. Так же можно писать скрипты прямо в редакторе карт. Лично я предпочитаю использовать Slade.

Что нужно для работы?

Чтобы скрипты работали в думообразных играх, необходима библиотека скриптов ACS, встроенная в порты. Эту библиотеку необходимо вызывать на самой первой строчке нашего будущего сценария с помощью следующей команды:

Код

    #include "zcommon.acs"



Всё, теперь мы можем начинать писать скрипты.

Каждый скрипт представляет из себя следующий код:

Код

    // скрипт срабатывающий при открытии карты
    Script 1 open {
          
        ...набор команд...
    }

    // скрипт срабатывающий при взаимодействии с объектами
    Script 2 (void) {
          
        ...набор команд...
    }



Помимо open есть такой параметр как enter. Open срабатывает один раз при открытии карты для всех игроков. Enter срабатывает для каждого игрока отдельно. Т.е. при многопользовательской игре, скрипт будет срабатывать каждый раз при входе на карту новых игроков.


Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©

Сообщение отредактировал DraculaX - Четверг, 2013-05-02, 19:02:39
 
DraculaXДата: Четверг, 2013-05-02, 18:20:15 | Сообщение # 2
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Что такое переменные?

Это переименованная или адресуемая иным способом область памяти, адрес которой можно использовать для доступа к данным. Данные переменной называются значением. В этом уроке мы будем их использовать для связи скриптов. Название переменной может быть любым. Как правило, в программировании их называют максимально понятным языком. Например, нам нужна переменная для запертой двери. Чтобы всем было понятно для чего она, назовём её Closed_Door. Прошу обратить внимание, что названия переменных для удобства пишутся с больших букв, а пробелы обязательно заменяются нижним подчёркиванием.

Итак, переменная задаётся функцией int вне скриптов.

Код

    int Closed_Door;



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

Код

    int Closed_Door = 1;



В оригинальных скриптах HeXen’а переменные названы типа mapvar0, mapvar1 и т.д. В общем-то это не правильно, и не удобно с этими переменными работать.

Итак, мы написали нашу первую переменную и теперь будем с ней работать. Для начала напишем скрипт, который будет изменять значение данной переменной.

Код

    int Closed_Door = 1;

    Script 1 (void) {
               
        Closed_Door = 0;
    }



Итак, наша переменная была равна единице. Но после того, как сработал Script 1, она стала равна нулю.

Теперь напишем второй скрипт, который будет работать только в том случае, если наша переменная будет равна единице:

Код

    Script 2 (void) {
            
        if(Closed_Door == 1)
             Door_Open(tag, speed);
    }



Итак, когда наша переменная равняется единице, открывается дверь. Но, если мы, например, нажали на кнопку, которая запускает Script 1, значение переменной приравнивается к нулю, и дверь уже не откроется. Чтобы снова приравнять переменную к единице, мы должны написать третий скрипт с командой Closed_Door = 1;

Надеюсь, достаточно понятно объяснил пример использования переменных.


Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©

Сообщение отредактировал DraculaX - Четверг, 2013-05-02, 22:42:49
 
DraculaXДата: Четверг, 2013-05-02, 18:28:18 | Сообщение # 3
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Логические операторы и операторы отношений

В предыдущем уроке мы написали такой пример:

Код

    if(Closed_Door == 1)



Обратите внимание на ==. Это оператор отношений. Ниже приведу примеры наиболее распространённых операторов.



Теперь рассмотрим пример работы таких операторов как ++ и == на примере нового скрипта. Итак, допустим, у нас есть раздвижная дверь, которая должна открыться только один раз. Напишем следующий код:

Код

    int Door = 0; // Зададим новую переменную, равную нулю

    Script 1 (void) {
      
        if(Door++ == 0)
            Polyobj_RotateRight(po, speed, angle);
    }



Итак, в данном случае переменная Door равняется нулю. Скрипт проверяет так ли это, и увеличивает её на единицу. Затем срабатывает команда открывающая дверь.
Теперь, если мы снова запустим этот скрипт, дверь уже не сдвинется с места, т.к. значение переменной Door увеличено на единицу и она уже не равна нулю.

Важно обратить внимание на порядок написания оператора ++. Если мы пишем Door++ == 0, это значит, что условие сначала проверяет равна ли Door нулю, и только потом уже увеличивает её значение.
Но если мы напишем ++Door == 0, то сначала скрипт увеличит значение, а потом уже проверит его равенство нулю.

Во втором случае наш скрипт будет выглядеть следующим образом:

Код

    int Door = 0;

    Script 1 (void) {
      
        if(++Door == 1)
            Polyobj_RotateRight(po, speed, angle);
    }

Прикрепления: 5797279.jpg (75.4 Kb)


Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
 
DraculaXДата: Четверг, 2013-05-02, 18:32:14 | Сообщение # 4
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Теперь рассмотрим что такое if из предыдущих уроков и познакомимся с его дополнением else.

If переводится как если. Т.е. у нас получается условие типа если что-то равно этому, то выполняем действие. А что будет, если условие неверно?

Код

    if(var0 == 0)
        ...выполняем одну команду...



В этом случае, если var0 не равно нулю, ничего не произойдёт. Это логично, но иногда нужна алтернатива. Тут нам на помощь приходит оператор else, который выполняет другие команды, если условия для выполнения первой команды неверно.

Код

    if(var0 == 0)
        ...выполняем одну команду...
      
    else
        ...выполняем другую команду...



Теперь обратим внимание на правильность написания этих скриптов. До сих пор мы писали по одной команде, но чтобы написать несколько команд в одном условии, нам необходимо вставлять фигурные скобки, иначе скрипт просто не сработает:

Код

    if(var0 == 0) {
      
        ...выполняем одну группу команд...
    }

    else {
      
        ...выполняем другую группу команд...
    }



Многоуровневые условия

Для оператора else можно так же задавать условия, как и для if. Для этого на необходимо объединить оба оператора. Это позволяет нам создавать большее количество вариантов действий.

Код

    if(var0 == 0) { // если var0 равно нулю,
      
        ...выполняем одну группу команд...
    }

    else if(var0 == 1) { // если var0 не равно нулю, а равно единице,
      
        ...выполняем другую группу команд...
    }

    else { // если же предыдущие условия неверны,
      
        ...выполняем третью группу команд...
    }



Таким образом мы создали уже три варианта действий для одного скрипта. Можно и больше. Но тогда лучше использовать оператор switch, о котором я напишу в следующем уроке.


Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
 
DraculaXДата: Четверг, 2013-05-02, 18:34:17 | Сообщение # 5
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Оператор switch предназначен для организации выбора из множества различных вариантов. Формат оператора следующий:

Код

    switch(var0) { // привязываем оператор к переменной var0
        
       case 0: // Если var0 равно нулю,
           ...выполняем одну группу команд...
           break; // Завершаем условие
            
       case 1: // Если var0 равно единице,
           ...выполняем другую группу команд...
           break;
            
       case 6:
           ...выполняем третью группу команд...
           break;
       ...
    }



Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©

Сообщение отредактировал DraculaX - Четверг, 2013-05-02, 19:05:47
 
DraculaXДата: Четверг, 2013-05-02, 18:41:23 | Сообщение # 6
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Оператор for является аналогом while для более опытных программистов. Он имеет следующий формат:

Код

    for(int a = 0; a < 3; a++) {
       
        ...
    }



Теперь смотрите. У этого оператора есть три главных значения. Первое - задание переменной. Второе - условие выполнения скрипта. Третье - изменение переменной.
В данном примере я задал переменную a равную нулю. Затем написал условие, что пока a меньше трёх, выполняется скрипт. А далее, после выполнения скрипта, моя переменная увеличивается на единицу: a++. Таким образом мой скрипт сработает три раза, пока переменная не станет равняться трём.


Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©

Сообщение отредактировал DraculaX - Четверг, 2013-05-02, 18:42:08
 
DraculaXДата: Четверг, 2013-05-02, 18:57:10 | Сообщение # 7
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Есть ещё один оператор, который я здесь опишу, но только потому, что он существует. Но использовать его я не рекомендую. Как показывает практика использования этого оператора в HeXen'е, в случае неправильного написания оператора, он ломает игру и вырывается в операционную систему... в лучшем случае, вам придётся перезагрузить компьютер.

Итак, оператор do. Он имеет следующий формат:

Код

    do {

       ...выполняем группу команд...
    }



А теперь внимание! Оператор do не может нормально работать, пока не связать его с операторами while или for.

Код

    do {
     
       ...выполняем группу команд...
    }
    while( пока есть условие );



Код

    do {
     
       ...выполняем группу команд...
    }
    for( пока есть условие );



Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
 
DraculaXДата: Четверг, 2013-05-02, 19:03:27 | Сообщение # 8
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Итак, по синтаксису и азам всё. Далее вы можете задавать любые интересующие вас вопросы по этой теме.

Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
 
TancreDimДата: Понедельник, 2019-02-18, 00:42:00 | Сообщение # 9
Искушённый
Группа: Хранители
Сообщений: 180
Статус: Offline
А кто-нибудь может пояснить где и как собс-но прописывать сами скрипты?
В каком лумпе?
Что в него надо дописывать чтобы вызывался из декорэйт лумпа?
В каком случае нужно компилить в лайбру?
Когда (и что) надо размещать между A_(START\END) маркерами?


Пишите в личку если что.

"Poor HeXen. Along with Strife, it's been the neglected red-headed stepchild."

NaN is my favourite number.
 
ReikoДата: Понедельник, 2019-02-18, 13:47:08 | Сообщение # 10
Темный воин внешнего мира
Группа: Модераторы
Сообщений: 2482
Статус: Offline
TancreDim
Цитата TancreDim ()
А кто-нибудь может пояснить где и как собс-но прописывать сами скрипты?


Для уровня - в gzdoom builder по кнопке f10, для какого либо мода - в slade
Цитата TancreDim ()
В каком лумпе?


Если в wad файле, то название не важно, если в pk3 то название с расширением *.acs или ваще txt можно
Цитата TancreDim ()
Что в него надо дописывать чтобы вызывался из декорэйт лумпа?


В самом декорейте скрипты вызываются примерно так:

Код
PI2G A 1
      PLAY A 0 ACS_ExecuteAlways(853, 0, 0, 0, 0) // вызывается скрипт 853


Цитата TancreDim ()
В каком случае нужно компилить в лайбру?


для мода без уровней создаешь в slade в pk3 файл скрипта к примеру testsc.acs и в нем пишешь:

Код
#library "testsc"
#include "zcommon.acs"

script 100 enter
{
printbold(s:"hello world!");
}


сохраняешь и компилируешь. Создается автоматом папка acs и туда помещается скомпилированная либра.
Остается создать лумп LOADACS и там напмсать:

Код
testsc


и сохранить, тогда скрипт заработает в игре.
Цитата TancreDim ()
Когда (и что) надо размещать между A_(START\END) маркерами?


если комилируешь в wad файле через слейд, то он автоматом создает эти маркеры и помещает туда скрипт.

также на иддуд есть мануальчик про acs тоже полезно  smile


аниме спасет мир :3

Сообщение отредактировал Reiko - Понедельник, 2019-02-18, 13:50:06
 
TancreDimДата: Понедельник, 2019-02-18, 15:49:23 | Сообщение # 11
Искушённый
Группа: Хранители
Сообщений: 180
Статус: Offline
Благодарствую, получилось!


Цитата Reiko ()
также на иддуд есть мануальчик про acs тоже полезно
Мануал шикарный, пропустил его из-за того что тред находился в жопе раздела форума.
На всякий оставлю директ линк: Вводное руководство по ACSдля самых маленьких.


Пишите в личку если что.

"Poor HeXen. Along with Strife, it's been the neglected red-headed stepchild."

NaN is my favourite number.


Сообщение отредактировал TancreDim - Понедельник, 2019-02-18, 15:49:54
 
  • Страница 1 из 1
  • 1
Поиск:


Hexen 2 Russian Fans © 2006-2024 Хостинг от uCoz