|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.03.2009, 14:36 | #51 | |
Участник клуба
Регистрация: 29.01.2008
Сообщений: 1,039
|
Цитата:
|
|
27.03.2009, 14:52 | #52 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Вадим Буренков, смотрим твой код:
Код:
Procedure LoadMem = Procedure LoadBot = Procedure LoadTree Procedure FreeMem = Procedure FreeBot = Procedure FreeTree Procedure CreateEnemy = Procedure CreatePers = Procedure CreateTree procedure DestroyEnemy = Procedure DestroyPers = Procedure DestroyTree procedure DrawEnemy = procedure DrawBot = procedure DrawPers = procedure DrawTree Сколько нужно прописать процедур? ...так уж ли они разнятся? ...есть ли в них зерно универсальности? ...что нужно сделать, чтобы заполнить карту разнотипными объектами, вызвать с каждого класса по одной процедуре? Сразу следует думать вперед шагов на десять. Предполагая большое множество объектов, задать им такой тип, чтобы было легко работать как с персонажами, движущимися объектами, так и со статичными, тогда проблемы со стыковкой и лишней писаниной вам не грозят. Достаточно поменять параметры в файле для конкретного объекта, в игре он отобразиться и будет действовать по написанному шаблону, используя общий фундаментальный алгоритм изменения своего состояния.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 27.03.2009 в 14:56. |
27.03.2009, 18:30 | #53 | |||
Участник клуба
Регистрация: 06.03.2009
Сообщений: 1,346
|
Цитата:
Цитата:
Цитата:
Каждый из ниж отвечает за свое. Мне это не мешает. Зачем использовать какой-то один?Теперь я просто занимаюсь гибкостью классов. Например в последней версии игры я изменил процедуру создания TEnemy.LoadMem; на TEnemy.LoadMem(Path:string);, где Path-путь для изображения врага.Это дает мне возможность для создания врагов различных видов. Последний раз редактировалось Вадим Буренков; 27.03.2009 в 18:49. |
|||
28.03.2009, 00:28 | #54 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Если все делать просто, то все классы TEnemy, TWeapon и TAmmo - суть, составные части одного. В нем: тип объекта, подтип объекта, флаги состояния, указатели на анимацию, очки жизни, брони, оружия, его тип, патроны и пр. пр. пр. Это все относится к одному юниту. Мы же не будем в отдельном массиве хранить оружие или патроны к нему, и указатель на массив в котором сам юнит - владелец этого? Допустим, у нас есть база данных с оружием, достаточно выдернуть из не нужное и записать в класс (будем так называть) юнита как: оружие есть, тип такой-то, радиус атаки такой-то, количество патронов тут же. Тогда в цикле перебирая очередной объект определяем его тип, понятно как с ним работать, тут же все записи не "отходя от кассы", применяем общие процедуры и функции. Лично я уже намучился с гибкостью, просто режу все на корню, стереотипы "правильного программинга" через гибкие классы - утопия. Во всем нужно искать рациональность.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
28.03.2009, 13:52 | #55 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
ООП или не ООП? Вот в чем вопрос! (новичкам рекомендуется прочитать)
О чем тут вообще спорить? В классах суть в инкапсуляции т.е. в сокрытии кода. Разница с записями в том, классы помимо свойств имеют еще методы обработки этих свойств, но в последних версиях языка Delphi записи также могут иметь методы, так что теперь особой разницы между ними по сути и нет. (Если говорить о переменных, то разница у них в том, что переменная объекта содержит ссылку на объект, а переменная записи содержит саму запись) Код то игровой на самом деле остается один и тот же. Просто там он будет скрыт в реализации класса, а тут он на виду в методах формы, или просто в процедурах.
Другое дело если программная система сложная, тогда классы могут намного упростить разработку, например если есть множество различных врагов имеющих некоторые отличия друг от друга, достаточно унаследоваться от общего типа врага и добавить некоторые новые свойства не переписывая повторно весь код. К примеру у нас есть базовый класс TEnemy, у всех врагов есть такие свойства, как жизнь, сила и т.д. общие для всех врагов. И есть класс наследник - TGoblin, в нем свойства и методы общие с предком, повторно описывать нет нужды, а только его отличительные свойства, например уровень вони =) От TGoblin можно унаследовать класс TCrazyGoblin к-рый может отличаться всего лишь одни свойством CrazyLevel. Таким образом получаем иерархию классов. Польза от всего этого начинает ощущаться в больших, сложных проектах, в остальных случаях большой разницы как делать нет. Пользователю и подавно все равно, он когда давит на гашетку, не задумывается в кого он стреляет, в объект или в запись =) Также бывает полезным другое свойство объектов - инкапсуляция, когда все эти массивы и методы их обработки находятся внутри класса и достаточно вызвать метод, а не перегружать код множеством строк с реализацией алгоритмов, а потом сам фиг разберешься в этих завалах. Но конечно же в любом случае, тут или там, в классе или в отдельных процедурах, но тот же самый код реализации написать придется, классы просто предоставляют больше удобства, на один уровень абстракции выше.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
28.03.2009, 14:41 | #56 |
Участник клуба
Регистрация: 06.03.2009
Сообщений: 1,346
|
Beermonza, а ты не мог бы показать как лучше было бы составить код игры(можно схематично)
|
28.03.2009, 16:26 | #57 | |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Подробнее...
Цитата:
Допустим возьмем пример из стратегии. На первый взгляд какое сходство здания с воином? ...графически разное, вроде свойства разные, а модель почти одинаковая, нужна лишь пометка "здание" или "человек". У них у обоих есть тип, есть подтип. Это нужно для выдергивания из базы данных нужных параметров. У обоих есть индекс на анимацию, оба имеют координаты в пространстве, у обоих есть количество жизней. Тут можно сказать "а оружие?", вспоминается Империя 2, здание тоже может стрелять, тоже есть радиус обзора, атаки. А если не может, то параметр, отвечающий за наличие атаки, отрицательный. Процедуры и функции. В итоге у нас есть один массив созданного нами универсального типа, в котором по мере появления на карте индексов объектов, или простой ввод юнитов в игру, обрабатывается каждый. Есть условие, если объект не здание, то применить процедуру ObjMove, если не человек - пропустить. Т.е. есть фильтр, просматривающий содержание указателей в типе объекта, и в зависимости от этого разрешает выполнить определенную процедуру, но опять же от состояния флагов в типе: переменные Boolean двигается действует погибает получает урон появляется исчезает ...их значения определяют, что с ними должен делать движок. Нужно описать универсальный объект набором таких "флагов". Понятно? Так же есть флаг "используется", т.е. мы загрузили объект когда он был нужен, а как ушли с зоны где он располагался, просто помечаем, что объект не используется (UUses := False), цикл обработки просто пропустит этот объект. Как только объект снова нужен (вернулись назад по карте), индекс объекта на карте снова возвращает его в обработку. Набор процедур: двигаться действовать гибнуть получать урон появляться исчезать Как видно, те же самые, что и флаги. На вход требуют параметры позиционирования, радиуса обзора, наличия оружия, брони и пр. На выходе изменение состояния (запись во флаги новых состояний). "Получает урон" - процедура, требующая номер объекта в массиве, все флаги распределяться так: двигается = нет, действует = нет, погибает = нет, получает урон = да, появляется = нет, исчезает = нет. Собственно мы не трогаем флаги, кроме "получает урон". Это то же самое что и в Quake: +forward, -forward, +moveleft, -moveleft, +attack, -attack, ...просто вкл/выкл. Это очень удобно. Общая структура в словах. Есть база данных параметров всего, есть фильтр обработки этих параметров, есть один тип с набором записей, есть стандартный набор процедур и функций. Гибкость достигается усовершенствованием фильтра обработки параметров и добавлением новых флагов состояния в тип объекта. Разумеется кроме объектов в игре есть иные типы, это интерфейс, шрифты, управление, ...они отдельные.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 28.03.2009 в 16:30. |
|
28.03.2009, 17:19 | #58 | |
Участник клуба
Регистрация: 06.03.2009
Сообщений: 1,346
|
Но ведь не обязательно делать игры таким образом? Можно получить рабочий легко изменяемый код другим образом, например наследованием:
Код:
Цитата:
Предлагаю завершить разговор по этой теме здесь.Лучше создать новую тему если надо. Последний раз редактировалось Вадим Буренков; 29.03.2009 в 17:29. |
|
30.03.2009, 12:20 | #59 |
Участник клуба
Регистрация: 06.03.2009
Сообщений: 1,346
|
Вот нашёл несколько анимаций,только они все по одному файлу.Ты смжешь использовать их?
Выкладываю новую версию и ресурсы к ней (ресурсы отдельно чтоб каждый раз не выкладывать) Нововведения: 1)Появилась коллизия 2)3 типа врагов (3-ий вид часто глючит ) 3)У врагов появились жизни а у оружия сила урона 4)Появился звук. 5)Лазер пробивает врагов насквозь 6)Иконка выбранного оружия на панеле. 7)Оптимизация движка. 8)Исправлено два бага. Последний раз редактировалось Вадим Буренков; 30.03.2009 в 14:17. |
31.03.2009, 15:08 | #60 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Вадим Буренков, я ни на чем не настаиваю, ...просто со временем, когда игра будет во много раз масштабнее, ты поймешь всю прелесть одного единственного типа на объекты игры.
Послесловие: ...кто сказал что персонажем игрока должен управлять только он сам? ...бывает требуется отдать его под власть ИИ и наоборот.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Моя первая программа | igroman | Софт | 27 | 12.03.2009 20:23 |
моя первая програма... | maziLa | Общие вопросы C/C++ | 7 | 12.03.2009 08:14 |
Моя первая программа)) | Dr.Badnezz | Софт | 9 | 06.12.2008 14:39 |
Моя первая и последняя игра. | BangBangFM | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 13 | 05.12.2008 22:12 |
Моя первая программа | NikLik | Софт | 4 | 20.07.2008 00:24 |