Навигация
Поддержать материально
Steam Greenlight

Логотипы
Медальки
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Темы форума
187 - Bullet Heaven
Вчера, 20:39
 Mefistofel
187 - ?
21.11.2024
 Dan
Galactic Showdown -…
21.10.2024
 KregHek
Новый IGDC
5.08.2024
 rimush
186 - Strategy!
15.07.2024
 VoroneTZ
WoL
3.07.2024
 Darthman
Привет выжившие
21.05.2024
 GeePee
185 - RPG
9.02.2024
 Vaskrol
В каком банке открыт…
24.01.2024
 Darthman
185 - ?
30.12.2023
 Mefistofel
Сейчас на сайте
Гостей: 14
На сайте нет зарегистрированных пользователей

Пользователей: 1,790
новичок: Durved
Обсуждение «Здесь могла бы быть ваша реклама»
Страница 1 из 3 1 2 3 >
MysticCoder
Avatar пользователя

Опубликовано 04.06.2015 03:41 (9 лет назад)    #
Итак, я подумал и решил, что стоит мне завести здесь тему для моего небольшого пока проекта. Вернее, проектом назвать это сложно, т.к. из всего имеется только небольшая идея в каком направлении двигаться и небольшие наработки. Геймдизайнер из меня хреновый ввиду недостатка фантазии и творческого начала, посему, буду делать то, что лучше всего у меня получается, а именно код. Также, буду выкладывать сюда прогресс, возможно, даже больше одного раза :D А может и заброшу) Ну а направление движения кодописания буду корректировать находу с учетом или неучетом желающих.
Что могу сказать о проекте сейчас.... хочу сделать это тактическим шутером, есть карта с непроходимыми блоками и кустами, есть какие то юниты на этой карте. Графика продолжительное время будет условной ввиду отсутствия карманного раба-дизайнера.
To be continued... maybe...
Bullet Heaven:Не участвую.
ZblCoder
Главный Говнюк
Avatar пользователя

Опубликовано 04.06.2015 06:51 (9 лет назад)    #
Такими сообщениями, тебе не привлечь инвесторов!
Bullet Heaven:Не участвую.
Ignis
Копробарон
Avatar пользователя

Опубликовано 04.06.2015 08:19 (9 лет назад)    #
ГИблое это дело. Я свою темку просрал. Надо откапывать. Но желаю удачи)
Bullet Heaven:Не участвую.
slAvIk159
Avatar пользователя

Опубликовано 04.06.2015 08:20 (9 лет назад)    #
ZblCoder написал:
Такими сообщениями, тебе не привлечь инвесторов!


ага, нужно было сразу писать что делаеш Call of Battlefield... а лутше Call of Battlefield: Z

Bullet Heaven:Не участвую.
MysticCoder
Avatar пользователя

Опубликовано 04.06.2015 09:23 (9 лет назад)    #
Я ведь не инвесторов ищу, а рекламодателей :D
Вообще, планирую в виде статей расписывать чего я делаю, кто то может полезное для себя чего нить почерпнул) было бы хорошо как то возможностей оформления добавить, ну или хотя бы тег [/code] сделать нормально, чтоб читаемый код получался с отступами.
Bullet Heaven:Не участвую.
ZblCoder
Главный Говнюк
Avatar пользователя

Опубликовано 04.06.2015 09:27 (9 лет назад)    #
а это что такое?
Я есть код!
А я отступ

мдя, не пашет

редакция от ZblCoder, 04.06.2015 09:28

Bullet Heaven:Не участвую.
MysticCoder
Avatar пользователя

Опубликовано 04.06.2015 09:49 (9 лет назад)    #
Начало.

Не так давно мне в голову пришла идея, а что если сделать World of Tanks только про людей? Мне нравилось в танках играть за светляка - стоять в кустах и без палева передавать координаты врагов союзникам, либо делать это у всех на виду маневрируя и скрываясь в укрытиях. Отсюда пошли первые пожелания к игре:
1) Это должен быть кооперативный тактический шутер на один раунд как контра либо танки.
2) Должны быть элементы стелса в виде обзора, маскировки, кустов, etc
3) это должна быть 2d игра(физика и логика 2д, графика вполне может быть трехмерной), т.к. на освоение 3d физики и геометрии тратить время и силы не шибко хочется.
4) вместо танков - люди, соответственно, свои особенности в виде ходьбы, бега, позы и прочее. гранаты, да.
5) ну и всякая прокачиваемость навыков, покупка оружия и прочие плюшки между боями

Немного про класс юнитов.
Я решил применить компонентный подход для юнитов. Если кто не знает, это когда логика класса разделена по своим ролям на другие классы. Т.е. вместо того чтобы хранить координаты, имя, счет в банке и прочие данные и поля юнита скопом в одном классе в виде полей мы распределяем их по составляющим подчиненным классам. Один подчиненный класс, допустим, будет отвечать за физику, другой за звук и так далее. Одним из плюсов такого подхода является его гибкость и возможность комбинировать, буквально конструировать юнита из разных частей. Теоретически, для того чтобы сделать летающего орка с голосом котенка, в последующем можно будет написать всего одну строчку типа
Orc := TUnit.Create(TPhysicFly, TGraphicOrc, TSoundCat);
круто, да? вот и я так подумал.... Чтобы было удобно обращаться этим компонентам друг к другу внутри юнита(например, графическая компонента отрисовывает модель в координатах указанных в физической компоненте), я добавил ссылки на каждую компоненту в класс базовой компоненты. Также чтоб не парится закинул туда ссылки на карту и таймер. Все эти ссылки заполняются динамически от родителя к чайлду. Это все для того, чтобы не было каких либо глобальных переменных, а была замкнутая внутри себя система. У меня объявление класса юнита выглядит сейчас так:

T_Unit = class
Timer : T_Timer; // ссылка на игровой таймер, один на всех
Map : T_Map; // ссылка на карту
Bases : TObjectList; // список базовых частей
Logic : T_LogicBase; // логическая часть, заполняется динамически из списка Bases
Physic : T_PhysicBase; // физическая часть, заполняется динамически
Graph : T_GraphBase; // графическая часть, заполняется динамически
constructor Create(ABases : array of T_Base); virtual; overload; // в конструктор передаем любое количество частей составляющих юнита
constructor Create(ABases : array of T_BaseClass); virtual; overload; // либо передаем не экземпляры, а сами классы
procedure Init;
procedure Update; virtual; // в Update выполняется Update для всех частей
procedure Draw; virtual; // в Draw выполняется Draw для всех частей
end;


Сейчас у меня выстрел формируется вызовом Shoot := T_Unit.Create([T_PhysicShoot, T_LogicBase, T_GraphBase]);
а юнит вызовом xUnit := T_Unit.Create([T_PhysicUnit, T_LogicUnit, T_GraphUnit]);
Насколько это удобно? - Покажет время, а сейчас у меня пока не так много разных игровых классов, чтобы оценить.
Bullet Heaven:Не участвую.
pelmenka
Avatar пользователя

Опубликовано 04.06.2015 10:54 (9 лет назад)    #
Где форматирование? Где отступы? Где подсветка синтаксиса?
Bullet Heaven:Не участвую.
Ignis
Копробарон
Avatar пользователя

Опубликовано 04.06.2015 11:37 (9 лет назад)    #
Идея не нова. И лучше применяй полностью компонентный подход или декораторы. Сильно задумаешься над архитектурой и красивым кодом и забудешь об игре. Старайся сначала сделать прототип а потом делать игру.
Bullet Heaven:Не участвую.
ZblCoder
Главный Говнюк
Avatar пользователя

Опубликовано 04.06.2015 11:56 (9 лет назад)    #
Пользователю приложения пофиг какой код, главное, что бы работало!
Bullet Heaven:Не участвую.
AtomKrieg
Avatar пользователя

Опубликовано 06.06.2015 21:13 (9 лет назад)    #
"Я решил применить компонентный подход для юнитов. Если кто не знает, это когда логика класса разделена по своим ролям на другие классы."

Идею из Unity3d взяли?
Bullet Heaven:Не участвую.
Shirson
Avatar пользователя

Опубликовано 07.06.2015 06:55 (9 лет назад)    #
Скорее Юнити эту идею взяла у Дельфи.

редакция от Shirson, 08.06.2015 02:29

Bullet Heaven:Не участвую.
MysticCoder
Avatar пользователя

