Антон__
|
|
« Ответ #30 : 13-03-2009 21:20 » |
|
У меня не компилируется, для вывода текста требует спрайт. Какие у тебя директ икс и студия?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #31 : 13-03-2009 21:35 » |
|
DirectX 9 SDK Microsoft Visual C++ 6
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #32 : 14-03-2009 06:08 » |
|
По ходу дело выяснился что у меня старый DirectX 9 SDK. Это выяснилось на основании параметров функции DrawText у новой версии DirectX 9 SDK параметры этой функции немного другие.
В связи с этим маленький вопросик Как называется самая последняя версия DirectX из 9 серии?
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #33 : 14-03-2009 06:18 » |
|
directx sdk november 2008 У меня такая.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #34 : 14-03-2009 06:20 » |
|
Так ли тебе нужен 3д текст? Изучил бы ID3DXMesh или шейдеры.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #35 : 14-03-2009 06:58 » |
|
C 3D текстом всё впорядке в книге Франк Луна - Введение в программирование трехмерных игр с DX9 всё хорошо по этому поводу написано, а вот про вращение 2D-текста/3D-текста ни слова, ID3DXMesh и шейдеры яещё до них не дошёл в изучении DirectX, но дойду. я делаю всё постепенно.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #36 : 14-03-2009 07:10 » |
|
Прояснил этот вопрос самая последняя версия DirectX 9c SDK ноябрь 2008, более новые версии из 9 серии не придлагает скачать официальный сайт Microsoft.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #37 : 14-03-2009 09:41 » |
|
Я стёр старый DirectX 9 SDK и установил DirectX 9c SDK ноябрь 2008, но он автоматически не прикрепился к Microsoft Visual C++ 6, как старый DirectX 9 SDK.
Компилятор выдаёт ошибку
Compiling... text.cpp C:\Progs\Programming\VC\MyProjects\text\text.cpp(4) : fatal error C1083: Cannot open include file: 'd3d9.h': No such file or directory Error executing cl.exe.
text.exe - 1 error(s), 0 warning(s)
Я так понял в проекте нужно подключить папку include из состава DirectX 9c SDK ноябрь 2008, но как это сделать?
DirectX 9c SDK ноябрь 2008 установлен в C:\DXSDK\.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #38 : 14-03-2009 11:01 » |
|
Настроил 1. Запускаем Microsoft Visual C++ 6 2. Tools->Options...->Derictories 3. Добавляем C:\DXSDK\INCLUDE
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #39 : 14-03-2009 11:03 » |
|
ещё в LIB надо путь прописать
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #40 : 14-03-2009 11:34 » |
|
Почему-то я либы люблю прорисывать так#pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib")
А в новой версии DirectX это не работает так как та либы ещё делятся на x64 и x86.#pragma comment(lib, "x86\d3d9.lib") #pragma comment(lib, "x86\d3dx9.lib")
Но это не работает.Как правельно их подключить если можно через #pragma?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #41 : 14-03-2009 12:47 » |
|
так потому и надо путь прописать
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #42 : 14-03-2009 16:08 » |
|
Всё понял 1. Запускаем Microsoft Visual C++ 6 2. Tools->Options...->Derictories 3. Выбираем Library files 4. Добавляем C:\DXSDK\LIB\X86
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #43 : 14-03-2009 17:13 » |
|
Так как у меня новый DirectX 9c SDK ноябрь 2008 функцию вывода текста пришлось переписать.Было такvoid MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor) { RECT myRect; //переменная, которая будет задавать область вывода на экран LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = 25; // в логических единицах lf.lfWidth = 12; // в логических единицах lf.lfWeight = 500; // насыщенность, диапазон 0(тонкий) - 1000(жирный) lf.lfItalic = false; lf.lfUnderline = false; lf.lfStrikeOut = false; lf.lfCharSet = DEFAULT_CHARSET; lstrcpy(lf.lfFaceName, "Times New Roman"); // гарнитура шрифта
D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont); // координаты прямоугольнка myRect.left = x1; myRect.top = y1; myRect.right = x2; myRect.bottom = y2; // Вывод текста pFont->DrawText(TextString, -1,&myRect, DT_CENTER, TextColor); }
А стало такvoid MyTextOut(char *TextString, long x1, long y1, long x2, long y2, D3DCOLOR TextColor) { RECT myRect; //переменная, которая будет задавать область вывода на экран D3DXFONT_DESCA lf; ZeroMemory(&lf, sizeof(D3DXFONT_DESCA)); lf.Height = 25; // в логических единицах lf.Width = 12; // в логических единицах lf.Weight = 500; // насыщенность, диапазон 0(тонкий) - 1000(жирный) lf.Italic = false; lf.CharSet = DEFAULT_CHARSET; lstrcpy(lf.FaceName, "Times New Roman"); // гарнитура шрифта
D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);
// координаты прямоугольнка myRect.left = x1; myRect.top = y1; myRect.right = x2; myRect.bottom = y2; // Вывод текста pFont->DrawText(NULL, TextString, -1,&myRect, DT_CENTER, TextColor); }
Но почемуто у меня программа стала пожирать ресурсы компьютера?Для большего понимания проблемы прикрепляю файл
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #44 : 14-03-2009 17:25 » |
|
Есть мысль что я создаю шрифт на каждом выводе текста, а достаточно создать один раз, вот наверное из-за этого ресурсы компьютера и пожирает моя программа.
Если в этом дело, то как это поправить?
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #45 : 14-03-2009 20:40 » |
|
А в чём проблема? Взять и создать его один раз.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #46 : 14-03-2009 20:41 » |
|
Если заменить D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont); Наif (pFont == NULL) D3DXCreateFontIndirect(pDirect3DDevice, &lf, &pFont);
То программа перестаёт "жрать" ресурсы компьютера.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #47 : 14-03-2009 20:42 » |
|
Я правельно сделал или нет?
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #48 : 15-03-2009 07:10 » |
|
Правильно. Я тоже так делаю, когда мне лень выносить создание чего-то в отдельную функцию.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #49 : 15-03-2009 07:26 » |
|
Когда лень - рулят классы )
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #50 : 15-03-2009 09:49 » |
|
Я тоже буду пробовать сделать как класс, но в конце изучения основных аспектов DirectX, я не стал делать в виде классов сразу всеголишь по одной причине в книгах которые есть у меня все примеры без классов и я не хотел примеры переделывать под классы.
Так как с выводом текста разобрался приступаю к вращению текста.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #51 : 15-03-2009 12:57 » |
|
Вот нашёл пример в DirectX 9c ноябрь 2008 который называется Text3D и находится ...\Samples\C++\Direct3D\Text3D\Открыл файл text3d.cpp и там для вращения нашёл следующие фрагменты кодаКонешно у меня текст 2D, а в примере 3D, но я думаю это не принципиально // Глобальные переменные D3DXMATRIXA16 g_matObj1; D3DXMATRIXA16 g_matObj2;
// Прототип функции void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext );
INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, int ) { ... ... ... DXUTSetCallbackFrameMove( OnFrameMove ); ... ... ... }
//-------------------------------------------------------------------------------------- // This callback function will be called once at the beginning of every frame. This is the // best location for your application to handle updates to the scene, but is not // intended to contain actual rendering calls, which should instead be placed in the // OnFrameRender callback. //-------------------------------------------------------------------------------------- void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ) { // Setup five rotation matrices (for rotating text strings) D3DXVECTOR3 vAxis1( 1.0f,2.0f,0.0f ); D3DXVECTOR3 vAxis2( 1.0f,0.0f,0.0f ); D3DXMatrixRotationAxis( &g_matObj1, &vAxis1, ( float )fTime / 2.0f ); D3DXMatrixRotationAxis( &g_matObj2, &vAxis2, ( float )fTime );
D3DXMATRIX mScale; D3DXMatrixScaling( &mScale, 0.5f, 0.5f, 0.5f ); g_matObj2 *= mScale;
// Add some translational values to the matrices g_matObj1._41 = 1.0f; g_matObj1._42 = 6.0f; g_matObj1._43 = 20.0f; g_matObj2._41 = -4.0f; g_matObj2._42 = -1.0f; g_matObj2._43 = 0.0f; }
Не могу понять как эти куски кода заставляют вертется текст. Хотя когда запускаешь исполняемый файл текст прекрасно вертится (исполняемый файл находится ...\Samples\C++\Direct3D\Bin\x86\Text3D.exe) Что мне непонятно (это сразу бросилось в глаза):1. fTime ни где не инициализированна. 2. В строке DXUTSetCallbackFrameMove( OnFrameMove ); почему функции OnFrameMove не передаются параметры хотя они у неё есть. 3. Почему вертится постоянно текст ведь функция DXUTSetCallbackFrameMove запускается один раз при включении программы (В этом я не уверен) Такое ощущение что сначала сделали код скомпилировали и получили исполняемый файл, а затем убрали из фала с кодом строчки, или я тупой и не понимаю этот код.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #52 : 15-03-2009 15:14 » |
|
Так это DXUT - просто надстройка над директ иксом. Делаешь нужные функции(рисование кадра, обработка событий и т.д.) и передаёшь куда-то указатели на эти функции. А дальше DXUT сам всё обрабатывает:)
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #53 : 15-03-2009 20:38 » |
|
Я думал DXUT.h это стандартный заголовочный файл DirectX-a, а оказывается нет, это собственная разработка для примера и в примерах этого файла нет, так что будем другие примеры искать для вращения текста.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #54 : 15-03-2009 22:46 » |
|
Нашёл в примерах этот файл и другии которые нужны для клмпиляции, оказалось они лежат в другой папке, но в этих примерах так всё запутанно. Буду искать пример в другом месте.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #55 : 17-03-2009 22:38 » |
|
Оказалось
Чтобы вращать текст нужно сделать вывод текста через Mesh или Sprite (текстура с текстом на полигоне).
В примере из DirectX 9c ноябрь 2008 используется Mesh.
Я разделы DirewcX Mesh и Sprite (текстура с текстом на полигоне) ещё не проходил, как пройду так сразу выложу код для вращения текста, а пока я прерываюсь с вращением текста.
|
|
« Последнее редактирование: 18-03-2009 04:50 от zuze »
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #56 : 18-03-2009 17:12 » |
|
Решил вывести на экран 3D-текст, для этой цели использую Meshvoid MyTextOut(char *TextString) { // Получение дескриптора контекста устройства HDC hdc = CreateCompatibleDC(0); // Обявление переменную которая является экземпляром структуры LOGFONT lf; // Очищаем экземпляр структуры ZeroMemory(&lf, sizeof(LOGFONT)); // Заполняем экземпляр структуры lf.lfHeight = 25; // в логических единицах lf.lfWidth = 12; // в логических единицах lf.lfWeight = 500; // насыщенность, диапазон 0(тонкий) - 1000(жирный) lf.lfItalic = false; // false - означает курсив lf.lfUnderline = false; // false - означает подчеркивание lf.lfStrikeOut = false; // false - перечеркнутый шрифт lf.lfCharSet = DEFAULT_CHARSET; // Номер набора символов шрифта - таблицы кодировки lstrcpy(lf.lfFaceName, "Times New Roman"); // гарнитура шрифта
HFONT hFont; // Дискриптор создаваемого шрифта HFONT hFontOld; // Дескриптор старого шрифта
// Создаём объект HFONT на основе заполненной стрктуры hFont = CreateFontIndirect(&lf); // Делаем данный шрифт текущим шрифтом hFontOld = (HFONT)SelectObject(hdc, hFont);
// Указател на Меш LPD3DXMESH Text = NULL; // Создание трехмерной сетки, представляющую строку текста D3DXCreateText(pDirect3DDevice, hdc, TextString, 0.001f, 0.4f, &Text, 0, 0);
// Вывод текста Text->DrawSubset(0);
// Восстанавление бывшего до этого шрифта SelectObject(hdc, hFontOld); // Освобождение памяти указателя на шрифт DeleteObject(hFont); // Освобождение памяти дискриптора контекста устройства DeleteDC(hdc); // Освобождение памяти указателя на меш if (Text != NULL) Text->Release(); }
Но текст почему-то не выводится.Помогите пожалуйста разобраться?У меня по этому поводу две мысли:1. Надо задать цвет текста. 2. Текст выводится, но его не видно из-за двух вращающихся кубов . Для лучшего понимания прелагаю полный код
|
|
« Последнее редактирование: 18-03-2009 18:23 от zuze »
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #57 : 18-03-2009 20:24 » |
|
В моём коде по мимо вывода 3D-текста, есть ещё вращение двух кубом с освещением. Я подумал может они закрывают текст и что же я увидел когда я убрал из кода всё что относится к кубам.
В место слова "Hello" отображается "He", нижния координата левой стороны буквы 'Н' начинается от центра окна, а верхний правый кусочек буквы 'е' выходит за экран.
Пока не знаю как поправить, думаю, буду рад за помощь.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #58 : 18-03-2009 21:31 » |
|
Так как структура LOGFONT использовалась раньше, а теперь в DirectX 9.0c SDK ноябрь 2008 используется структура D3DXFONT_DESCA, хотя иногда и компилятор наструктуру LOGFONT не ругается. Я решил код вывода переписать void MyTextOut(char *TextString) { // Получение дескриптора контекста устройства HDC hdc = CreateCompatibleDC(0); HFONT hFont; // Дискриптор создаваемого шрифта HFONT hFontOld; // Дескриптор старого шрифта
hFont = CreateFont(0, 0, 0, 0, FW_NORMAL, 1, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Times New Roman"));
// Делаем данный шрифт текущим шрифтом hFontOld = (HFONT)SelectObject(hdc, hFont);
// Указател на Меш LPD3DXMESH Text = NULL; // Создание трехмерной сетки, представляющую строку текста D3DXCreateText(pDirect3DDevice, hdc, TextString, 0.001f, 0.4f, &Text, NULL, NULL);
// Вывод текста Text->DrawSubset(0);
// Восстанавление бывшего до этого шрифта SelectObject(hdc, hFontOld); // Освобождение памяти указателя на шрифт DeleteObject(hFont); // Освобождение памяти дискриптора контекста устройства DeleteDC(hdc); // Освобождение памяти указателя на меш if (Text != NULL) Text->Release(); }
Но всёравно текст выводится вот так В место слова "Hello" отображается "He", нижния координата левой стороны буквы 'Н' начинается от центра окна, а верхний правый кусочек буквы 'е' выходит за экран.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #59 : 19-03-2009 11:08 » |
|
zuze, Код в студию. Какую мировую матрицу ставишь?
|
|
|
Записан
|
|
|
|
|