forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Как реализовать открытую архитектуру? (плагины, расширения и т.п.) (http://forum.boolean.name/showthread.php?t=16375)

MidGard 23.02.2012 18:22

Как реализовать открытую архитектуру? (плагины, расширения и т.п.)
 
Не клянчу рыбу, прошу удочку! Подскажите куда копать. Хочу попробовать реализовать возможность дописывания плагинов к основной проге. Ну что-то похожее было в Морровинде, скачиваешь новый файл со своим медиа, к примеру остров, он появляется в игре. Или, грубо, тачки реализованы в виде отдельных файлов, не просто набор поликов и текстур, а полноценный механизм, то есть кусок програмного кода. Закинул файл в нужную папку - новая тачка появилась в игре. Или расширение функций перса, ну к примеру летающий ранец - как отдельный файл, найти его в игре можно только если этот файл лежит в определённой папке, но без него перс в принципе не летает.
Возлагал надежды на Include filename$ но он даже по условию не работает. Как я это ваще вижу: некая функция сканирует определённую директорию на наличие там определённых файлов. Появился новый файл - кусок кода, и функция встраивает этот кусок в тело программы, видимо в основной цикл или... не знаю вобщем. И всё, и вот в игре появились птицы, или по небу кроме солнца побежала ещё и луна со всей реальной периодичностью. Или периодически стали происходить землетрясения, или помимо гоночных тачек появился эксковатор. Такая вот загогулина... Это вообще возможно силами одного Блица сделать? Доп. условие в том что ничего кроме бейсика я не знаю, ни в С++, ни в паскаль лезть не хотелось бы.
Заранее всем благодарен.

SBJoker 23.02.2012 21:27

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

Horror 23.02.2012 22:05

Ответ: Как реализовать открытую архитектуру? (плагины, расширения и т.п.)
 
вроде есть луа под блицем - гугли

MidGard 23.02.2012 23:16

Ответ: Как реализовать открытую архитектуру? (плагины, расширения и т.п.)
 
Э-м-м-м... Ну а вот такой ход, что скажете: основная прога сканирует директорию, находит новый файл .exe, дале ExecFile( file$ ) и постоянно слушает определённый порт. Вторая прога по тому самому порту по протоколу ТСР дует данные, координаты вертексов, текстуры, анимацию и т.д. При этом слушает порт-ответку основной проги, при чём внешне это выглядит как работа "демона", то есть никак, прога себя не проявляет вообще, просто вычисляет и дует в порт данные. Эдакое подобие клиент-серверной связки наоборот. А первая прога работает с 3D, визуализирует, управляет вычислениями второй, и в конце даёт команду на самозакрытие. Сойдёт за плагин?

SBJoker 23.02.2012 23:19

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

moka 23.02.2012 23:54

Ответ: Как реализовать открытую архитектуру? (плагины, расширения и т.п.)
 
Небольшое описание что в моём представлении может быть плагином:
Предположим есть приложение, редактор уровней. Само приложение имеет открытый API - набор функций, которые в плагинах можно использовать. Например через эти функции можно получить доступ к определённому объекту в мире, его параметрам, и манипулировать им (ну это самые простые примеры). Также API имеет интерфейс по работе с GUI редактора (создавать окошки, кнопочки и т.п.).
Далее этот API доступен в виде библиотеки.
Каждый плагин имеет две функции Load и Unload.
При включении приложения (или другом событии), для каждого плагина вызывается Load функция, и при закрытии Unload соответственно.

Далее пример плагина - чтобы имел кнопку с удалением всех объектов определённого типа. В функции Load мы создаём панельку, и пихаем её куданить в редакторе, это проделываем через GUI API предоставленным редактором. Далее пишем уже логику для своего созданного GUI, в нашем случае одна кнопка, при нажатии на которую, используя API, мы найдём все объекты например типа "персонаж", и удалим их снова используя API.

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

Пример простейший. Но думаю понятен достаточно.

Говоря о Blitz3D, не заморачивайся. Я рекомендую даже и не пытаться начинать что-то делать такого рода на блице - ты потратишь в пустую кучу времени, а результат если и будет, то весьма скудный.
Такие вещи проще делать на OOP языках, напримерв .Net такое сделать вообще сказка, и намного сложнее, хотя бы основываясь возможности использования объектов между ассемблями (библиотека содержит не тупо список функций, а полноценные классы и т.п.), также есть рефлекция - это для плагинов ваще сказка.

В общем, на Blitz3D, не советую заморачиваться о таких вещах, он убог.

Черный крыс 12.06.2012 14:07

Ответ: Как реализовать открытую архитектуру? (плагины, расширения и т.п.)
 
На блитце сделать поддержку плагинов - очень даже можно. Смотри в сторону функции CallDLL.

Ну а так, я считаю более универсальным способом плагиностроя - это подгрузка скриптов. Например нечто похожее есть в 3DMax под названием MaxScript, но Lua ИМХО - лучше, в нем есть оператор require который позволяет динамически перегрузитиь скрипт, все изменения в скрипте немедленно вступают в силу.

sd.vegastudio 28.11.2012 04:49

Ответ: Как реализовать открытую архитектуру? (плагины, расширения и т.п.)
 
В Blitz3D не имеет смысла открытая архитектура - это имхо - извращение, и ничего не даст - в древности сам этим заморачивался но понял пототом, что у каждого языка свое назначение, время и возможности.

Черный крыс 16.12.2012 12:58

Ответ: Как реализовать открытую архитектуру? (плагины, расширения и т.п.)
 
Цитата:

При включении приложения (или другом событии), для каждого плагина вызывается Load функция, и при закрытии Unload соответственно.
AttachProcess() \ DetachProcess()


Часовой пояс GMT +4, время: 11:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot