Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2009, 00:04   #101
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Данные менять можно везде, а вот что можно изменить взаимотношения между классами, хоп предка вниз, потомка наверх, короче изменить дерево я честно сказать не знал.
Ну в делфях/С++/... нельзя, а в отдельных языках можно и для отдельного объекта (не класса, а именно объекта) добавить методы и свойства во время исполнения
Ну да я собственно этого и не предлагал
Цитата:
Сообщение от Beermonza Посмотреть сообщение
Ну, если взять игры, где берется тип корпуса, тип башни, и навешиваются оружия, то ни о каких классах "T-90" со стандартами внутри в коде речи быть не может.
Ну это то оно понятно, что для каждого юнита не катит классы сочинять.
В классы я бы выделил практически все свойства юнитов.
Например, у Вас где идёт расчет защиты, которая броня даёт? Думаю, что где наносится повреждение юниту, там и вбита формула (если так, то будет дублирование кода), ну или может в каком-то модуле где-то функция есть соответствующая. В общем найти этот расчет брони будет не так просто.
Если же создать класс ТБроня, то в нём будут сосредоточены и параметры брони и расчет защиты. Если вдруг решили, что-то у брони изменить, то вот она вся в одном месте и нигде лазить не надо.
Цитата:
Сообщение от Beermonza Посмотреть сообщение
В сущности, мой метод аналогичен реляционной модели базы данных, доступ есть в любое место данных, можно скрестить поезд с носорогом, не заглядывая в код.
В сущности на классах будет то же самое, только вместо вашего (я по крайней мере думаю, что примерно так у Вас):
Код:
нарисовать(текстуры[танк.ТипЮнита]);
1. всюду обращение к глобальной переменной
2. изменение способа хранения текстур повлечет за собой изменения по всему коду

будет такое:
Код:
танк.текстура.нарисовать;
совершенно пофиг чего там и как хранится и никакие глобальные переменные не нужны.
Цитата:
Сообщение от Beermonza Посмотреть сообщение
По сути выходит универсальный движок.
И сильно универсальный? прям вот можно n оружия на танк поставить, сделать разные параметры для лобовой, боковой и задней брони юнита и чтобы он еще вдобавок летал, пел и матерился?
Наличие такой структуры как GUnit уже ограничивает универсальность до предусмотренной Вами. Причем тут уже: шаг влево, шаг вправо - расстрел.

Допустим, у нас на карте могут быть следующие объекты: ящик, человек, автомобиль, танк.
Для ящика у Вас много лишней информации: скорость передвижения, броня,...
Для автомобиля не хватает: радиус поворота
Упираемся в универсальность? Либо добавлять радиус поворота в GUnit, но тогда для ящика еще больше лишнего станет и все файлики конфигурации править придется, т.к. новое свойство появилось.

Я же предлагаю:
Код:
ТОбъект = класс
  позиция
  текстура
...
конец;

ТДвигающийсяОбъект = класс (ТОбъект)
  скорость
...
конец;

ТЮнит = класс (ТДвигающийсяОбъект)
  броня
  оружие
  здоровье
  скорость
...
конец;

ТТехника = класс (ТЮнит)
  радиус поворота
...
конец;
Иерархия такого уровня врядли изменится. Ну разве что танки летать начнут, а этого не учли.

