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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2011, 13:36   #11
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

ООП:

имеем класс клетка(в нем 5 полей - 2 координаты, проходимость, подсвеченность, ссылка на объект класса(родителя) воина ), и соответственно массив их по координатам. Имеем класс-родитель воин, в котором описываем метод отрисовки (лучше абстрактный, см. про абстрактные методы в справке по ООП), метод движения, самый простой, только получающий 1 единственную ссылку на клетку, куда переходит воин, метод проверки клеток(содержит операцию присвоения глобальной переменной "текущий выбранный воин" выбранного воина по ссылке) и 3 поля - принадлежность к игроку, количество ходов и текущая клетка... (касательно игрока, я вообще упрощаю, конечно, но надо бы класс игрока, который хранит список/массив всех своих воинов и ещё всякие данные, при чём, воин знает о своем игроке поредством поля - ссылки на объект класса игрока) и имеем классы потомков от воина, в которых если надо переопределяем и дополняем метод движения. например пехотинцу добавим вычет очков хода, телепортирующемуся существу - вычет очков маны и т.д. (заметь, не переписываем метод, а дополняем). То же самое с проверкой клеток. И соответственно массив воинов описаный как массив объектов типа класса-родителя воина (т.е. не конкретного воина а родительского класса)

Как производится, то что нам надо:

1. жмем на поле, на клетку с воином. по конкретной координате имеем клетку, обращаемся сразу к воину в ней : maparray[x,y].warrior(это ссылка на объект воина).checknearmapcells;
это мы вызвали проверку клеток, она будет исполнена в соответствии с тем, как она описана в конкретном потомке от класса родителя воина (а в самом методе родителя только записано присвоение currentwarrior := self; то есть глобальномй переменной текущего воина устанавливаем ссылку на воина(объекта), самого себя) , например, у пехотинца она будет описана так : по порядку проверяем все клетки вокруг той, которая записана у него самого в полях объекта (поля в объекте класса для координат этого воина) и условие по которому мы запишем в проверяемую клетку признак подсветки - это отсутствие воина и положительная проходимость клетки, т.е. if ((maparray[x,y].prohodima) and (maparray[x,y].warrior = nil)) then maparray[x,y].available := true;
Таким образом установили проходимость всем клеткам, которые проходимы. Дальше вызываем maparray[x,y].redraw; в котором указано if maparray[x,y].available then "нарисуем какую-нибудь пометку/подсветку"

теперь щелкаем по клетке на которую хотим наступить. и вызываем if maparray[x1,y1].available then currentwarrior.move(maparray[x1,y1]); передаем щелкнутую клетку в процедуру движения конкретного воина (дельфи сам знает как разрулить эту ситуацию, и вызывает метод именно того класса, который есть по факту)
в той процедуре написано вот что : у родителя : процедура очистки старых подсвеченных клеток, standcell.warrior := nil; удалить из старой клетки нашего воина, standcell := passedcell ; (установить в поле "клетка , где стоит воин" объекта значение переданной клетки) и passedcell.warrior := self; и в клетке прописать этого воина, предпоследнее checknearmapcells(passedcell); вызывает новое заполнение доступных клеток , последнее действие passedcell.redraw. Для отрисовки анимации перемещения между клетками надо накатать отдельные вещи, углубляться не буду, делаем просто "прыжок ". У потомков, по идее у всех : inherited move; (вызвать все действия которые производит родитель) и у конкретных, например, пехотинца : dec(movepoints); у телепортирующегося за ману : dec(manapoints); и так далее что захочешь.

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

МИНУС ооп для тебя – надо вникать что да как, там надо нормально так поучить и саму логику функционирования ооп и синтаксически. Второй минус – не уследишь за указателями – будут вагоны аксес виолейшенов… тут надо всё четко, создал объект, уничтожил, строки там и вложенные объекты и всё такое, надо четко следить ! так что смотри сам.


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

УПД. ах да, забыл. это я всё написал по-простому, т.е. без свойств(property), лучше свойства пока не буду тебе излагать, лучше пока так. А со свойствами некоторые вещи упростятся ещё больше, код будет меньше, но работать он будет ого-го... ибо со свойствами появляется очень важная и удобная вещь - сокрытие реализации, что может как упростить код , так и уменьшить потенциальное дырообразование.

Последний раз редактировалось phomm; 02.02.2011 в 13:47.
phomm вне форума Ответить с цитированием
Старый 02.02.2011, 15:05   #12
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Можно использовать движок Wesnoth.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 02.02.2011, 15:24   #13
korand
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 45
По умолчанию

Еще раз спасибо за такой опус, классно такое читать. Сегодня-завтра начну писать как вы сказали с классами, ибо практика нужна. Вопросы буду писать здесь, если не будет получаться что-то.
korand вне форума Ответить с цитированием
Старый 02.02.2011, 19:21   #14
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
П.С. модераторы, коли будет желание закиньте опусец в раздел статей или обучения или ещё как-то.
Упаси Боже!


