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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2008, 11:35   #151
Titan123
Форумчанин
 
Аватар для Titan123
 
Регистрация: 27.06.2008
Сообщений: 113
По умолчанию

все понял я.
как обычно, виноват я: запутался и допустил ошибки. всем спасибо. я, наверное, еще обращусь
Titan123 вне форума Ответить с цитированием
Старый 21.07.2008, 23:14   #152
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Про модель юнитов

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

L_M, воу, воу, воу, не все сразу ...и ИИ, и модель юнитов, и графика, ...давайте по степени значимости. На первом месте всегда модели. Значит разбираем модель юнита (персонажа), полагаю модель мира вы уже понимаете как создается из прошлых уроков, даже готовую игрушку показали Для стратегии все аналогично, только текстурки тайлов будут изометрические или вид сверху.

Модель персонажа


Чтобы юнит был не один, нужно воспользоваться одномерным массивом, размер его нужно задать сразу, например (0-255) - это будет лимит "населения" в вашей стратегии. Массив создается сразу, а вот управлять его содержимым мы будем динамически.
Юнит обладает рядом характеристик игровых, а так же множеством системных данных от указателей на анимацию до индексов действий. Главным остается правило: "все юниты в системе игры имеют один и тот же набор характеристик и системных данных". Для этого нам понадобится собственный тип массива:

Код:
// тип "юнит" -----------------------------------------------------
  TGUnit = packed record
// флаг использования
    UUses: boolean;
// тип юнита
    UType: byte;
// имя юнита
    UName: string;
// обзор (когда юнит "замечает" цель)
    UScan: word;
// атака юнита
    UAttack: byte;
// дистанция атаки
    URange: byte;
// защита юнита
    UArmor: byte;
// максимальное количество жизней
    UHpMax: word;
// текущее количество жизней
    UHp: word;
// координаты юнита по-X
    UPosX: word;
// координаты юнита по-Y
    UPosY: word;
// новая точка перехода по-X
    UPointX: word;
// новая точка перехода по-Y
    UPointY: word;
// смещение анимации при перемещении юнита по-X
    UMoveX: shortInt;
// смещение анимации при перемещении юнита по-Y
    UMoveY: shortInt;
// знак смещения по-X
    UDispX: shortInt;
// знак смещения по-Y
    UDispY: shortInt;
// флаг пассивности
    UStay: boolean;
// флаг перемещения
    UGo: boolean;
// флаг атаки
    UAttack: boolean;
// флаг повреждения (в юнита попали)
    UDamange: boolean;
// флаг погибания
    UDie: boolean;
// флаг готовности
    UReady: boolean;
// указатель на анимацию
    UAnimIndex: word;
// тип анимации (стоит, идет, атакует, получает и пр.)
    UTypeAnim: byte;
// номер анимации (в стратегии 8 направлений, или 5 и остальные зеркальные)
    UNAnim: byte;
// текущий кадр анимации
    UKadr: byte;
// это нужно для изометрии, координата Y в два раза меденнее изменяется
    UDelay: byte;
  end;
Это далеко не все пункты, что вам могут понадобиться, но самые основные. Может что-то не указал, ...дополните.
Теперь достаточно назначить тип на наш массив и модель юнита готова:

Код:
Var
...
UnitMas: array[0..255] of TGUnit;
Теперь в основном таймере игры достаточно просматривать массив и по записи UnitMas[i].UUses (true) определять кого нужно показывать в игре.

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

Последний раз редактировалось Beermonza; 10.06.2013 в 16:32.
Beermonza вне форума Ответить с цитированием
Старый 21.07.2008, 23:14   #153
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Про модель юнитов (продолжение)

продолжение...

