XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Желтая пресса: обучающие статьи
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

 
DimP

offline
Опыт: 1,741
Активность:
Прорисовка текста с помощью DirectX api (для новичков)

Инструменты:


Directx SDK (Microsoft.com)
Microsoft Visual Studio (нужен VC++)(Microsoft.com)
D3D Starterkit by Azorbix (В архиве)

Подготовка:


Будем считать что MVS и DirectX sdk уже скачаны и установлены.
Запускаем VC++, идем tools->options, выбираем вкладку directories и прописываем пути ко всем папкам из directx sdk.
(если у вас старая версия VC++ ,например 6.0, тогда скопируйте все файлы проекта в папку old worksplace ,и запустите TatniumD3D.dsw)

Для DirectX 9 приложений.


Для прорисовки текста можно писать свои функции, но я думаю для начала проще и надежнее использовать уже готовые.
Будем использовать d3dfont class by Azorbix. Копируем .h и .cpp файлы в папку с проектом, потом загружаем их (Project-> Add to Project -> Files).
Далее идем d3d9dev.cpp , и создаем две функции:

Код:
void InitD3D(IDirect3DDevice9 *m_pD3Ddev)
    {    
        if(g_pD3DFont == NULL)
            g_pD3DFont = new CD3DFont;
        g_pD3DFont->GenFont(m_pD3Ddev, "Courier New", 10, 0x4);
    }

    void CleanupD3D()
    {
        g_pD3DFont->Invalidate();
    }

Находим
Код:
IDirect3DDevice9::BeginScene()

Записываем туда
Код:
static bool bInitD3D = false;
     if(!bInitD3D) { bInitD3D = true; InitD3D(m_pD3Ddev); }

Находим
Код:
hkIDirect3DDevice9::Reset()

Записываем
Код:
CleanupD3D();
    HRESULT hRet = m_pD3Ddev->Reset(pPresentationParameters);
    if(hRet == D3D_OK) { InitD3D(m_pD3Ddev); }


Теперь мы можем использовать функцию AddFont()

Код:
g_pD3DFont->AddFont(x, y, D3DCOLOR_ARGB(a,r,g,b), FT_NONE, "Hello World");


Где x,y -позиция текста на экране, a,r,g,b цвет в формате argb.
Остальные два параметра это формат(можно использовать FT_CENTER, FT_BORDER), и собственно строка.

Для прорисовки созданного текста в IDirect3DDevice9::EndScene() нужно написать
Код:
g_pD3DFont->RenderAll();


Пример, рисуем Hello World в середине экрана



Объявляем переменные:
Код:
D3DVIEWPORT9 Viewport;  
float x ,y;


В BeginScene(): записываем середину экрана в x, y.
Код:
m_pD3Ddev->GetViewport(&Viewport); 
    x = (float)Viewport.Width/2; 
    y = (float)Viewport.Height/2;

В EndScene() :
Код:
g_pD3DFont->AddFont(x, y, D3DCOLOR_ARGB(200,200,200,200), FT_NONE, "Hello World!");
g_pD3DFont->RenderAll();



Для DirectX 8 приложений



Создайте проект с файлами из папки D3D8/.
Теперь создадим функцию рисующую текст.

Код:
LPD3DXFONT font = NULL;

void drawtext(LPD3DXFONT font_1, int x, int y, int a, int r, int g, int, CONST PCHAR text, ...)
{
  RECT pos;
  pos.left = X;
  pos.right = pos.left + 1001;
  pos.top = Y;
  pos.bottom = pos.top + 1001;
  CHAR Export[MAX_PATH] = "";
  va_list ArgList;
  va_start(ArgList, Text);
  _vsnprintf(Export, MAX_PATH, Text, ArgList);
  va_end(ArgList);
  if(font != NULL)
  font->DrawText(Export, -1, &pos, 0, D3DCOLOR_ARGB(A, R, G, B));
}

В BeginScene() пишем:

Код:
HFONT font_1 = CreateFont(15, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, 0, 0, PROOF_QUALITY, 0, "Verdana");
D3DXCreateFont(m_pD3Ddev, font_1, &font);


В EndScene () рисуем текст:
Код:
drawtext(font,x,y,255,255,255,255,"Hello World!");


Загрузчик


Компилируем dll ,теперь ее нужно внедрить в процесс.
Для этого можно использовать TatniumLoader из D3D Starterkit, или написать загрузчик самому.
Будем использовать TatniumLoader. Идем в папку Injector и запускаем проект.
Находим main.cpp ,в нем строку #define APP_EXE "target_application.exe"
И записываем название процесса приложения, в который надо поместить dll, вместо "target_application.exe" .

Думаю это пригодится для изготовления ingame меню и т.п.