Так вот... впоследствии смотрим файл конфигурации наш и видим, что дальше идёт бочка. Соответственно создаём её как объект ТОбъект. Человек соответственно будет ТЮнит, а автомобиль и танк - ТТехника.
Ничего лишнего нигде не хранится. Всё только нужное Ну и виртуальные функции спасут от кучи if/else (алгоритм поиска кратчайшего пути и ИИ в скрипты всёже не засунешь наверно)
А самое замечательное - никакого дублирования кода и в случае чего расширяются возможности на ура: нового наследника создали и лепи себе новых юнитов на здоровье (при этом старых не нужно менять и соответственно заново тестировать)
ЗЫ. Лучше потратить больше времени на проектирование, чем на последующие тестирование и поиск багов
pu4koff вне форума Ответить с цитированием
Старый 06.06.2009, 00:25   #102
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Год работает, можно сделать ресурсы танка, прицепить на самолет, и обратно, танк будет летать, самолет ползать по земле, никакого дублирования, у меня с этим жестко ))) ...а вот автор топа копировал на права и налево. Время нас рассудит.
На счет формул, то там все изменяется. Я в код не лезу практически, только меняю характеристики сейчас, ...ну и улучшаю по мере надобности, когда все предусмотрю в компакте, то будет 2D движок с внешним управлением. Вот еще сеть - долгая песня, так что все силы брошены туда.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 06.06.2009, 10:48   #103
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Год работает, можно сделать ресурсы танка, прицепить на самолет, и обратно, танк будет летать, самолет ползать по земле, никакого дублирования, у меня с этим жестко ))) ...а вот автор топа копировал на права и налево. Время нас рассудит.
Ну это пока Вы активно разработку ведёте и всё помните что где и как делается. На полгодика если забросить работу над двигом и решить потом пару формул изменить, то ситуация, думаю, несколько изменится. Разве что документация не на каждой строчке
Еще одним преимуществом активного использования ООП - можно жестко задать, какие данные можно изменять, а какие только на чтение.
Ваш же подход требует от программиста внимательности. Чтобы не:
Код:
танк.позицияХ := 10;
танк.позицияY := 20;
писал, а обязательно:
Код:
переместить(танк, 10, 20);
грубо говоря.
А если где-то всёже по ошибке изменит эти координаты, то внешне для игрока танк будет в одном месте (ведь не нарисовался танк в новой позиции, т.к. соответствующая функция не была вызвана), а игра будет "думать", что в новом месте уже танк.
pu4koff вне форума Ответить с цитированием
Старый 06.06.2009, 15:47   #104
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Ну мы люди грамотные, и понимаем, что комп не может думать, он просто перебирает данные ))), да и "инакомыслить" ему процедуры не дадут. А если сбой? ...так он и в Африке сбой, и классовая система полетит.
Еще в чем дело, ...данная систем полностью соответствует логике нормально-образованного человека, даже того, который не программировал ранее, но понимает логику процессов, мыслит "блоксхемно". Я как-то отставлял проект, вернувшись ничего не забыл, все логично до безобразия, и переменные названы по правилам.
В любой момент я посылаю пакет:
Код:
UnitsMas[i].GTPosX := 10;
UnitsMas[i].GTPosY := 10;
UnitsMas[i].GTPointX := 40;
UnitsMas[i].GTPointY := 40;
все! ...юнит поехал, ничего больше не нужно, плюс синхронизация, где он был, ..это очень удобно в ММО.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 06.06.2009, 16:29   #105
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Ну мы люди грамотные, и понимаем, что комп не может думать, он просто перебирает данные ))), да и "инакомыслить" ему процедуры не дадут.
Дадут. Данные совершенно никак не защищены. Можно написать:
Код:
UnitsMas[i].GTPosX := -100;
и где эта ошибка потом в итоге всплывёт не известно. В классе же запрятали всё по свойствам и get/set методам и выдаём себе исключение, если неположенное значение записываем или еще как поступаем.
Цитата:
Сообщение от Beermonza Посмотреть сообщение
Еще в чем дело, ...данная систем полностью соответствует логике нормально-образованного человека, даже того, который не программировал ранее, но понимает логику процессов, мыслит "блоксхемно".
Мне классы понятнее. Вижу класс Танк и понимаю, что в нём всё про танк написано. Вижу метод "ехать" и понимаю что при вызоке его танк поедет и всё в этом духе. При Вашем подходе танк отдельно, операции, производимые над ними отдельно и всё это размазано по разным модулям.
Цитата:
Сообщение от Beermonza Посмотреть сообщение
Я как-то отставлял проект, вернувшись ничего не забыл, все логично до безобразия, и переменные названы по правилам.
Помните, что если состояние танка = 0, значит он стоит, а если 5 - значит едет, а при 666 - подбит? Или то, что после изменения позиции танка, нужно обязательно вызвать вот эту функцию вот с этим параметром, а то будет плохо? Хотя может у Вас код так хорошо организован и прокомментирован, так что спорить не буду
Цитата:
Сообщение от Beermonza Посмотреть сообщение
В любой момент я посылаю пакет:
Код:
UnitsMas[i].GTPosX := 10;
UnitsMas[i].GTPosY := 10;
UnitsMas[i].GTPointX := 40;
UnitsMas[i].GTPointY := 40;
все! ...юнит поехал, ничего больше не нужно
В один прекрасный момент забыли послать пакет, а значения изменили. Что будет?
На классах я напишу: танк.езжай_сюда(х, у); и больше не надо ничего никуда слать, всё, что надо, где-то в недрах класса "само" произойдет.
Цитата:
Сообщение от Beermonza Посмотреть сообщение
это очень удобно в ММО.
В ММО скорее всего пересылаемая информация на сервер будет отличаться от той, которую использует клиент.
Мне нет разницы, какой кадр анимации у вражеского танка и информацию о текстурах я буду брать из своих клиентских библиотек, а не с сервера тянуть. Опять же, возможно, по логике игры я решу сделать невидимым количество жизней противника, а если их всёже слать на сервер и оттуда на другие клиенты, то возможно создание читов, т.к. пакет можно перехватить и оттуда выцепить количество жизней.
таким образом для обмена с сервером эта запись в любом случае не катит. Что на классах делать, что по Вашей методе, а придется создавать специальные структуры для общения с сервером.
pu4koff вне форума Ответить с цитированием
Старый 06.06.2009, 18:14   #106
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Спор бесполезен, ведь каждый считает что его метод вернее. И вообще какая разница?Главное чтоб программисту было удобно работать и получившийся продукт был играбелен.

