Эвенты на с++ или как это назвать
| |
Animan2010 | Дата: Пятница, 05 Апреля 2013, 13:07 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Привет тем, кто читает это =) Возник вопрос: Допустим, мы создаем эпичную рпг. Карты там будут состоять из тайлов. На каждый тайл можно разместить события, причем, состоящие не только из одного действия. Допустим: на карте лес, тайлу 20х15 присвоено событие, содержащее следущие действия: Если здоровье игрока > 50% Телепорт(Город,0,10) //Как бы телепорт на карту город с координатами 0,10 Иначе УбитьИгрока() КонецИгры() КонецЕсли Так вот, чтобы реализовать большое количество таких событий, лучше создавать производные классы, от класса эвент? К примеру: class cEvent{ public: virtual bool update(){}; }; class cEvent001 : public cEvent{ В update пишем всё, что надо }; Но в таком случае будет довольно много производных классов, а если разделять их по отдельным файлам, будет немало файлов. Есть ли другие способы реализации таких "событий"?
Anima Games Animan Publishing
|
|
| |
Jeryonax | Дата: Пятница, 05 Апреля 2013, 13:31 | Сообщение # 2 |
был не раз
Сейчас нет на сайте
| Цитата (Animan2010) Есть ли другие способы реализации таких "событий"? Скрипты. Т.е. если игрок зашел в определенную область, то запускается скрипт. Это не съест производительность т.к. скрипты не 10 000 раз будут запускаться и уменьшить время разработки.
|
|
| |
stalker5889 | Дата: Пятница, 05 Апреля 2013, 14:32 | Сообщение # 3 |
Свободный игродел
Сейчас нет на сайте
| Цитата (Jeryonax) Скрипты. Вы хотели сказать функции? Или я что то непонимаю?
|
|
| |
clidi | Дата: Пятница, 05 Апреля 2013, 15:17 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| Может я плохой программист, но я бы создал разные классы для разных типов тайлов и сделал из них inheritance tree. И писал бы разные события внутри этих классов. Если не хочется много классов то можно наверно enumerators использовать. Например такие как HEALTH_LESS_THAN_50.
Сообщение отредактировал clidi - Пятница, 05 Апреля 2013, 15:22 |
|
| |
Jeryonax | Дата: Пятница, 05 Апреля 2013, 15:17 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Цитата (stalker5889) Вы хотели сказать функции? Или я что то непонимаю? Нет. Я хотел сказать скрипты. Подрубить можно Lua, Python, AngelScript.
Ещё 1 плюс: не нужно перекомпилировать проект каждый раз, когда меняешь что-то в скрипте.
Сообщение отредактировал Jeryonax - Пятница, 05 Апреля 2013, 15:20 |
|
| |
Vinchensoo | Дата: Пятница, 05 Апреля 2013, 15:22 | Сообщение # 6 |
Злобный социопат с комплексом Бога
Сейчас нет на сайте
| Цитата (clidi) Может я плохой программист, но я бы создал разные классы для разных типов тайлов и сделал из них inheritance tree. И писал бы разные события внутри этих классов. Они не ищут легких путей, же. Легче вон скриптовый движок подрубить, чем нормально использовать ООП.
|
|
| |
OpenGOO | Дата: Пятница, 05 Апреля 2013, 15:59 | Сообщение # 7 |
почти ветеран
Сейчас нет на сайте
| События (events) используют для обмена сообщениями, зачем это там Код virtual bool update(){};
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Jeryonax | Дата: Пятница, 05 Апреля 2013, 16:06 | Сообщение # 8 |
был не раз
Сейчас нет на сайте
| Цитата (Vinchensoo) Легче вон скриптовый движок подрубить, чем нормально использовать ООП. Цитата (OpenGOO) События (events) используют для обмена сообщениями, зачем это там
Цитата (Animan2010) Так вот, чтобы реализовать большое количество таких событий, лучше создавать производные классы, от класса эвент? К примеру: class cEvent{ public: virtual bool update(){}; }; class cEvent001 : public cEvent{ В update пишем всё, что надо }; Но в таком случае будет довольно много производных классов, а если разделять их по отдельным файлам, будет немало файлов. Есть ли другие способы реализации таких "событий"?
Автор топика написал же, но мы, как обычно, не читаем. Эт печально.
|
|
| |
Animan2010 | Дата: Пятница, 05 Апреля 2013, 16:36 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| Я так понял, придется использовать то, что я написал в первом посте?
Anima Games Animan Publishing
|
|
| |
Нохчи | Дата: Пятница, 05 Апреля 2013, 16:37 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| Незачем плодить классы. Здесь самый нормальный вариант - использовать колбеки, т. е. при создании объекта ивент, передается функция, которая будет вызвана при его активации. При более продвинутой реализации это называется "механизм сигналов и слотов", но усложнять так совсем не обязательно. А подрубать скриптовый движок только ради этой фигни не годится.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
Jeryonax | Дата: Пятница, 05 Апреля 2013, 16:53 | Сообщение # 11 |
был не раз
Сейчас нет на сайте
| Цитата (Нохчи) Незачем плодить классы. Здесь самый нормальный вариант - использовать колбеки, т. е. при создании объекта ивент, передается функция, которая будет вызвана при его активации. При более продвинутой реализации это называется "механизм сигналов и слотов", но усложнять так совсем не обязательно. А подрубать скриптовый движок только ради этой фигни не годится. Тоже годный вариант.
|
|
| |
OpenGOO | Дата: Пятница, 05 Апреля 2013, 17:05 | Сообщение # 12 |
почти ветеран
Сейчас нет на сайте
| Цитата (Jeryonax) Автор топика написал же, но мы, как обычно, не читаем. Эт печально.
Я то прочитал, но так и не понял, зачем козе баян -)
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Jeryonax | Дата: Пятница, 05 Апреля 2013, 17:09 | Сообщение # 13 |
был не раз
Сейчас нет на сайте
| Цитата (OpenGOO) Я то прочитал, но так и не понял, зачем козе баян -) Цитата (Animan2010) Есть ли другие способы реализации таких "событий"? Автор спросил - я предложил один из вариантов.
|
|
| |
Archido | Дата: Пятница, 05 Апреля 2013, 17:30 | Сообщение # 14 |
Сэнсэй
Сейчас нет на сайте
| Цитата (Нохчи) Незачем плодить классы. Здесь самый нормальный вариант - использовать колбеки, т. е. при создании объекта ивент, передается функция, которая будет вызвана при его активации. При более продвинутой реализации это называется "механизм сигналов и слотов", но усложнять так совсем не обязательно. +1.
У сишных сигнал\слотов на шаблонах - сплошные плюсы за исключением, наверное, вызовов виртуальных функций на каждый чих. Тут главное не генерить эти события пачками каждый кадр, а с умом подходить к этому делу - и будет все ок. Самому такое писать, конечно, дело совсем непростое, но есть уже готовое - boost например или довольно легковесная (и относителньо простая) вот такая либа, там же есть pdf с примерами. Стоит разобраться.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Jeryonax | Дата: Пятница, 05 Апреля 2013, 18:31 | Сообщение # 15 |
был не раз
Сейчас нет на сайте
| Цитата (Animan2010) Допустим, мы создаем эпичную рпг. Карты там будут состоять из тайлов. На каждый тайл можно разместить события, причем, состоящие не только из одного действия. Если это правда эпичная РПГ, значит есть редактор карт. Если есть редактор карт с установкой событий и т.п., то вариант с сигналами не очень подходит. Или собираетесь перекомпилировать проект каждый раз, когда "чихнете"? Примеров куча (даже приводить лень, где используются скрипты для событий).
|
|
| |
Vinchensoo | Дата: Пятница, 05 Апреля 2013, 18:44 | Сообщение # 16 |
Злобный социопат с комплексом Бога
Сейчас нет на сайте
| Цитата (Jeryonax) Автор топика написал же, но мы, как обычно, не читаем. Эт печально. Это не нормальное ООП.
|
|
| |
Farcuat | Дата: Пятница, 05 Апреля 2013, 19:30 | Сообщение # 17 |
частый гость
Сейчас нет на сайте
| Цитата (Animan2010) чтобы реализовать большое количество таких событий, лучше создавать производные классы, от класса эвент? Нет, наследование тут лишне. Я бы сделал проще, и тебе советую. Заводишь в классе переменную тип_ивента и в апдейте прыгаешь свичем на нужный кусок кода. А уж в нем хочешь длл, хочешь скрипты вызывай, хочешь тупо код пропиши (это к чему душа лежит) и все. Наследование используй чтобы из банана сделать самолет, а если нужены лимон или яблоко, то достаточно поменять спрайт(это образно выражаясь).
|
|
| |
Vinchensoo | Дата: Пятница, 05 Апреля 2013, 20:09 | Сообщение # 18 |
Злобный социопат с комплексом Бога
Сейчас нет на сайте
| Цитата (Farcuat) Нет, наследование тут лишне. Я бы сделал проще, и тебе советую. Заводишь в классе переменную тип_ивента и в апдейте прыгаешь свичем на нужный кусок кода. А уж в нем хочешь длл, хочешь скрипты вызывай, хочешь тупо код пропиши (это к чему душа лежит) и все. Когда у него будет под 100 ивентов, он будет вспоминать тебя с бесконечной благодарностью.
|
|
| |
Animan2010 | Дата: Пятница, 05 Апреля 2013, 20:42 | Сообщение # 19 |
постоянный участник
Сейчас нет на сайте
| В общем, посмотрел, как это устроено в упомянутом мною рпг мейкере. Он написан на руби, так что весьма проблемно читать его) Не очень понял, как именно появляются события (понял, что загружаются с помощью файла с картой). Но когда выполняется сам эвент, управление переходит к так называемому интерпретатору (класс game_interpretator), туда передается id команды и лист с параметрами. Потом происходит такая мистика: method_name = "command_#{command.code}" И в зависимости от method_name выполняется метод, к примеру смена золота: def command_125 value = operate_value(@params[0], @params[1], @params[2]) $game_party.gain_gold(value) end Кстати, весьма удобное создание указателя на метод класса.
Anima Games Animan Publishing
|
|
| |
Farcuat | Дата: Пятница, 05 Апреля 2013, 20:43 | Сообщение # 20 |
частый гость
Сейчас нет на сайте
| 100 это даже много. Тот же телепорт в город1 и телепорт в город2 это же не 2 разных евента.
|
|
| |
|