Пример меню для WarCraft 3



Скриншоты:



Исходник и текстуры в архиве.
Прикрепленные файлы
Тип файла: zip Инструменты.zip (73.8 Кбайт, 106 просмотров )
Тип файла: rar Menu.rar (334.0 Кбайт, 106 просмотров )

Отредактировано DimP, 01.01.2010 в 20:17.
Старый 31.12.2009, 15:34
RazArt

offline
Опыт: 11,197
Активность:
И чё? Какая связь с варом? о_О
Старый 31.12.2009, 20:47
DragonSpirit
у - уходи
offline
Опыт: 22,625
Активность:
RazArt, мб для создания ingame меню в модах..
Старый 31.12.2009, 20:55
Nekit1234007

offline
Опыт: 11,916
Активность:
Новички будут делать
Цитата:
Сообщение от DragonSpirit
ingame меню в модах..
? Они новички же...
Старый 31.12.2009, 21:00
RazArt

offline
Опыт: 11,197
Активность:
Для этого есть целые учеблики по сипп и графике...
Старый 31.12.2009, 21:00
DimP

offline
Опыт: 1,741
Активность:
RazArt тут конкретные функции, готовые инструменты... Думаю посмотреть статью проще чем читать толстый учебник(и не один) с первой страницы. Связь с warcraft есть, т.к warcraft использует directx, 8.1 вроде.
Старый 31.12.2009, 21:31
RazArt

offline
Опыт: 11,197
Активность:
То есть ты хочешь вшить свои ф-ции в вар?)
А если серьёзно, то вар для винды, мб напишем какую-нибудь статью про неё?)
Старый 31.12.2009, 22:48
DimP

offline
Опыт: 1,741
Активность:
В теме "Темы написания статей" есть пункт "Взаимодействие внешних программ с движком Warcraft и его редактирование" ,статья должна помочь сделать "взаимодействие внешних программ с движком Warcraft" более понятным пользователю (GUI к какой-нибудь программе например). =)
Старый 31.12.2009, 23:01
Lazdakon
/dev/null
offline
Опыт: 43,970
Активность:
RazArt, солидарен. Статья не нужная, большая аудитория новичков и не только, этим не заинтерисуется. Некоторые даже не знают об этом.

Отредактировано Nething, 17.07.2010 в 11:31.
Старый 31.12.2009, 23:18
RazArt

offline
Опыт: 11,197
Активность:
DimP, напиши статью о вшивки в дллки вара сторонних ф-ций, тогда станет интересно
Старый 01.01.2010, 00:29
Cytaster

offline
Опыт: 3,757
Активность:
Можно скрины или примеры?
Старый 01.01.2010, 01:00
DimP

offline
Опыт: 1,741
Активность:
Sarcazi, добавил пример простенького меню и скриншоты.
Старый 01.01.2010, 20:18
ScorpioT1000
Работаем
offline
Опыт: отключен
для меню есть DGUI :P
Старый 02.01.2010, 05:26
DimP

offline
Опыт: 1,741
Активность:
ScorpioT1000, С помощью dgui можно рисовать меню для внешних программ ?
Старый 02.01.2010, 10:37
YellowStar
poon
offline
Опыт: 15,144
Активность:
Круче добавить блур эффект. Или сглаживания плюс анизатропные фильтрации.
Даешь такую модификацию!
Старый 02.01.2010, 12:30
SwuJe
aka Sakh_badboy
offline
Опыт: 15,238
Активность:
DimP, как это чудо вставить в вар?
Старый 02.01.2010, 13:16
FunkieFoO

offline
Опыт: 7,159
Активность:
сах а ты статью то прочитай :Р
статья хороша, автору респектище
Старый 02.01.2010, 13:25
DragonSpirit
у - уходи
offline
Опыт: 22,625
Активность:
Всё же респект :)
удобнее дгуи,но отдельная прога не есть гуд => только для модов
Старый 02.01.2010, 14:52
Sonic456

offline
Опыт: 943
Активность:
>Компилируем dll ,теперь ее нужно внедрить в процесс.
Для этого можно использовать TatniumLoader из D3D Starterkit, или написать загрузчик самому.
Будем использовать TatniumLoader. Идем в папку Injector и запускаем проект.
Находим main.cpp ,в нем строку #define APP_EXE "target_application.exe"
И записываем название процесса приложения, в который надо поместить dll, вместо "target_application.exe" .>
То есть, я так понимаю, Вар взламывать?
Старый 03.01.2010, 19:06
agentex

offline
Опыт: 34,834
Активность:
хрена себе.. а мы с дгуи мучаемся ^_^
хотя я подозреваю тут тоже не без косяков..
Старый 03.01.2010, 19:13

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

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

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 23:02.