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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2009, 16:42   #1
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию Mini 2D engine. Delphi и Direct3D

Буду делать 2D движок для начинающих!
И так, движок является обверткой на Direct3D и очень прост в освоении. Для его работы нужно скачать DirectX модули и установить DirectX 9c.
Скачать необходимые модули можно с этого сайты: http://clootie.ru/delphi/download_dx92.html#Headers
http://clootie.ru/delphi/DX92/Clootie_DirectX92.exe - прямой линк на библиотеки
http://clootie.ru/delphi/DX92/Clootie_DX92_dlls.zip - прямой линк на необходимые динамические библиотеки

Тестовая версия на работоспособность.

Справка по функциям:
function D3DXInit(hWnd: THandle; iWidth, iHeight: Integer; FullScreen: Boolean; vSync: Boolean):Boolean;

Функция инициализации Diretc3D на окно.

hWnd: THandle; - дескриптор окна
iWidth, iHeight: Integer; - высота и ширина системы координат(не обязательно размеры окна)
FullScreen: Boolean; - полноэкранный/оконный режимы
vSync: Boolean - вертикальная синхронизация

function LoadTextureFromFile(FileName: string; var Texture: IDirect3DTexture9; ColorKey: DWORD): boolean;

Функция для загрузки текстуры из файла

FileName: string; - путь к текстуре
var Texture: IDirect3DTexture9; - текстура
ColorKey: DWORD - прозрачный цвет $FF000000 - черный $FFFFFFFF - белый и все промежуточные, формат AARRGGBB, 0 - нет прозрачного цвета

procedure ResetVievPort(iWidth, iHeight: integer);

Если размеры формы изменились, то нужно рассчитать систему координат заново.
Код:
procedure TForm1.FormResize(Sender: TObject);
begin
  ResetVievPort(ClientWidth, ClientHeight);
end;
Код:
procedure DXBegin(); //начало сцены
procedure DXEnd(); //конец сцены
procedure DXPresent(); //представление сцены
procedure DXClear(Color: DWROD); //очистить экран цветом Color
procedure Draw(x1,y1,x2,y2: Real; Texture: IDirect3DTexture9);

Рисование текстуры на экране

x1,y1,x2,y2: Real; - левый верхний и правый нижний угол
Texture: IDirect3DTexture9 - текстура

procedure DrawRect(x1,y1,x2,y2: Single; u1,v1,u2,v2: Single; Texture: IDirect3DTexture9);

Более сложный вариант рисования текстуры.

u1,v1,u2,v2: Single; - текстурные координаты (вся текстура 0,0,1,1)(лева верхняя четверть 0,0,0.5,0.5)

Добавятся функции поворота координатной сетки для поворота картинок и функции переноса координатной сетки. Аналоги glRotate и glTranslate.
Прямая работа с пикселями текстуры, вывод текста и еще что нибудь придумаю.

В архиве пример с библиотекой(mini2d.pas).
Вложения
Тип файла: rar mini2ddvig.rar (174.2 Кб, 114 просмотров)
Kostia вне форума Ответить с цитированием
Старый 29.06.2009, 20:01   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Собственно что я за это время успел добавить.
Это 3 новые ф-ии для вывода спрайтов на экран:

Код:
procedure DrawRotate(x1,y1,x2,y2: Single; angle: single; Texture: IDirect3DTexture9);
procedure DrawRotateRect(x1,y1,x2,y2: Single; u1,v1,u2,v2: Single; angle: single; Texture: IDirect3DTexture9);
procedure DrawEx(x1,y1,x2,y2: Single; u1,v1,u2,v2: Single; ox,oy,angle: single; Texture: IDirect3DTexture9);
procedure DrawRotate(x1,y1,x2,y2: Single; angle: single; Texture: IDirect3DTexture9);
Выводит повернутый прямоугольник с текстурой на угол angle относительно центра прямоугольника.

procedure DrawRotateRect(x1,y1,x2,y2: Single; u1,v1,u2,v2: Single; angle: single; Texture: IDirect3DTexture9);
Тоже самое, но с возможностью задать текстурные координаты

procedure DrawEx(x1,y1,x2,y2: Single; u1,v1,u2,v2: Single; ox,oy,angle: single; Texture: IDirect3DTexture9);
Это самая главная функция вывода на экран, все остальные ф-ии обращаются именно к ней.
ox,oy,angle: single; - угол на который нужно повернуть спрайт относительно точки ox,oy

