forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   [TrueHorror] - разработка (http://forum.boolean.name/showthread.php?t=17293)

Samodelkin 11.10.2014 23:14

Ответ: [TrueHorror] - разработка
 
Я всё таки еще раз предлагаю, если проект не коммерческий, разместить коды в каком-нибудь репозитории.

mr.DIMAS 11.10.2014 23:45

Ответ: [TrueHorror] - разработка
 
Пожалуйста: https://github.com/mrDIMAS/src

Там ничего особенного нет - только голые исходники.

Репозиторий будет обновляться раз в неделю или около того.

Samodelkin 11.10.2014 23:59

Ответ: [TrueHorror] - разработка
 
Буду время от времени изучать.

Ранее здесь шли разговоры о borderless window и 30fps в Ubisoft играх.
И вроде бы нашлось решение менять разрешение в borderless окне, а вот что насчёт fps?
Оконное приложение в d3d9 можно создавать с параметрами FullScreen_RefrashRateInHz = 0 и PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT | D3DPRESENT_INTERVAL_ONE | D3DPRESENT_INTERVAL_IMMEDIATE.
Во первых сделать 30 fps не получится, во вторых нет уверенности что у пользователя установлено 60.
Как вариант можно установить IMMEDIATE, а затем поставить ручной ограничитель.
Кто что думает?

Samodelkin 12.10.2014 15:35

Ответ: [TrueHorror] - разработка
 
Попробуй в Renderer::RenderWorld вместо
Код:

float timeStep = 1.0f / 60.0f;

//if( g_fpsCounter.fps > 0 )
//  timeStep = 1.0f / (float)g_fpsCounter.fps;

const int subSteps = 4;

g_dynamicsWorld->stepSimulation ( timeStep, subSteps );

написать
Код:

float timeStep = 1.0f / 60.0f;

//if( g_fpsCounter.fps > 0 )
//  timeStep = 1.0f / (float)g_fpsCounter.fps;

const int subSteps = 4;

g_dynamicsWorld->stepSimulation ( timeStep, subSteps, 1.0f / 120.0f );

Если это не исправит проблему, значит она в другом.

mr.DIMAS 12.10.2014 16:18

Ответ: [TrueHorror] - разработка
 
Так только тормозит сильнее физика и не помогло.

Samodelkin 12.10.2014 19:52

Ответ: [TrueHorror] - разработка
 
Удобно что в оконном режиме (в том числе borderless), даже если открываешь стартовое меню, которое в Win8 полноэкранное, не происходит потеря устройства.

Samodelkin 13.10.2014 16:05

Ответ: [TrueHorror] - разработка
 
У тебя оказывается ещё OpenGL движок есть.

Кстати я тоже не сторонник выкладывать в репозиторий файлы проекта и прочие вещи относящиеся больше к IDE чем к коду, но всё-таки совсем без инструкции непонятно что с чем собирать.

Например у себя я по папкам разбросал исходники -- каждая папка это модуль сборки, ещё есть батник (или makefile) в котором так-же можно разобраться в структуре проекта, и выставив пути, собрать.

mr.DIMAS 13.10.2014 17:23

Ответ: [TrueHorror] - разработка
 
Таки движок на огле так себе поделка.

Чтобы собрать нужно иметь еще кучу всего.

DirectX SDK
Bullet 2.83
MagicInput ( h, lib ) - мышь\клава
ProjectF ( h, lib ) - звук

Еще есть конвертер, скрипт для макса, Visual Leak Detector.

Все кроме булета и vld и DirectX SDK могу скинуть отдельно. + файлы проекта( на VS 2012 )

Кароч проект большой и имеет кучу зависимостей, так что с системы на систему трудно переезжать.

Движок ( Ruthenium.dll ) - это все кроме того что лежит в Game
Игра - ( Mine.exe ) - это Game

Samodelkin 13.10.2014 19:56

Ответ: [TrueHorror] - разработка
 
Давай скинь, попробую собрать.
MagicInput и ProjectF если будут меняться, то их тоже имеет смысл зарепозиторить.
Кстати буллет не тот движок чтобы обновлять, обычно выбирают одну версию на весь цикл разработки проекта.
Обычно раз есть исходники, можно самому допиливать и добавлять нужные возможности.

mr.DIMAS 14.10.2014 01:55

Ответ: [TrueHorror] - разработка
 
Медия уже сильно поменялась, изменились многие конфиги... кароч чтоб тебе собрать и запустить нормально нужно тебе кидать всю рабочую папку - это почти 1,5 Гб.

Кароч, если у тебя есть скайп можешь мне написать, я скину свежую версию. мой скайп xcoolmrdimas

mr.DIMAS 15.10.2014 00:31

Ответ: [TrueHorror] - разработка
 
Че сделал:

1) Сохранение\загрузку уровня. Соответственно быстрое сохранение\загрузка тоже есть. Игра сохраняется при выходе. Чек поинты делать не буду - слишком казуально.
2) Всё :-D