korand, вам нужно в обязательном порядке прочитать следующие темы, пропуская сообщения, не несущие особой информации, или читая все подряд, чтобы проникнуться духом игроделов:

Уроки по созданию игр для новичков...
http://programmersforum.ru/showthread.php?t=1206

Мастерская: Основные аспекты программирования игр
http://programmersforum.ru/showthread.php?t=24944

Как Вы относитесь к созданию игр на Delphi?
http://programmersforum.ru/showthread.php?t=338

оцените RPG
http://programmersforum.ru/showthread.php?t=81708

Моя первая игра CosmoNoid (canvas)
http://programmersforum.ru/showthread.php?t=42809

Проблема с анимацией
http://programmersforum.ru/showthread.php?t=70140

Совершенствование ИИ персонажа
http://programmersforum.ru/showthread.php?t=11629

Обработка столкновений
http://programmersforum.ru/showthread.php?t=133143

Уменьшение загрузки ЦП и увеличение скорости программы.
http://programmersforum.ru/showthread.php?t=59037

Создаю стратегию.
http://programmersforum.ru/showthread.php?t=50504

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

Последний раз редактировалось Beermonza; 02.02.2011 в 19:45.
Beermonza вне форума Ответить с цитированием
Старый 09.02.2011, 01:43   #15
korand
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 45
По умолчанию

Я решил связаться с DrawGrid как визуальным отражением игрового поля, но никак не могу найти исчерпывающего ответа на использование OnDrawGrid. Когда событие срабатывает? Я знаю какие-то команды, но не могу их нормально использовать без понимания как они работают, хотя мне нужно только вставлять в ячейки картинки из файлов.

Еще есть серьезный вопрос перехода по меню и вообще разным частям игры. Например, после запуска игра появляется меню, оттуда идем в "игра" или "настройки". Нужно ли здесь 3 формы, где меню-это главная? Надеюсь, что при ответе "да" смогу сам найти как реализовывать много форм в одной программе.
korand вне форума Ответить с цитированием
Старый 09.02.2011, 12:25   #16
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

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

OnDrawGrid наступает в момент , когда требуется перерисовка клетки, то есть, когда щелкули по клетке, когда клетка перекрылась чем-то и потом открылась (сворачивание-разворачивание формы тоже здесь же)

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

[offtop]некоторое время не был в скайпе... теперь буду, пиши , коли что, потолкуем[/offtop]
phomm вне форума Ответить с цитированием
Старый 09.02.2011, 13:02   #17
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Я бы посоветовал не рисовать на DrawGrid или подобных компонентах, ибо не клетками едиными жива игра. Рисуйте лучше на TImage, а еще лучше - прямо на TForm (вообще-то без разницы, член TCanvas у них одинаковый). Преобразование координат на компоненте в номера клеток производится элементарно: коорд / размер_клетки = номер_клетки; номер_клетки * размер_клетки = координаты_границы_клетки. Отрисовка сетки производится обычными прямыми линиями.

Что касается нескольких форм - читайте про MDI-приложения (в противоположность SDI с одной формой). Однако, и тут бы я посоветовал рисовать меню на тот же Canvas, что и все остальное. Это будет, конечно, посложнее, но гораздо красивее и опрятнее.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 09.02.2011, 16:10   #18
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

korand, читать, читать, читать, читать материал, указанный выше. Есть все, что нужно, и теория и готовые исходники. После прочтения задавай вопросы, если они сами собой не рассосутся.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 15.03.2011, 22:15   #19
korand
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 45
По умолчанию

Моя игра все-таки развивается, хоть и медленно. Сейчас подошел к черте внедрения мультиплеера.
Скажу честно (пусть меня закидают тапками), но сейчас у меня ни времени, ни желания тщательно разбираться в вопросе мультиплеера в Delphi. На данный момент мне нужно чтобы два игрока могли действовать следующим образом:
1) игрок А нажимает на "создать"- он становится сервером
2) игрок В вводит внешний ай-пи игрока А и соединяется
3) после этого просто требуется посылать туда-сюда по сути текстовые сообщения (информация о ходе итд- это уже как организовать)

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

Заранее спасибо!
п.с. надеюсь, что это не некропостинг- ап своей темы =)
korand вне форума Ответить с цитированием
Старый 16.03.2011, 01:48   #20
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

korand
Как я понял у Вас еще ничего нету...
Не лезьте в клиент - серверную часть...(клиент-клиент)
Сделайте хотя бы игру на одного (внедрите мультиплей)…
Ибо сделав сетевую версию, "играть" без мультиплея, хоть какогонит - сложно)

Как говорил Beermonza в сылках выше все есть...

Да, взаимодействие реализуется сокетами... >>>
Советую сперва сделать хотя бы аналог чата...чтобы более менее понять, что к чему...
dampirik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пошаговая сортировка sergey31 Помощь студентам 3 02.05.2008 22:38