Вот секция управления перемещением юнитов:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  for i:=0 to 255 do
    begin
      with UnitMas[i] do
        begin
          if UUses and UGo then
            begin
              if UPosX<>UPointX then
                begin
                  if UPointX>UPosX then UDispX:=1;
                  if UPointX<UPosX then UDispX:=-1;
                  if (UMoveX>{половина длины тайла}) Or (UMoveX<-{половина длины тайла}) then
                    begin
                      UMoveX:=0;
                      UPosX:=UPosX+UDispX;
                    end;
                  UMoveX:=UMoveX+UDispX;
                end
              else UMoveX:=0;
            
              
              if UPosY<>UPointY then
                begin
                  if UPointY>UPosY then UDispY:=1;
                  if UPointY<UPosY then UDispY:=-1;
                  UDelay:=UDelay+1;
                  if UDelay>1 then
                    begin
                      UDelay:=0;
                      if (UMoveY>{половина высоты тайла}) Or (UMoveY<-{половина высоты тайла}) then
                        begin
                          UMoveY:=0;
                          UPosY:=UPosY+UDispY;
                        end;
                      UMoveY:=UMoveY+UDispY;
                    end;
                end
              else UMoveY:=0;
            end;
            
          // тут обработка событий и смена анимации
          // вот так в примитиве, только смена анимации
          if UStay then UTypeAnim:=0;
          if UGo then UTypeAnim:=10;
          if UAttack then UTypeAnim:=20;
          if UDamange then UTypeAnim:=40;
          if UDie then UTypeAnim:=40;

          // смена номера кадра
          inc(UKadr);
          if UKadr>10 then UKadr:=1;

          // отрисовка (создаем свою процедуру, по всем правилам строим кадр в буфере и последней строкой выводим в форму, PaintBox или Image)
          DrawScreen;

        end;
    end;
end;
Как выглядит код отрисовки вы наверное уже в курсе из ранних неоднократных постов.
Что значит "прозрачные панели под здания" я не совсем понимаю, если мы рисуем в буфере, то достаточно иметь bmp-картинку здания, при загрузке указать прозрачность.
Вот в принципе и все, с моделью.

ИИ для стратегии


Задача достаточно сложная, готового кода у меня к сожалению нет, еще предстоит разработать только для RPG, он много сложнее. Вам же нужен примитивный. Попробую объяснить на пальцах.
Итак ИИ для стратегий. В него входит система поиска пути и система распознования целей. "Поиск пути" - достаточно распространенная тема, нас интересует самый простой частный случай - "дойти до точки назначения" (или до расстояния атаки), без особенностей, смотрим тут: http://www.delphikingdom.com/asp/vie...catalogid=1127
В системе распознавания целей у нас есть цикл, он перебирает всех юнитов, берет их координаты UPosX, UPosY и прибавляет/отнимает, в соответствии, обзор UScan по всем направлениям, если на карте в этом радиусе (он не совсем радиус, скорее ромб) находится цель, то передаются координаты в систему поиска пути. В случае дальней атаки предварительно отнимается/прибавляется дистанция атаки URange.
Казалось бы это одна система, но поиск пути нам не нужен пока нет цели или пока не дана команда перейти в указанное место (мышкой).

Как интерпретировать координаты мышки в координаты карты? ...оч. просто:
Код:
  MapX:=Trunc((Mouse.CursorPos.X-Form1.Left-{поправка})/{половина длины тайла})+DispMapX;
  MapY:=Trunc((Mouse.CursorPos.Y-Form1.Top-{поправка})/{половина высоты тайла})+DispMapY;
DispMapX, DispMapY - это текущий сдвиг карты на экране, например карта 100х100 а экран где-то в центре ее и захватывает часть карты, так вот, начальные координаты экрана у нас в месте DispMapX и DispMapY.

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

Последний раз редактировалось Beermonza; 10.06.2013 в 16:34.
Beermonza вне форума Ответить с цитированием
Старый 23.07.2008, 21:41   #154
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

как я понял создается массив из юнитов, потом в цикле изменяются координаты каждого согласно направлению? почему используется тип packet record, а не например просто запись, или объект?
Упс...
L_M вне форума Ответить с цитированием
Старый 23.07.2008, 21:49   #155
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

в основном меня интересует именно модель персонажа и как "приделать" к ней графику и ИИ. графику я думаю, что смогу сделать, об этом сказано достаточно, ИИ тоже несложно, но как собрать все вместе. вы уже начали объяснять как раз то, что нужно. получается надо для всего проверять весь массив(например столкновение друг с другом это цикл огромный получиться)? да и 255 это слишком мало для стратегии(если 16 рас, то по 16 юнитов получиться)-мне кажется это будет очень долго обрабатываться. я еще не знаю что делаю - рпг в стиле диабло(аллодов) или стратегию, но принцип то там будет один и тот же?
Упс...
L_M вне форума Ответить с цитированием
Старый 24.07.2008, 17:40   #156
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Продолжаем разбирать модель юнитов ...