Опубликовано 07.06.2015 09:00 (9 лет назад)    #
Идею почерпнул в статье на геймдев ру. Про юнити знаю только то, что она существует, но если идея кажется с3.14зженной из юнити, то можете считать, что так и есть.
Чуть позже напишу немного про поле зрения и кусты, запишу немного видео.
Bullet Heaven:Не участвую.
AtomKrieg
Avatar пользователя

Опубликовано 07.06.2015 10:43 (9 лет назад)    #
Компонентный подход штука хорошая. Но реализация (так как она описана) мне кажется странной. Зачем TSoundCat наследовать от TSoundBase? Тут же просто набор звуков должен быть:
SoundCat: TSound;
SoundCat.Init("meow.xml");
World.SoundManager.AddKeyValue("SoundCat", SoundCat);

Если пойти дальше: FlyingCatOrc.Init("fco.xml");
Ну и если пойти совсем дальше, то Map.Init(level.ToString()+".xml"); и внутри уже у вас летающие мяукающие орки и и прочий трэш :)

В GameObject не нужны Draw, Update. Просто где-то в GameLevel должны быть ArrayLogics, ArrayPhisics, ArrayGraphics. И при GameLevel.Update делается update для всей логики и физики. А в GameLevel.Render делается draw для всех графики. Добавлять виртуальную функцию draw для логики - бессмысленно же.

Реализовывал небольшую игру через компоненты и пришел к выводу что полиморфизм и наследование идут лесом при использовании компонент. Возможно, такое впечатление из-за маленького размера проекта. Там где наследование не убиралось компонентным подходом, применил шаблоны.

PS. http://gameprogrammingpatterns.com/component.html
Bullet Heaven:Не участвую.
MysticCoder
Avatar пользователя

Опубликовано 07.06.2015 11:28 (9 лет назад)    #
Насчет TSoundBase... Просто набор звуков может быть и прокатит в простой игрушке, в более менее сложных проектах уже добавляются всякие условия для воспроизведения звука, типа если долго ничего не говорили, то произнести какую нибудь шутку. И логично эту логику для звука вынести в отдельный класс. В прошлом году я делал BattleChat для одной космической стратегии. В игре в боевке летали корабли, атаковали противника, лазеры, ракеты, кооперация между собой и прочее. Ну а BattleChat должен был создавать реалистичное звуковое окружение радиопереговоров между кораблями.
Типа:
"-Атакую!"
"-Понял, прикрываю"
"-Не пробил, нужна пушка побольше!"
В общем, если бы там был просто набор звуков, то в активном бое получилась бы полная неразбериха, каждый корабль кричал бы что то свое в радиоэфир и разобрать в этом хоть что то было бы весьма проблематично. Так что, какая то логика для управления звуком должна быть.

Насчет массивов физики, графики и логики - мысль понятна. Это легко можно добавить, но сейчас не будем усложнять код)
Ну а касательно того, что у Logic есть метод Draw - так это сделано из соображений, что разделение модулей на логику, графику, звук, физику - весьма условно и нужно только для программиста, на общем уровне есть только набор модулей, а что у них внутри - это уже второстепенный вопрос. Только некоторые модули должны обновляться при игровом тике, а другие при отрисовке кадра. Поэтому и сделал и Update и Draw для T_Base. К тому же таким образом можно объединить функции двух модулей в одном если очень захочется, например не заводить отдельный модуль для TSoundCat для добавления единственного звука "Meow", а встроить в TLogicCat.
Bullet Heaven:Не участвую.
MysticCoder
Avatar пользователя

Опубликовано 07.06.2015 12:30 (9 лет назад)    #
Зрение.
В тактическом шутере да и в шутере вообще очень важным является обзор, и если в трехмерном FPS игрок видит то, что видно на экране, то в двухмерном шутере с видом сверху надо искусственно ограничить обзор игрока. Обычно это выглядит как фонарик в руках героя в темном месте.
Для своего случая я ввел следующие характеристики: Дальность обзора, Направление взгляда, Угол обзора, Маскировка. Первые три вместе дают нам некоторый сектор видимости. Маскировка - действует на дальность обзора врага, например, юнит с маскировкой 0.5 будет виден для врага с дальностью обзора 50м подойдя на расстояние 25м.
Не будем забывать, что игра происходит не в открытом поле, а на карте, которая будет влиять на наш обзор. Копировать систему зрения как в танках будет не шибко правильно, думаю. Поэтому сделал по своему. Для каждой ячейки карты я добавил параметр LightPassPower, характеризует сколько силы света надо потратить, чтобы преодолеть эту ячейку. Так у стенки LightPassPower = 1.0, значит при столкновении со стенкой луч света дальше не летит, расходуя всю оставшуюся энергию, у кустов - 0.6, так если у света оставался запас хода в 30 метров, то после куста запас хода останется 30*(1-0.6) = 12м.
В общем, мне нравится такая система обзора, остаются только сомнения насчет маскировки, стоит ли оставить её влияние таким как сейчас, либо сделать её влияние не в процентах от обзора а в фиксированной величине, типа маск-халат дает -20 метров обзору врага. Либо сделать и то и то.
Посмотреть получившееся, наглядно можно в этом видео:
Bullet Heaven:Не участвую.
MysticCoder
Avatar пользователя

