Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Игровой движок VB6. SR2D+bassl+zlib. Исходники Добавлено: 08.02.14 22:52  

Автор вопроса:  AWP | Web-сайт: xawp.narod.ru | ICQ: 345685652 
Ссылка внизу.
Привет. Несколько дней потратил, написал такую штуку.
Это не совсем движок, а классы с примерами использования.
Хочу, чтобы его потестировали, баги поискали, утечки памяти, что-нибудь посоветовали, что там убрать, что добавить и т.д...
Несколько примеров внутри.

Опишу поподробнее функционал и классы.
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
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 133
 Профиль | | #1 Добавлено: 09.02.14 05:46
У меня из-за работы с ним при выгрузке проект подвисает и несколько секунд не закрывается.

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

Правильно. Я анимацию почему не включил в SR2D, а дал отдельным примером? Потому, что это не готовый продукт, а просто пример, в какую сторону копать.
LoadToMemory24

Может SaveToMemory24? Кстати, у меня в классе sr2d_sprite есть приватная функция Bpp32to24(), которая как раз преобразует формат из 32-х в 24-х битный.

Ответить

Номер ответа: 2
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #2
Добавлено: 09.02.14 09:07
Может SaveToMemory24?
Да однофигственно. Хотя, может, в отношении к памяти, Save будет более корректным.
есть приватная функция Bpp32to24()
Да, видимо, пропустил.

Ответить

Номер ответа: 3
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #3
Добавлено: 11.02.14 23:39
Вот пример с исходника для "Физики" частиц.
http://bmber.in/download/particles.water.zip

Надеюсь смогу еще оптимизировать его, и в движок засунуть.

Ответить

Номер ответа: 4
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #4
Добавлено: 11.02.14 23:50
Видео
http://www.youtube.com/watch?v=Whaho1LvzZs

Ответить

Номер ответа: 5
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 133
 Профиль | | #5 Добавлено: 12.02.14 05:42
На видео явное "кипение" воды при включенной гравитации, это бывает от низкой точности, когда за тик времени частица успевает пролететь сквозь другую частицу, в результате расталкивающая сила оказывается опять сонаправленной со скоростью, в систему поступает лишняя энергия.
Вот тема на GameDev.ru, там было много подобных решений, в том числе более точных и производительных:
http://www.gamedev.ru/users/?id=35572

Ответить

Номер ответа: 6
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #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-сайт: xawp.narod.ru
 Профиль | | #7
Добавлено: 12.02.14 13:49
Вот белее эффектное видео
http://www.youtube.com/watch?v=Q2Nskxh1Dq4

Ответить

Номер ответа: 8
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #8
Добавлено: 12.02.14 17:11
А вот 20К частиц.
http://www.youtube.com/watch?v=uL3zHfnduQs

Ответить

Номер ответа: 9
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 133
 Профиль | | #9 Добавлено: 13.02.14 05:24
Вот это уже круто смотрится! Особенно то, как рассыпаются брызги, похоже даже, будто есть поверхностное натяжение.

Ответить

Номер ответа: 10
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #10
Добавлено: 17.03.14 17:20
Привет.
Потестите, пожалуйста, производительность игрульки.
bmber.in/download/wabin.rar

Интересует средний:
Процессор
Частота Процессора
Частота памяти(режимы)
средний FPS
минимальный FPS


Если есть джойстик, то можно управлять им. Кнопка 1 - прыжок.
Если только клава, то стрелками, z - прыгать

Разрешение 1280*720, лучше в оконном режиме.

Ну и ошибки, естественно. У меня на EeePc(не помню модель) не заработала, на остальных да, но какой-то странный разброс по fps.

Заранее спасибо!

Ответить

Номер ответа: 11
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 133
 Профиль | | #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-сайт: xawp.narod.ru
 Профиль | | #12
Добавлено: 18.03.14 11:33
UPX постарался)

Ответить

Номер ответа: 13
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 133
 Профиль | | #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-сайт: xawp.narod.ru
 Профиль | | #14
Добавлено: 19.03.14 13:03
Mikle
Спасибо! На старых системах особенно интересует.
А на 29fps выглядит играбельно? т.е. Провалы производительности там есть?
Сейчас искусственно ограничил до 29 - играть можно, но у меня 29 стабильных fps.

Ответить

Номер ответа: 15
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 133
 Профиль | | #15 Добавлено: 19.03.14 13:40
Вообще не видно рывков, гладко всё.
И для старых систем есть ещё вариант уменьшить окно, хотя бы до 1024*576.

Ответить

Страница: 1 | 2 |

Поиск по форуму





© Copyright 2002-2011 VBNet.RU | Пишите нам