Код:
procedure DXRorate(Angle: single);//Поворачивает систему координат
procedure DXTranslate(x,y: single);//перемещает систему координат
Важно: перемещение и поворот осуществляются относительно предыдущих значений. Для обнуления матрицы трансформации системы координат, нужно вызвать процедуру:
procedure DXLoadIdentity();

Улучшил расчет матрицы проекции.

Дальше, еще круче, добавлю возможность устанавливать различные типы прозрачности спрайтов и наконец добавлю вывод текста =)

Немного самопиара =)

Звезды загружены из bmp файла и не имеют альфа, а взрыв вообще из jpg, но они прозрачны. Это достигается путем сложения цветов. Когда добавлю простеский способ вывода векторных шрифтов, выложу модуль( и тут я пропал на вечно...=))
И еще немного пиара, никаких посторонних dll таскать не нужно, кроме тех что нужны непосредственно самому Direct3D.
Вложения
Тип файла: rar mini2d.rar (2.4 Кб, 60 просмотров)

Последний раз редактировалось Kostia; 29.06.2009 в 21:01.
Kostia вне форума Ответить с цитированием
Старый 03.07.2009, 17:34   #3
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

И так, документы во все вузы поданы остается только ждать, по моему, это сложнее, чем сдавать сами экзамены.
И так, я добавил возможность использования GDI шрифтов, но это еще не конечный вариант и параметры функций могут претерпеть изменения.
Еще я изменил функцию инициализации, теперь стало немного меньше параметров и больше возможностей.

function DXInit(hWnd: THandle; iWidth, iHeight: Integer; Flag: DWORD):Boolean;

Новый параметр, который заменил старый:
Flag: DWORD;
Он принимает 3 различных флага инициализации:

DXHARDWARE - аппаратное ускорение/если не возможно, то будет включено SoftWare
DXVSYNC - включает вертикальную синхронизацию
DXFULLSCREEN - полноэкранный режим
Примерно она теперь выглядит так:

DXInit(pWnd, 640, 480, DXHARDWARE or DXVSYNC);

Шрифты.
Новый тип DXFont, синоним ID3DXFont.
Для создания необходимого шрифта используется функция:

procedure DXCreateFont(Height: integer; Italic: boolean; Bold: boolean; FontName: pChar; var ppFont: ID3DXFont);


Height: integer; - размер шрифта, чем больше значение, тем меньше шрифт
Italic: boolean; Bold: boolean; - и так понятно
FontName: pChar; - имя шрифта, например 'Arial'
ppFont: ID3DXFont - собственно интерфейс самого шрифта

Для вывода такста используется функция:
procedure DXOutText(Text: string; R: TRect; Color: DWROD; ppFont: ID3DXFont);

Text: string; - текст для вывода
R: TRect; - область для вывода, текст будет сам делиться на строки при выходе за его границы
Color: DWROD; - цвет шрифта, включая и задействовав альфу
ppFont: ID3DXFont - сам шрифт

DXOutText('FPS: '+IntToStr(ffps), Rect(0,0,60,20),$aaFFFFFF, Font);

Теперь об особенностях некоторых доработок.
1. Скорость вывода увеличилась в разы(я сначала немного не тот флаг указал при инициализации, промазал).
20000 спрайтов + смешивание дает ~12 кадров/с
10000 спрайтов + смешивание дает 22-25 кадров/с
1000 спрайтов + смешивание дает 235 кадров/с
100 спрайтов + смешивание дает 2100-2200 кадров/с
10 спрайтов + смешивание дает 10000-11000 кадров/с.
На моей машине.

2.Новая функция для рисования прямоугольника определенного цвета с учетом установленного типа смешивания.

procedure Rectangle(x1,y1,x2,y2: Single; Color: DWORD);

В архива новая версия библиотеки и пример.
Вложения
Тип файла: rar mini2d.rar (43.7 Кб, 66 просмотров)

Последний раз редактировалось Kostia; 03.07.2009 в 17:37.
Kostia вне форума Ответить с цитированием
Старый 03.07.2009, 18:38   #4
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Интересная работа. Как будет функционал побольше может ознакомлюсь .
Вадим Буренков вне форума Ответить с цитированием
Старый 04.07.2009, 15:44   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Уф, многое доработал!
Производительность увеличилась в 1,5 раза и теперь при 30000 спрайтах 12 fps. Данное увеличение связано с переходом на матричные преобразования.
Добавил проверку на потерю устройства.
function DXTest: HRESULT;
Эта функция возвращает все возможные ошибки, в том числе потерю поверхности и возможность восстановления устройства.
Код:
  res:=DXTest;
  IF res=DXERR_DEVICELOST then exit;
  if res=DXERR_DEVICENOTRESET then
  begin
    DXResetDevice;
    //загрузка всех текстур
  end;
