Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 27.11.2009, 16:54   #391
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Манжосов Денис :) Посмотреть сообщение
Вообще, я уже забил на систему, где объекты могут располагаться в любой части карты, в любой координаты.
Смутно представляю, что это были за планы, но замечу, что какую бы вы не взяли 2D игру, относительно древнюю или не очень, стратегию или РПГ, то заметите, что, например, отряд юнитов кучкуется не хаотично, а занимает определенно равномерно пространство, так, что можно заметить элементарные клетки, на которые поделена карта. Здания занимают несколько клеток по осям X и Y, т.е. площадь. Деревья растут либо кучкой по несколько, занимая несколько клеток, либо по одиночке. Куда бы не послали юнита, он остановится не на конкретном объекте, а перед ним, в пустой клетке и начнет действовать.
Так что, я думаю, то что предложено выше в полной мере позволяет реализовать любую 2D игру, и не только.
Цитата:
Сообщение от Манжосов Денис :) Посмотреть сообщение
Beermonza, а как у Вас в игре хранится файл карты? Объекты можно ставить, где угодно или есть наименьший размер ячейки, к примеру 10?
Размер клетки карты известен, это изометрический тайл, 2:1, он достаточно мал в игровом масштабе, кроме того, есть промежуточные клетки карты, так, что самых маленьких персонажей можно набить на карту как сардины в банку. Появляться объекты будут в клетках карты, по формуле w*j-sw, h*i-sh, где: w,h - размеры тайла, j,i - координаты клетки, sw,sh - статические смещения текстуры (центрирование).
Сохранение карты идет последовательно, клетка за клеткой, записывая код объекта, ...там где нет объектов идет пропусковый байт. После записи файл сжимается и записывается уже на винт.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Старый 27.11.2009, 17:07   #392
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Размер файла уменьшается в разы, ...кроме того мы экономим ОЗУ, храня каждый объект в единственном экземпляре. Если потребуется изменить объект "на лету", то достаточно сменить его ресурс в банке, один раз, не бегая по карте и не меняя его во всех клетках карты, где он находится.
Или можно использовать указатели. Загружается текстура, она распологается в памяти а на нее создается указатель. Гогда загружается новая текстура проверяется, была ли она загружена. Если да, то новыя память под нее не выделяется, а просто создается указатель под ранее загруженную текстуру, а если нет то она загружается полностью. С такой системой сколько бы одинаковых текстур ты загрузить не пытался, в памяти будет одна, а все переменные будут указателями (так сделано в любом нормальном движке).
Вадим Буренков вне форума   Ответить с цитированием
Старый 27.11.2009, 19:11   #393
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Вот почитал уроки. У меня все спрайты в отдельных файлах, решил их объединить в несколько, по темам. Возник вопрос: как загруженный битмап порезать? Может быть есть готовое решение?
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума   Ответить с цитированием
Старый 27.11.2009, 19:23   #394
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
как загруженный битмап порезать?
Можно копировать кусок спрайта в другой битмап: Frame.Canvas.CopyRect.
Вадим Буренков вне форума   Ответить с цитированием
Старый 27.11.2009, 19:25   #395
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Код:
  TAnimation = object
    Enabled: boolean;
    AnimationFile, AnimationFrame: TBitmap;
    XResolution, YResolution: integer;
    MaxFrameCount: integer;
    FrameNumber: integer;

    procedure CreateAnimation(FileName: string; Max: integer; XRes, YRes: integer);
    procedure DrawAnimation(XPos, YPos: integer);
    procedure FreeAnimation;

  end;
Это тип "Анимация".
Код:
procedure TAnimation.CreateAnimation(FileName: string; Max: integer; XRes, YRes: integer);
var
  Root: string;
begin
  Root := ExtractFilePath(ParamStr(0));
  if not FileExists(Root + FileName) then exit;
  AnimationFile := TBitmap.Create;
  AnimationFile.LoadFromFile(FileName);

  AnimationFrame := TBitmap.Create;
  AnimationFrame.TransparentColor := AnimationFile.Canvas.Pixels[3,1];
  AnimationFrame.Transparent := true;

  XResolution := XRes;
  YResolution := YRes;

  AnimationFrame.Width := XResolution;
  AnimationFrame.Height := YResolution;

  MaxFrameCount := Max;