Цитата:
Сообщение от L_M Посмотреть сообщение
как я понял создается массив из юнитов, потом в цикле изменяются координаты каждого согласно направлению? почему используется тип packet record, а не например просто запись, или объект?
Да, ...массив динамически изменяется, ...все, что содержат записи вы вольны обновлять когда вам вздумается, ...это дело игрового движка, как вы его будете писать, это ваше личное дело
Packet record я использую в целях экономии ресурсов, эти записи будут предварительно обработаны, и будут занимать столько памяти сколько для них требуется, в отличие от просто Record, правда чуть падает скорость, но на игре это не отразится. Применять Object вообще нет никакого смысла, никакого наследования у нас нет, строить дерево тоже не нужно, просто записи.

Цитата:
Сообщение от L_M
в основном меня интересует именно модель персонажа и как "приделать" к ней графику и ИИ. графику я думаю, что смогу сделать, об этом сказано достаточно, ИИ тоже несложно, но как собрать все вместе. вы уже начали объяснять как раз то, что нужно. получается надо для всего проверять весь массив(например столкновение друг с другом это цикл огромный получиться)? да и 255 это слишком мало для стратегии(если 16 рас, то по 16 юнитов получиться)-мне кажется это будет очень долго обрабатываться. я еще не знаю что делаю - рпг в стиле диабло(аллодов) или стратегию, но принцип то там будет один и тот же?
Все очень просто собирается "до кучи", ...в примере модели я указал UAnimIndex - указатель на анимацию, т.е. у вас уже есть массив анимации (как он создается вы в курсе), значение UAnimIndex указывает на массив анимации, на конкретную его ячейку. Этот указатель запишет ваш движок, когда создаст очередного юнита.
ИИ непосредственно управляет записями массива юнитов, обрабатывая в цикле условия.
Вспомните AOEII там лимит 200 юнитов для расы, ...у вас будет 16 массивов, причем движок будет работать только с теми, что участвуют в игре, ...как подтормаживает Империя на макс лимите все знают Так что вы пробуйте на малом, постепенно расширяйте.
Разница между стратегией и RPG в плане движка невелика, они часто обе содержатся в одной и той же игре, например WarCraft.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.06.2013 в 16:35.
Beermonza вне форума Ответить с цитированием
Старый 26.07.2008, 22:02   #157
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

вот столкнулся с такими проблемами:
при закрытии неправильно работает. в таймере обрабатывается графика, ну как в примерах, и при нажатии Esc Close; а в собственной процедуре close работает для файлов, и я не знаю как правильно завершить программу.
сразу такой вопрос где все-таки все обрабатывать? для таймера в примере был обработчик клавиатуры, а как быть с мышью?
Упс...
L_M вне форума Ответить с цитированием
Старый 27.07.2008, 13:33   #158
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Друзья, понимаю что влез не в тему вообще, но у меня вопрос. Как создать физику мяча? Сделать так точнее чтобы он мог оттталкиваться от стен, скорость остаётся постоянной.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 27.07.2008, 18:43   #159
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от L_M Посмотреть сообщение
вот столкнулся с такими проблемами:
при закрытии неправильно работает. в таймере обрабатывается графика, ну как в примерах, и при нажатии Esc Close; а в собственной процедуре close работает для файлов, и я не знаю как правильно завершить программу.
сразу такой вопрос где все-таки все обрабатывать? для таймера в примере был обработчик клавиатуры, а как быть с мышью?
Прежде чем окно будет закрыто (основное окно игры), нужно остановить все таймеры, часто тут выскакивают ошибки. Все способы ссылаются на одну и туже процедуру OnClose, в ней пропишите все приготовления к завершению приложения.

Не знаю как все, а если VCL, то проще обрабатывать OnKeyDown и иже с ними OnMouse для мыши на главной форме, ...тут у вас флаги меняют свои значения по нажатию с клавиатуры или мыши, а один ОБЩИЙ таймер обрабатывает флаги, задает такт ИИ и сам же им и является, готовит графику и опять таки дает команду процедуре вывода кадра на экран.

Цитата:
Сообщение от Манжосов Денис :)
Друзья, понимаю что влез не в тему вообще, но у меня вопрос. Как создать физику мяча? Сделать так точнее чтобы он мог отталкиваться от стен, скорость остаётся постоянной.
Такое применяется в Арканоиде, ...внимательно читайте материал, такая информация есть, и примеры тоже.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.06.2013 в 16:37.
Beermonza вне форума Ответить с цитированием
Старый 27.07.2008, 22:08   #160
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Скорость - это вектор. Реверсируем координаты вектора в зависимости от стены, от которой отталкиваемся. От вертикальных - реверс Х, от горизонтальных - реверс Y.
zetrix вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07