Страница: 1 | 2 |
Вопрос: Игровой движок VB6. SR2D+bassl+zlib. Исходники
Добавлено: 08.02.14 22:52
Автор вопроса: AWP | Web-сайт:
Ссылка внизу.
Привет. Несколько дней потратил, написал такую штуку.
Это не совсем движок, а классы с примерами использования.
Хочу, чтобы его потестировали, баги поискали, утечки памяти, что-нибудь посоветовали, что там убрать, что добавить и т.д...
Несколько примеров внутри.
Опишу поподробнее функционал и классы.
SR2D.dll - Софтверный 2D движок от Майкла.
SR2Dex.dll - Мое расширение(еще не доделанное)
bass.dll - Звуковой движок
zlib.dll - библиотека для сжатия
Классы:
ScreenSettings
Window [Форма],[Ширина],[Высота] ' Оконный режим
Reset ' Все возвращается на круги своя.
При работе правильно(я надеюсь) растягивает формы и ставит(или убирает) их поверх окон.
GameBitmap
Создает картинку в памяти. Нужна для удобства. Описывать не буду.
GameFont
Создаем текстуру Текста и кладем её в спрайт sr2d
InitFont [Имя шрифта],[Размер],[Тип рендеринга]
MakeText [Имя спрайта],[Текст],[Цвет],[Использование альфа-канала]
GameInput
Работа с устройствами ввода. Клавиатура/Джойстик
Мышку не описывал. Может понадобиться, но пока не нужно.
INIT [HWND],[Тип устройства],[индекс джойстика]
Monitor ' Мониторит состояние клавиш
SetFocusHWND [optional значения]' устанавливает значения hwnd окна, на котором фокус, чтобы не снимать клавиши тогда, когда на окне нет фокуса. Возвращает hwnd фокусного окна
GetButtonState [Тип],[только, что нажата],[индекс кнопки] ' Получаем состояние кнопки. Можно узнать, нажата ли кнопка только, что. Возвращает значение 0,1 для клавиш, -1;1 для Axis
Перед вызовом GetButtonState, нужно сначало проверить фокус(SetFocusHWND), потом Промониторить(Monitor)
GamePaker
Работа с архивами, чтобы не таскать с игрой кучу ресурсов, да и просто, чтобы к ним небыло прямого доступа. Архив сжимаемый. Степень сжатия примерно как у ZIP'а не максимальных настройках.
Также можно хранить строки и массивы(только с типом Byte). т.е. Можно постоянные игровые настройки хранить в архиве, вместе с файлами.
Архиватор приложил.
Опишу только загрузку:
ExtractFile [Имя],[путь] ' Извлекаем файл и сохраняем на диск
GetArrData [Имя] ' Получаем данные в виде массива
GetText [Имя] ' Получаем в виде текст
GameSound
Класс для работы со звуком на основе bass.dll
Сделаны только основные функции.
Так все просто - Загружаем с именем, дальше с ним и работаем.
LoadSoundFromFile [путь],[имя],[индекс],[тип],[отложенная загрузка],[заголовок]
LoadSoundFromMem [массив],[имя],[индекс],[тип],[отложенная загрузка],[заголовок]
PlaySound [Имя],[Баланс]
StopSound [Имя]
CloseSound [Имя]
Тут я прошу вашей помоши. У меня из-за работы с ним при выгрузке проект подвисает и несколько секунд не закрывается. В чем может быть дело?
GameTimer
Время в игре. Расчет и ограничение FPS, сколько прошло.
xTime [Дельта времени],[FPS] ' Возвращает текущее игровое время, дельту и FPS. Возвращает 0, если прошло меньше времени, чем заданно в FrameLimit
SetFPSLim [FPS] ' Задает FrameLimit
GameLight
Ну, это уже моя фишка. Работа с тенями в игре.
Класс рассчитывает тень по альфа-каналу.
Есть настройки точности расчета, тип(Рассеянный, направленный), смазывание.
Просчет и смазывание я запихнул в SR2Dex. Просчет вышел довольно шустрый.
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 добавил два метода рисования
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
Автор ответа:
Mikle
Вопросов: 5
Ответов: 134
Профиль | | #1
Добавлено: 09.02.14 05:46
Вангую... отложенная загрузка?
Правильно. Я анимацию почему не включил в SR2D, а дал отдельным примером? Потому, что это не готовый продукт, а просто пример, в какую сторону копать.
Может SaveToMemory24? Кстати, у меня в классе sr2d_sprite есть приватная функция Bpp32to24(), которая как раз преобразует формат из 32-х в 24-х битный.
Номер ответа: 2
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #2
Добавлено: 09.02.14 09:07
Номер ответа: 3
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #3
Добавлено: 11.02.14 23:39
Вот пример с исходника для "Физики" частиц.
http://bmber.in/download/particles.water.zip
Надеюсь смогу еще оптимизировать его, и в движок засунуть.
Номер ответа: 4
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #4
Добавлено: 11.02.14 23:50
Видео
http://www.youtube.com/watch?v=Whaho1LvzZs
Номер ответа: 5
Автор ответа:
Mikle
Вопросов: 5
Ответов: 134
Профиль | | #5
Добавлено: 12.02.14 05:42
На видео явное "кипение" воды при включенной гравитации, это бывает от низкой точности, когда за тик времени частица успевает пролететь сквозь другую частицу, в результате расталкивающая сила оказывается опять сонаправленной со скоростью, в систему поступает лишняя энергия.
Вот тема на GameDev.ru, там было много подобных решений, в том числе более точных и производительных:
http://www.gamedev.ru/users/?id=35572
Номер ответа: 6
Автор ответа:
AWP
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
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #7
Добавлено: 12.02.14 13:49
Вот белее эффектное видео
http://www.youtube.com/watch?v=Q2Nskxh1Dq4
Номер ответа: 8
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #8
Добавлено: 12.02.14 17:11
А вот 20К частиц.
http://www.youtube.com/watch?v=uL3zHfnduQs
Номер ответа: 9
Автор ответа:
Mikle
Вопросов: 5
Ответов: 134
Профиль | | #9
Добавлено: 13.02.14 05:24
Вот это уже круто смотрится! Особенно то, как рассыпаются брызги, похоже даже, будто есть поверхностное натяжение.
Номер ответа: 10
Автор ответа:
AWP
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
Автор ответа:
Mikle
Вопросов: 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
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #12
Добавлено: 18.03.14 11:33
UPX постарался)
Номер ответа: 13
Автор ответа:
Mikle
Вопросов: 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
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #14
Добавлено: 19.03.14 13:03
Mikle
Спасибо! На старых системах особенно интересует.
А на 29fps выглядит играбельно? т.е. Провалы производительности там есть?
Сейчас искусственно ограничил до 29 - играть можно, но у меня 29 стабильных fps.
Номер ответа: 15
Автор ответа:
Mikle
Вопросов: 5
Ответов: 134
Профиль | | #15
Добавлено: 19.03.14 13:40
Вообще не видно рывков, гладко всё.
И для старых систем есть ещё вариант уменьшить окно, хотя бы до 1024*576.