end;
А вот деление кадра на кусочки, точнее определение длины кусочка. Можно ещё не задавать размер кадра, а высчитывать его по формуле Количество Кадров разделить на Длину Битмапа.
Код:
procedure TAnimation.DrawAnimation(XPos, YPos: integer);
var
  XR, YR: integer;
begin
  AnimationFrame.Canvas.FillRect(AnimationFrame.Canvas.ClipRect);

  XR := XResolution * FrameNumber;
  YR := YResolution;

  AnimationFrame.Canvas.CopyRect(Bounds(0,0, XResolution, YResolution),
                                 AnimationFile.Canvas,
                                 Bounds(XR, 0, XResolution, YR));

  _2DDraw(XPos, YPos, AnimationFrame); // Рисовать на канвасе
   if FrameNumber = MaxFrameCount then FrameNumber := 0
end;
Вот так на экран выводить
Манжосов Денис :) вне форума   Ответить с цитированием
Старый 27.11.2009, 19:51   #396
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

На самом деле здесь по-прежнему присутствует упомянутая некогда в топике проблема: если два объекта имеют одну и ту же анимацию, то они рисуются абсолютно синхронно, даже если по идее не должны (пример с поваленными деревьями).
Я недавно тоже столкнулся с этой проблемой и вначале измышлял совершенно дикие варианты вплоть до хранения в объекте текущего кадра анимации и количества кадров, и, соответственно проверкой на последний кадр вне функций самой анимации.
Вскоре, однако, нашел довольно изящное решение. Анимация по-прежнему хранится отдельно, текущий кадр хранится в объекте карты (без этого никуда), процедура рисования анимации принимает текущий кадр в качестве аргумента (в итоге на карте могут быть несколько объектов с одной и той же анимацией на разных стадиях) и, что самое главное - номер кадра передается функции рисования анимации по ссылке (пишу на C++). Т.о. проверка на последний кадр происходит не выходя за пределы типа анимации, а объект карты должен хранить всего лишь номер текущего кадра и не заботиться о том, является ли он последним.
Модификация кода по сравнению с вариантом, где текущий кадр хранился в типе анимации минимальна - удалил из типа переменную CurrFrame, вписав его вместо этого в качестве аргумента.
Не знаю, есть ли в Delphi ссылки, но, думаю, если что, можно воспользоваться указателями.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума   Ответить с цитированием
Старый 27.11.2009, 20:09   #397
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Гром, именно этот тип анимации я описывал в качестве урока, ...кадр текущий и их макс. число хранит в себе каждый объект, а анимация одна в банке на все кадры. Это очень правильно и рационально.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Старый 27.11.2009, 20:33   #398
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Beermonza, честно говоря, тему я почти не читал, т.к. дельфийский код читаю медленно на основе полузабытого паскаля и билдера... А вначале там и вовсе коды во вложенных файлах, их вообще лень читать...)
А как насчет хранения максимального номера кадра в типе анимации? По-моему, производить проверку номера кадров лучше всего прямо во время рисования кадра, т.е. в функции объекта типа анимация. Мне это кажется как-то более логично. К тому же, объект может иметь несколько различных видов анимации (например, дерево стоящее и дерево падающее). Если стоящее дерево имеет всего один кадр (или просто другое число кадров, нежели падающее), то как хранить число кадров? Отдельно для каждого типа анимации?
Вообще прямо сейчас я имею на руках работающий код рисования анимации, реализованный по этому методу, а вот до использования этой самой анимации в объектах еще не дошел, так что пока не знаю наиболее рациональных приемов.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума   Ответить с цитированием
Старый 27.11.2009, 21:18   #399
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
А как насчет хранения максимального номера кадра в типе анимации? По-моему, производить проверку номера кадров лучше всего прямо во время рисования кадра, т.е. в функции объекта типа анимация. Мне это каже................
Все о чем ты говоришь есть в моем последнем примере.
Вадим Буренков вне форума   Ответить с цитированием
Старый 27.11.2009, 22:00   #400
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Товарищи, не меряемся длинной портянки кода, ...тема обязывает давать понятия новичкам.
Гром, условие на переполнение кадра (счетчик) использует оба значения, текущий кадр и макс. кадр, и переводит текущий на начальный, посему оба значения нужно хранить вместе (условно):

Код:
Inc(Obj[i,j].Frame);
If Obj[i,j].Frame > Obj[i,j].MaxFrame then Obj[i,j].Frame := 0;
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


08:31.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.