Главное не переходить от спора к флуду.
Вадим Буренков вне форума Ответить с цитированием
Старый 06.06.2009, 20:21   #107
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Вот-вот, не начинайте холивар, оба подхода имеют право на жизнь, вон вся OpenGL на процедурах, и тем не менее. Я ушёл писать статью об ООП в играх на примере ремейка BattleCity, может к понедельнику успею
пыщь
JTG вне форума Ответить с цитированием
Старый 06.06.2009, 22:27   #108
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Да не разводим мы тут ничего, просто пробуем определить новичка в каком направлении работать, наше дело рассказать где как, а ему выбрать.
pu4koff, не будем трогать сеть пока, извиняюсь за "заброс удочки" в ту сторону, ...тип Byte сам по себе не принимает никаких значений кроме 0-255, это у меня часто возникало в процессе построения алгоритмов в режиме теста, сверхъестественного ничего не происходит, просто не нужно в ресурсах указывать тип состояния 666, даже если вы это напишете, то редактор ресурсов вам не даст записать такое значение, а так если мыслить, то все мы встречались с глючными картами "Heroes of Might and Migic", "WarCraft", "StarCraft" и пр. пр. пр.
"Забыть послать пакет, а значения изменить" в принципе не возможно, значения меняются только по пришествию пакета, ...стоп стоп, ...извиняюсь опять сеть ))) ...в крайнем случае, все данные меняются не в ручную а по процедурам, с родни классам и записи Tank.поехал(X,Y) у меня Перемещается(объект,X1,Y1,X2,Y2), а вот как перемещается, зависит от ресурсов, ...я же не буду писать классы: едет, летит, ползет.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 07.06.2009, 10:13   #109
Shadow_1329
Форумчанин
 
Аватар для Shadow_1329
 
Регистрация: 23.02.2009
Сообщений: 237
По умолчанию

А что насчет перемещения?
Shadow_1329 вне форума Ответить с цитированием
Старый 07.06.2009, 15:25   #110
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Почти сделал пример, сегодня еще есть время, постараюсь выложить.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создаю "тестирующую систему" для проверки задач. Программисты, нужна ваша помощь! alexfmf Помощь студентам 12 30.04.2009 20:19
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49