Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2011, 17:20   #1
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию Простешая система скриптов. Нужна оценка и критика

Код:
type 
  TFunc = procedure (); 
  TParams = array of Variant; // Список параметров для процедур 
  TTrigger = record 
    Params: TParams; // список параметров для процедуры (строка, число) 
    Proc: TFunc; // процедура, на которую ссылается proc данного триггера 
  end; 
 
  TTriggerList = record 
    Triggers: array of TTrigger; // Список триггеров для одного события 
  end; 
 
var 
  Actions: array of TTriggerList; // События 
  MainAction: TTriggerList; 
  ActionActive: Boolean; // Выполнять ли событие  
  MainParams: TParams; // Глобальный массив, использующийся процедурами
Выделение памяти для массива Actions и установка параметров происходят при чтении карты. Фрагмент кода, который отвечает за присвоение каждой процедуре тригера глобальную процедуру (при чтении):
Код:
case ID of
'0': Actions[i].Triggers[j].Proc := LoadMap();
'1': Actions[i].Triggers[j].Proc := ShowPlayerMessage();
// Так далее
Установка основного события происходит так:
Код:
MainAction := Actions[ЦИФРА]; 
ActionActive := true;
Проверка, что активировано событие:
Код:
if ActionActive then 
begin 
  // Пробегаемся по списку триггеров в событии, пока не выполним все. Можно с паузой 
  // Не забываем брать параметры из текущего триггера и присваивать MainParams параметры триггера 
  ActionActive := false; 
end;
В глобальных процедурах параметры берутся из массива MainAction.Triggers[ТЕКУЩИЙ_ТРИГГЕР].Params;

В целом, думаю, что понятно, как использовать такую систему. Хотелось бы услышать советы, критику, недовольства, одобрения, в общем всё, насчёт такой системы =). Спасибо.

Последний раз редактировалось Asker13; 12.06.2011 в 19:33.
Asker13 вне форума Ответить с цитированием
Старый 12.06.2011, 19:04   #2
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Все равно имеется case по ID и все равно будет цикл перебора триггеров в массиве. С таким же успехом можно использовать просто массив считанных триггеров с параметрами из файла в виде кода, а в цикле проверять состояние каждого и тот же case по ID будет в нем.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.06.2011, 19:19   #3
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Может ты не совсем понял. В таймере никакого case нет. Есть тупо вызов функции, например:
Actions[0].Trigger[0].Proc;
Вместо 0 - текущее событие, вместо второго 0 - текущий триггер. Proc уже ссылается на процедуру, которую мы определили в начале чтения (ссылается либо на загрузку карты, либо на установку жизней игроку, либо на показ сообщения и т.д.)
Asker13 вне форума Ответить с цитированием
Старый 12.06.2011, 19:56   #4
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Asker13, я прекрасно понял что в коде. Дело в том, что триггер это не только статические процедуры, но и функции, условия. Если вдруг понадобился триггер типа: если у персонажа параметр меньше числа, то выполнить одну процедуру, а если больше - другую, ...как ты будешь себя вести в этом случае? ...снова будешь переписывать триггер, помещая в массив то одну процедуру/функцию, то другую, и с разными параметрами.

Лучше в цикле прогонять через скрипт-движок, он распределит параметры "влет".
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 18.07.2011, 19:34   #5
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Beermonza, можешь чуть подробней тогда рассказать про скрипт-движок? Не совсем пойму тебя.
Asker13 вне форума Ответить с цитированием
Старый 18.07.2011, 19:53   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Код:
TParams = array of Variant;
Не лучший вариант использовать Variant
А то кто знает, что там попадётся?
_-Re@l-_ вне форума Ответить с цитированием
Старый 18.07.2011, 20:02   #7
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Просто Variant - универсальный тип. Параметр может быть и строкой и числом. Например триггер будет представлять из себя показ игрового сообщения, тогда одним из параметров будет строка. Есть альтернатива? Или вообще так не делается в принципе? =)
Asker13 вне форума Ответить с цитированием
Старый 18.07.2011, 20:04   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Asker13, я знаю что такое Variant. Но, видите ли, использование Variant - плохой стиль(в вашем случае), да и..не рекомендуется. Не для этих целей он предназначается.
_-Re@l-_ вне форума Ответить с цитированием
Старый 18.07.2011, 20:11   #9
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Я знаю, что ты знаешь :D... и предчувствовал кстати, что так начнёшь сообщение . Если не с помощью массива Variant, то как тогда параметры триггеров сохранять? На ум приходит запоминать их с помощью строки, а потом научить программу распознавать, какого типа этот параметр. например:"num:2221; float:22.112; string:there is no string;"
Asker13 вне форума Ответить с цитированием
Старый 18.07.2011, 22:53   #10
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Asker13 Посмотреть сообщение
Beermonza, можешь чуть подробней тогда рассказать про скрипт-движок? Не совсем пойму тебя.
Начни с того, что скрипт - это некая структура состоящая из строк. Строки обычно характеризуются наличием множества слов и отдельных символов, расположение которых подчиняется некоторым правилам, которые ты задашь. Простейший скрипт может быть выполнен как текстовый файл, а записан в программу по каждой строке в массив.

Перебирая массив по ячейкам можно переключаться между строками скрипта. В программе всегда перед всеми преобразованиями идет цикл по числу строк в скрипте, или двойной цикл по числу объектов, у которых собственные массивы скрипта. Движок скрипта всегда смотрит текущие строчки в массиве, и на основании логики, записанной в них переключается между строками, или отсчитывает таймеры, или выполняет процедуры.

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

Создай ключевые слова: загрузка карты, обновление, создать объект, удалить объект, изменить параметры и пр., ...это касается и счетчиков. Если в строке скрипта числится, например "If" - значит это триггер условия, далее нужно считывать параметр условия, следующий за его командой, потом искать "then" и тело условия, в котором набор команд. Двигайся в этом направлении.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна ваша оценка проги на делфи Rustam_Hacker Софт 20 09.04.2011 08:02
Нужна оценка стоймости работы Simply-Art Фриланс 4 30.01.2010 17:16
Простешая база Умелец БД в Delphi 5 20.03.2007 10:54