Вопрос: Игровой движок VB6. SR2D+bassl+zlib. Исходники | Добавлено: 08.02.14 22:52 |
Автор вопроса: ![]() |
Ссылка внизу.
Привет. Несколько дней потратил, написал такую штуку. Это не совсем движок, а классы с примерами использования. Хочу, чтобы его потестировали, баги поискали, утечки памяти, что-нибудь посоветовали, что там убрать, что добавить и т.д... Несколько примеров внутри. Опишу поподробнее функционал и классы. SR2D.dll - Софтверный 2D движок от Майкла. SR2Dex.dll - Мое расширение(еще не доделанное) bass.dll - Звуковой движок zlib.dll - библиотека для сжатия Классы: ScreenSettings FullScreen [Форма],[Ширина],[Высота],[Глубина цвета],[Частота] ' Меняет разрешение
Window [Форма],[Ширина],[Высота] ' Оконный режим Reset ' Все возвращается на круги своя. При работе правильно(я надеюсь) растягивает формы и ставит(или убирает) их поверх окон. GameBitmap Создает картинку в памяти. Нужна для удобства. Описывать не буду. GameFont Создаем текстуру Текста и кладем её в спрайт sr2d инициализация
InitFont [Имя шрифта],[Размер],[Тип рендеринга] MakeText [Имя спрайта],[Текст],[Цвет],[Использование альфа-канала] GameInput Работа с устройствами ввода. Клавиатура/Джойстик Мышку не описывал. Может понадобиться, но пока не нужно. FindDevices ' Ищем все джойстики и возвращаем кол-во
INIT [HWND],[Тип устройства],[индекс джойстика] Monitor ' Мониторит состояние клавиш SetFocusHWND [optional значения]' устанавливает значения hwnd окна, на котором фокус, чтобы не снимать клавиши тогда, когда на окне нет фокуса. Возвращает hwnd фокусного окна GetButtonState [Тип],[только, что нажата],[индекс кнопки] ' Получаем состояние кнопки. Можно узнать, нажата ли кнопка только, что. Возвращает значение 0,1 для клавиш, -1;1 для Axis Перед вызовом GetButtonState, нужно сначало проверить фокус(SetFocusHWND), потом Промониторить(Monitor) GamePaker Работа с архивами, чтобы не таскать с игрой кучу ресурсов, да и просто, чтобы к ним небыло прямого доступа. Архив сжимаемый. Степень сжатия примерно как у ZIP'а не максимальных настройках. Также можно хранить строки и массивы(только с типом Byte). т.е. Можно постоянные игровые настройки хранить в архиве, вместе с файлами. Архиватор приложил. Опишу только загрузку: Load ' Загружаем архив
ExtractFile [Имя],[путь] ' Извлекаем файл и сохраняем на диск GetArrData [Имя] ' Получаем данные в виде массива GetText [Имя] ' Получаем в виде текст GameSound Класс для работы со звуком на основе bass.dll Сделаны только основные функции. Так все просто - Загружаем с именем, дальше с ним и работаем. InitSound [hwnd],[Громкость сэмплов],[Громкость Музыки],[Максимум звуков],[Максимум одновременных звуков]
LoadSoundFromFile [путь],[имя],[индекс],[тип],[отложенная загрузка],[заголовок] LoadSoundFromMem [массив],[имя],[индекс],[тип],[отложенная загрузка],[заголовок] PlaySound [Имя],[Баланс] StopSound [Имя] CloseSound [Имя] Тут я прошу вашей помоши. У меня из-за работы с ним при выгрузке проект подвисает и несколько секунд не закрывается. В чем может быть дело? GameTimer Время в игре. Расчет и ограничение FPS, сколько прошло. InitTime ' инициализация
xTime [Дельта времени],[FPS] ' Возвращает текущее игровое время, дельту и FPS. Возвращает 0, если прошло меньше времени, чем заданно в FrameLimit SetFPSLim [FPS] ' Задает FrameLimit GameLight Ну, это уже моя фишка. Работа с тенями в игре. Класс рассчитывает тень по альфа-каналу. Есть настройки точности расчета, тип(Рассеянный, направленный), смазывание. Просчет и смазывание я запихнул в SR2Dex. Просчет вышел довольно шустрый. InitLight [Радиус],[Тип],[Направление],[Угол],[Начальное расстояние] ' Инициализируем
Порядок такой:
LoadLightBall [Спрайт],[R],[G],[B] ' Загружаем текстуру света из спрайта CalcLight [спрайт, с которого альфу берем],[x],[y],[Освещать объект или нет],[lowStep],[HighStep],[RadStep] ' x,y - это куда мы кладем свет, последние три значения - значения да точности просчета RenderLight [спрайт, куда рендерим],[x],[y],[Смазывание] 1. InitLight вызывается один или каждый раз, в зависимости от того, нужно ли что-нибудь изменить 2. LoadLightBall вызывается один или каждый раз, в зависимости от того, нужно ли что-нибудь изменить 3. CalcLight - Просчитываем свет. 4. Ну и рендерим RenderLight В CalcLight по факту перепросчет идет, только если изменились координаты. Изменение контента не предполагается. Можно добавить настройку, чтобы рендерился всегда GameAnimation Класс анимации от Майкла. Пока оставил, а так, буду свой писать, чтобы возможности повысить. Физика Пишу 2D физику: 1. столкновение кубиков. 2. Частицы Position-based Как закончу - добавлю. Там вроде все просто, но где-то косяки у меня. Кубики иногда закручиваются как башенные(что-то с законом сохранения или еще с чем) Частицы не успокаиваются, сц*ки, хотя вроде все правильно описано... хз... Сеть Сеть не добавляю. Понятия не имею как универсализировать класс под все задачи. Изменения и модификация SR2D LoadFromBitmap - Сделал загрузку из битмапы, той, что в памяти лежат. LoadFromStream - Загрузка файла из памяти. Нужно для работы с GamePacker. LoadFromMemory24 - Корявая, но загрузка из массива, где лежит 24х битная картинка. LoadToMemory24 - Обратная функция Куча всяких фильтров, которые, по хорошему, надо переписать в SR2Dex, но руки не доходят. Там и Уровни, и автоуровни, сатурация, Детализация, шумодав, threshold blur, шум, градиент и даже Эквалайзер и еще куча разного де..ма... Для реал-тайма ни один не предназначен, только для промежуточной обработки. Добавил сохранение в GIF в функцию Draw добавил два метода рисования Case OpDifference
Первый рисует разницу, второй - Среднее геометрическое.
SDifference Sp, Dp, W, H, src.Width, meWidth Case OpSqr SSqr Sp, Dp, W, H, src.Width, meWidth Хотел, кстати, добавить новый метод, аналогичный BitBlt т.е.: DrawEx src, dX, dY, dW, dH, sX, sY Метод будет удобным, в некоторых случаях. Но, как-то, опять же, руки не дошли... Еще кучу мелочей, которые не помню. Исходники на тестирование: http://bmber.in/download/enginebyawp.zip |
Ответы | Всего ответов: 18 |
Номер ответа: 1 Автор ответа: ![]() ![]() Вопросов: 5 Ответов: 134 |
Профиль | Цитата | #1 | Добавлено: 09.02.14 05:46 |
У меня из-за работы с ним при выгрузке проект подвисает и несколько секунд не закрывается.
Вангую... отложенная загрузка? Класс анимации от Майкла. Пока оставил, а так, буду свой писать, чтобы возможности повысить.
Правильно. Я анимацию почему не включил в SR2D, а дал отдельным примером? Потому, что это не готовый продукт, а просто пример, в какую сторону копать. LoadToMemory24
Может SaveToMemory24? Кстати, у меня в классе sr2d_sprite есть приватная функция Bpp32to24(), которая как раз преобразует формат из 32-х в 24-х битный. |
Номер ответа: 2 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 09.02.14 09:07 |
Может SaveToMemory24? Да однофигственно. Хотя, может, в отношении к памяти, Save будет более корректным.
есть приватная функция Bpp32to24() Да, видимо, пропустил.
|
Номер ответа: 3 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 11.02.14 23:39 |
Вот пример с исходника для "Физики" частиц.
http://bmber.in/download/particles.water.zip Надеюсь смогу еще оптимизировать его, и в движок засунуть. |
Номер ответа: 4 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 11.02.14 23:50 |
Видео
http://www.youtube.com/watch?v=Whaho1LvzZs |
Номер ответа: 5 Автор ответа: ![]() ![]() Вопросов: 5 Ответов: 134 |
Профиль | Цитата | #5 | Добавлено: 12.02.14 05:42 |
На видео явное "кипение" воды при включенной гравитации, это бывает от низкой точности, когда за тик времени частица успевает пролететь сквозь другую частицу, в результате расталкивающая сила оказывается опять сонаправленной со скоростью, в систему поступает лишняя энергия.
Вот тема на GameDev.ru, там было много подобных решений, в том числе более точных и производительных: http://www.gamedev.ru/users/?id=35572 |
Номер ответа: 6 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 12.02.14 11:39 |
За основу брал
http://www.gamedev.ru/code/articles/PositionBasedPhysics Считал, суммарная энергия уменьшается. Временной отрезок оч. маленький, сомневаюсь, что при таких скоростях кто-то успевает пролететь. А если парочка проскакивает, то они ни на что не повлияют. Кипение, скорее всего, от упругого удара. Вот пример, чуть-чуть удар изменил: http://www.youtube.com/watch?v=gnSO-7dp1V4 |
Номер ответа: 7 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 12.02.14 13:49 |
Вот белее эффектное видео
http://www.youtube.com/watch?v=Q2Nskxh1Dq4 |
Номер ответа: 8 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 12.02.14 17:11 |
А вот 20К частиц.
http://www.youtube.com/watch?v=uL3zHfnduQs |
Номер ответа: 9 Автор ответа: ![]() ![]() Вопросов: 5 Ответов: 134 |
Профиль | Цитата | #9 | Добавлено: 13.02.14 05:24 |
Вот это уже круто смотрится! Особенно то, как рассыпаются брызги, похоже даже, будто есть поверхностное натяжение. |
Номер ответа: 10 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 17.03.14 17:20 |
Привет.
Потестите, пожалуйста, производительность игрульки. bmber.in/download/wabin.rar Интересует средний: Процессор Частота Процессора Частота памяти(режимы) средний FPS минимальный FPS Если есть джойстик, то можно управлять им. Кнопка 1 - прыжок. Если только клава, то стрелками, z - прыгать Разрешение 1280*720, лучше в оконном режиме. Ну и ошибки, естественно. У меня на EeePc(не помню модель) не заработала, на остальных да, но какой-то странный разброс по fps. Заранее спасибо! |
Номер ответа: 11 Автор ответа: ![]() ![]() Вопросов: 5 Ответов: 134 |
Профиль | Цитата | #11 | Добавлено: 18.03.14 07:56 |
1. Athlon FX 6300.
2. 3800 mHz. 3. 1600 mHz, Dual DDR3. 4. 90-100 fps. 5. >70 fps, минимум - когда свет идёт вверх. Почему SR2D.dll имеет размер 9.5 кБ? |
Номер ответа: 12 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 18.03.14 11:33 |
UPX постарался) |
Номер ответа: 13 Автор ответа: ![]() ![]() Вопросов: 5 Ответов: 134 |
Профиль | Цитата | #13 | Добавлено: 19.03.14 07:52 |
1. Athlon64 3800+.
2. 2400 mHz. 3. 400 mHz, Dual DDR. 4. 29-35 fps. 5. 29 fps, от направления света зависит мало. |
Номер ответа: 14 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 19.03.14 13:03 |
Mikle
Спасибо! На старых системах особенно интересует. А на 29fps выглядит играбельно? т.е. Провалы производительности там есть? Сейчас искусственно ограничил до 29 - играть можно, но у меня 29 стабильных fps. |
Номер ответа: 15 Автор ответа: ![]() ![]() Вопросов: 5 Ответов: 134 |
Профиль | Цитата | #15 | Добавлено: 19.03.14 13:40 |
Вообще не видно рывков, гладко всё.
И для старых систем есть ещё вариант уменьшить окно, хотя бы до 1024*576. |
|