Т.к. устройство было потеряно, а значит и память ушла от нас и многие текстуры так или иначе уже потеряны и поэтому просто выполняем повторную загрузку все текстур и продолжаем работу.
procedure DXResetDevice();
Сброс устройства, используйте исключительно при DXERR_DEVICENOTRESET

Добавил новую функция для изменения координатной сетки:
procedure DXScale(x,y: single);
Я ужу говорил, что все преобразования происходят опираясь на предыдущие, поэтому внимательно следите или просто сбрасывайте все настройки DXLoadIdentity
Изначальный масштаб 1:1
DXScale(0,0); - без всяких изменений
DXScale(-0.5,-0.5); - в 2 раза меньше
DXScale(1,1); - в 2 раза больше

Также претерпели изменения функции для работы со шрифтами.
procedure DXCreateFont(Height: integer; Flag: DWORD; FontName: pChar; var ppFont: ID3DXFont);
Я объединил italic и bold во флаги.
Теперь чтобы включить все стили нужно указать
Flag = DXFONT_ITALIC or DXFONT_BOLD;

Также были добавлены функция добавления новых шрифтов из файла.
function DXAddFontResource(FilaName: string): string;
FilaName: string - имя файла шрифта
Функция возвращает имя самого шрифта
procedure DXReleaseFontResource(FilaName: string);
Удаление шрифта

И да еще вы можете узнать статус смешивания:
BlendingState: DWORD = 0; // DXZEROALPHA or DXONEALPHA or DXSRCALPHA
и ширину и высоту буфера:
BufferWidth, BufferHeight: Integer;
При изменении размеров формы будет портиться качество, т.к. размер буфера остается прежним, но матрица проекции позволит использовать все пиксели окна.

В следующей версии, постараюсь реализовать смену режимов на ходу(fullscrean/windowed).
Постараюсь решить проблему связанную с задним буфером.
И добавлю возможность упрощенного использования растровых шрифтов.

В архиве только библиотека.
Вложения
Тип файла: rar Mini2D.rar (4.0 Кб, 43 просмотров)

Последний раз редактировалось Kostia; 04.07.2009 в 19:42.
Kostia вне форума Ответить с цитированием
Старый 08.07.2009, 01:25   #6
Djem1991
Форумчанин
 
Аватар для Djem1991
 
Регистрация: 05.01.2009
Сообщений: 130
По умолчанию

Насчёт оптимизации, советывал бы прочитать законы оптимизации по версии Фленова М.

всех благ)
В жизни нет reset'а, а жаль...
Djem1991 вне форума Ответить с цитированием
Старый 08.07.2009, 18:10   #7
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Цитата:
Насчёт оптимизации, советывал бы прочитать законы оптимизации по версии Фленова М.
Читал я их, но это малость в оптимизации, если взять любую книжку по asm, то можно узнать гораздо больше об оптимизации.

В общем хочется сделать много и времени выложить новую версию я все не находил. Теперь поменялось многое добавил сглаживание, фильтрацию текстур, создание winapi окна, определение поддерживаемых режимов...
И так изменилась функция инициализации, теперь можно указать уровень сглаживание.
function DXInit(hWnd: THandle; iWidth, iHeight: Integer; Flag: DWORD; MultiSampleFlag: DWORD):Boolean;

MultiSampleFlag: DWORD - флаг сглаживания 0 - нет сглаживания
Вот список всех флагов:
Код:
  DXMULTISAMPLE_NONE = 0;
  DXMULTISAMPLE_NONMASKABLE = 1;
  DXMULTISAMPLE_2_SAMPLES = 2;
  DXMULTISAMPLE_4_SAMPLES = 4;
  DXMULTISAMPLE_8_SAMPLES = 8;
  DXMULTISAMPLE_16_SAMPLES = 16;
И теперь остается включать и выключать сглаживание при отрисовки сцена:
procedure DXAntialiasing(Flag: DWORD);
1 - вкл.
0 - выкл.

Добавил возможность выбора фильтрации текстуры:
procedure DXTextureFilter(Flag: DWORD);