Опубликовано 18.06.2015 21:06 (9 лет назад)    #
Сегодня весь день занимался сетью, а именно, передачей карты. Долго думал делать ли солянку из UDP + TCP или оставить только UDP. Решил остановиться на UDP ввиду того, что связь нынче почти везде стабильная, потерь пакетов и искажений обычно нет. Передачу карты сделал при первом пакете от клиента. Сделал поток для сокета, в потоке чтение всех поступивших пакетов - вызов каллбека на каждый пакет, далее посылка всех исходящих пакетов.
При размере карты 100х100 появились первые глюки, а именно карта загружалась неполностью, пакеты явно не доходили. Поломав немного голову, понял, что записываю данные карты в потоке сокета в каллбэке, т.е. паралелльно никто эти данные не отправляет, они отправляются потом всем скопом в том же потоке. Клиент их не успевает все забрать и они теряются.
Ввиду этого решил отказаться от каллбэков, выделил кучу буферов, в которые сокет будет писать пакеты, приложение в любой момент может забрать очередной пакет вызовом типа GetNextPacket и обработать его. Карта стала передаваться клиенту нормально, на этом хотел было остановиться, но решил потестить на размере 1000х1000. Как и ожидалось, полезли глюки - карта стала загружаться процентов на 5 от силы. Посчитав размер данных, а их оказалось по 27 байт на ячейку карты, итого около 27 мегабайт, пришел к выводу, что не резон их все сразу пихать в сокет, т.к. 27 мбайт отправляться то отправляются за небольшое время, но мой adsl их за такое короткое время принять ну никак не сможет. Пока поставил задержку небольшую, но потом надо как то внедрить в обертку сокета шейпер трафика. С задержкой карта принялась нормально, потестил на vps со связью через adsl.
Bullet Heaven:Не участвую.
AtomKrieg
Avatar пользователя

Опубликовано 19.06.2015 05:06 (9 лет назад)    #
Решил остановиться на UDP ввиду того, что связь нынче почти везде стабильная, потерь пакетов и искажений обычно нет.

Если будет искажение, что станет?
Bullet Heaven:Не участвую.
MysticCoder
Avatar пользователя

Опубликовано 19.06.2015 07:46 (9 лет назад)    #
В худшем случае клиент вылетит с ошибкой, в лучшем ничего плохого не произойдет. Серваку должно быть по барабану, т.к. на серваке исповедую принцип не доверяй клиенту ни в чем и все данные должны там проверяться. Да и большая часть данных будет идти от серва к клиенту.
Bullet Heaven:Не участвую.
MysticCoder
Avatar пользователя

Опубликовано 06.07.2015 12:18 (9 лет назад)    #

редакция от MysticCoder, 06.07.2015 12:19

Bullet Heaven:Не участвую.
Страница 1 из 3 1 2 3 >
Перейти на форум:
Конкурсы
Открытые конкурсы:
Bullet Heaven

Старт: 23 ноября 2024г.
Финиш: 4 декабря 2024г.

Участники: 4
Недавние конкурсы:
 186 - Strategy
 185 - RPG XII
 184 - Arcade II
 183 - Novel
 182 - RPG XI
 Все конкурсы
Случайная игра
Мини-чат
Вам необходимо залогиниться.

Архив чата

26,205,645 уникальных посетителей

Создано на базе русской версии PHP-Fusion copyright © 2003-2006 by Nick Jones.
Released as free software under the terms of the GNU/GPL license.