Сделать сохранение\загрузку оказалось не такой простой задачей. В общем потратил кучу времени, но все равно остались некоторые мелкие баги не влияющие на загрузку\сохранение.

Потестировать можно будет когда я сделаю еще один уровень и доделаю предыдущие уровни.

Впрочем кто шарит C++ может глянуть репозиторий на GitHub'e у меня в подписи.

Mr_F_ 15.10.2014 00:42

Ответ: [TrueHorror] - разработка
 
по концепции расскажи вкратце как делал сейв/лоад?
в шарпе мне дико помог встроенный в язык Reflection, но я каждый раз содрогаюсь при мысли о том, как бы я это реализовывал на С++.

mr.DIMAS 15.10.2014 01:03

Ответ: [TrueHorror] - разработка
 
Делал "в лоб".

При сохранении:
1) Сохраняем данные чилдов корня уровня. Пишем имя чилда( у всех объектов в двиге всегда уникальные имена ), пишем позицию, поворот, виден\скрыт.
2) Сохраняем позицию игрока, и все его параметры - это около 50 переменных.
3) Сохраняем предметы. Пишем имя объекта к которому привязан предмет( нода предмета загружается вместе с уровнем ). Пишем параметры предмета.

Ну и в таком духе все остальное делаем.

При загрузке:
1) Читаем имя чилда. Находим его в сцене( глобально ). Читаем все его параметры.
2) Читаем позицию игрока, читаем его параметры.
3) Читаем имя предмета. Находим указатель на предмет по имени предмета( да, вот такой оверхед, но зато просто ). Читаем параметры предмета, и суем их по указателю в сам предмет.

Теперь объясню почему именно так. Если при загрузке сейва уровень_N не создан, то создается дефолтный уровень_N - при загрузке создаются все предметы, двери, и прочее прочее, затем уже происходит загрузка самого сейва и возвращение всех параметров объектов. То есть всегда гарантируется наличие всех объектов на дефолтном уровне_N.

Быстрое сохранение\загрузка работают очень быстро - 10 мс. Кароч моментально загружается\сохраняется.

Возможно для игры другого типа этот подход не прокатит. Особенно если объекты создаются динамически. У меня так просто получилось именно из-за наличия фиксированного числа объектов на каждом уровне.

Можно глянуть сурсы на гитхабе - сначала можно посмотреть SaveWriter\SaveLoader затем у каждого сохраняемого объекта есть метод Serialize\Deserialize

Mr_F_ 15.10.2014 01:08

Ответ: [TrueHorror] - разработка
 
я у себя в игре задолбался с динамически создаваемыми объектами, большинство глюков выходило именно из-за них. в результате по максимуму зарезервировал в сцене важные сложные объекты типа всех приезжающих копов, их машин, чтобы они всегда чётко были одни и те же.

у меня трабла значительная была ещё с тем, что переменных просто миллион, каждый нпс в себе содержит добрую сотню их, а завтра я могу добавить ещё какой-нибудь float timeToStopShoutingAtDogsWhoShitUnderTrees, и мне ещё это добавлять в сейв/лоад?! а у каждого нпс с уникальным поведением/диалогами - ещё свои переменные. так что необходимо было мутить универсальную систему, которой не нужно знать ничего более имени класса, руками перебирать я бы просто обосрался.
и вот в С++ думаю разве что кодогенератором сделал на основе существующих хидеров с переменными.

mr.DIMAS 15.10.2014 01:12

Ответ: [TrueHorror] - разработка
 
Можно сделать как в кваке сделано. Там есть тип cvar_t, им можно рулить из консоли( если играл, поймешь о чем я ). И есть общий список всех таких переменных
Пример его использования
PHP код:

cvar_t    sv_gravity = {"sv_gravity","800",false,true}; 

Может я говорю очевидные вещи, но можно взять шарповский аналог сишного map. Возможно это будет слишком жирно, но удобство пользования подкупает.


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

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