Код:
  DXTEXF_NONE          = 0;
  DXTEXF_POINT         = 1;
  DXTEXF_LINEAR        = 2;
  DXTEXF_ANISOTROPIC   = 3;
Так, вспомнить бы что еще...
Добавил работу с растровым текстом. У вас должна быть текстура и файл с данными о шрифте.
Поля текстового файла информации:
1 - Полное или краткое имя текстуры
2 - прозрачный цвет, допускается указание без и с альфа каналом
3 и 4 - ширина и высота
5 - Алфавит, все буквы по порядку, как они нарисованы
6 - текстурные координаты в пикселях для каждой буквы, TRect

procedure DXLoadRasterFont(infoName: string; var RFont: DXRasterFont);
procedure DXOutRasterText(Text: String; x,y: Single; Size: single; Color: DWORD; Flag: DWORD; RFont: DXRasterFont);


Флаг DXRFONT_BREAK = 1; авто переход на следующую строку при выходе за правую границу окна.
Работает коряво! Поэтому ставим 0 и не паримся.
Утилиту для составления растрового шрифта из векторного и из кусочков(например нарисованных в photoshop) напишу позже.

И да сам модуль выложу тоже чуть позже.


Пример работы с растровым текстом + новая библиотека движка для упрощенной работы с WinAPI окном.
Вложения
Тип файла: rar ResterFont.rar (49.2 Кб, 60 просмотров)

Последний раз редактировалось Kostia; 08.07.2009 в 20:08.
Kostia вне форума Ответить с цитированием
Старый 09.07.2009, 15:19   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Простите за оффтоп. Костя, а в связи с чем на аватарке логотип Убунту? Начал программить под линукс?
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)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 09.07.2009, 15:40   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Угу, любитель Си и бесплатного софта=). А Ubuntu мой любимый дистрибутив, в KDE были проблемы с драйвером для видеокарты с поддержкой CUDA, или у меня просто кривые руки, но на Убунту все стразу встало.
---------------
Сейчас ковыряю книжку по ассемблеру, ищу способы оптимизации, еще возможно добавлю выбор, использовать процессор для задания вершин и текстурных координат или шейдер(если напишу, еще не разу не работал), производительность в случае шейдера должна увеличиться на порядок.
И да если будет время, то напишу справку по функциям.
Kostia вне форума Ответить с цитированием
Старый 11.07.2009, 14:36   #10
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Веду активную оптимизацию работы с графикой. Добавил способ реализации системы частиц, а именно вывод большого кол-ва точек с текстурой.
200000 частиц ~25 кадров/секунду. Достиг такого результата благодаря распараллеливанию работы процессора и видеокарты. Разбил буфер вершин на сегменты по 200 вершин, всего 5 сегментов(~20кб он занимает в памяти). Когда видеокарта ведет рендеринг сегмента, процессор копирует новую партию вершин в следующий сегмент.(так на заметку)
Вывод обычных спрайтов тоже ускорился. 20000 спрайтов 31 кадров/секунду.
Посмотрим, может еще что оптимизирую...

procedure DXDrawParticles(const ParticleArray: PChar; N: integer; const Texture: IDirect3DTexture9);
Процедура для рисования массива частиц с текстурой. Каждый элемент массива должен быть 20байт, или проще? такого типа:
Код:
  sParticleVertex = record
    Position: DXVector3f;
    Size: single;
    Color: DWORD;
  end;
Код:
var
  paticles:array[1..N]of sParticleVertex;
begin
  for i:=1 to N do
  begin
    paticles[i].Position:=DXVector3(random(800),random(600),0);//позиция
    paticles[i].Size:=0.01+random(1000)/10000;//размер(size/height для точного размера)
    paticles[i].Color:=$16161616 or DWORD(random($FFFFFFFF));//цвет точки
  end;
  DXDrawParticles(@paticles,N,Star); //N-кол-во частиц; Star - текстура
end.
Частицами можно рисовать карту состоящую из тайлов, создавать эффекты...
Плохо то, что точку нельзя поворачивать, и задать текстурные координаты.

В архиве только 2 библиотеки.
Вложения
Тип файла: rar Mini2D.rar (7.0 Кб, 62 просмотров)
Kostia вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уроки по использованию Direct3D в Delphi Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 32 23.02.2010 17:48
Перспектива в Direct3D Ulex Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 11.03.2008 01:04
Aquatica engine MagicIndie Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 23.04.2007 18:33