· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.DIRECTX.OPENGL —› Как вывести текст в DirectX

Посл.отвђт Сообщенiе


Дата: Июл 25, 2003 12:59:39

Как просто и без затей вывести немного текста на поверхность в нужном месте? Чтоб мона было шрифт задать и чтоб не мерцало.


Дата: Июл 25, 2003 15:23:43

Если совсем без затей, то банально TextOut. Для многих простых применений, типа отладки, GDI вполне подходит... Правда, иногда изрядно тормозит...


Дата: Июл 25, 2003 16:10:15

Никакого GDI в DirectX применять ненужно !
Я уже отослал очередную статью об использовании текста в DirectX. Это именно то что тебе нужно. Надеюсь что через пару дней она будет опубликована.


Дата: Июл 25, 2003 16:54:47

> Надеюсь что через пару дней она будет опубликована
Но fuck, мне надо щас а не через два дня =)
Сложно чтоли куском сорца кинуться, не думаю что там больше десяти строк будет.


Дата: Июл 25, 2003 18:56:38

До седьмых директдров можео было у сурфейса получить DC, а на него уже GDIшными функциями пихать и линии и текст.
А вот в как на 8 и больше сам понятия не имею, даже в хелпах с MS DX8 SDK не нашел.
Вообще-то в играх делают так: Загоняют в битмам картинку со всеми буквами алфавита(типа таблица), а оттуда уже копируют на сурфейс.


Дата: Июл 26, 2003 14:45:05 · Поправил: Безпощадный даос

>Но fuck, мне надо щас а не через два дня =)
>Сложно чтоли куском сорца кинуться, не думаю что там >больше десяти строк будет.

Специально для всех нетерпеливых :) выкладываю сабж.
Использование данного сабжа не освобождает вас от просмотра полноценной статьи
по этому вопросу :)
 0. Подготовка
 -------------
   Подключаем файл font.inc
   ( все используемые функции будут вызываться из d3dx8d.dll )

 1. Создание шрифта
 -------------------

  .DATA

  ;LOGFONT ------------------------------; Параметры шрифта
   lfHeight          dd 16                ; Размер 
   lfWidth           dd 0                 ; 
   lfEscapement      dd 0                 ;
   lfOrientation     dd 0                 ;
   lfWeight          dd FW_BOLD           ;
   lfItalic          db 0                 ;
   lfUnderline       db 0                 ;
   lfStrikeOut       db 0                 ;
   lfCharSet         db DEFAULT_CHARSET   ; Кодировка по умолчанию
   lfOutPrecision    db 0                 ;
   lfClipPrecision   db 0                 ;
   lfQuality         db 0                 ;
   lfPitchAndFamily  db 0                 ;
   lfFontName        db "verdana",0       ; Имя шрифта

  .DATA?
   
   pd3dFont          dd ?
   
  .CODE              ; Без Direct3DDevice шрифт создать нельзя   
  
   invoke  D3DXCreateFontIndirect, pd3dDevice, ADDR lfHeight , ADDR pd3dFont

 2. Отрисовка текста
 -------------------

   .DATA
    
    szText        db "Специально для всех нетерпеливых :)",0

    TextLeft      dd 100    ; Прямоугольник для вывода текста
    TextUp        dd 100    ;
    TextRight     dd 0      ;
    TextBottom    dd 0      ; 

    .CODE
   
    d3dxfont8 DrawTextA, pd3dFont, ADDR szText, -1 , \
                         ADDR TextLeft , DT_NOCLIP , 0FFFFFFFFh          


 3. Замочить все связанное с текстом
 -----------------------------------

    .CODE
    
    d3dxfont8 Release, pd3dFont


Также это можно взять здесь:


_345790448__DirectX_Text.zip


Дата: Июл 27, 2003 01:01:44

Мля, fuckup опять, нету у меня Direct3DDevice и быть не может - приложение то DirectDraw использует а не Direct3D :(
А прога чужая и в бинарнике, так штаа ее особо не перепишешь.


Дата: Июл 28, 2003 11:52:21

>Мля, fuckup опять, нету у меня Direct3DDevice и быть не может - приложение то DirectDraw использует а не Direct3D :(

Надо быть поточнее в своих вопросах. Так сразу бы и написал.

GanDJuStasправ. До восьмого Direct'а, рисовать на сурфейсе можно через GetDC, но только на BackSurface и затем Flip'ом показывать. Если сразу на экран, тогда мерцание обеспечено.

Насчет тормозов bsl_zcs тоже правильно заметил. Это все таки GDI, а не Direct3D.

В восьмом директе и выше, если не ошибаюсь, DirectDraw вообще упразднили за ненадобностью. Отрисовка всех 2D элементов производится через 3D без координаты Z. Если он как-то и присутсвует, то в виде завуалированных Surface'ов до которых добираться...

Скорее всего у тебя приложение использующее директ не выше седьмого. А с ним дорога одна - GDI и GetDC.

>А прога чужая и в бинарнике, так штаа ее особо не перепишешь.

А как ты в нее вообще собираешся что-то дополнительно напихать?


Дата: Июл 28, 2003 13:27:14

Да, прога юзает седьмой DirectDraw, где хранится адрес back-buffer я знаю, но мне интересно куда тут девать GetDC() - эдак я похоже на primary-surface буду рисовать а не на заднем. Ы?
А дополнительное я собираюсь напихать в отдельную dll а потом запатчить прогу чтоб она дергала из нее функции ;)


Дата: Июл 29, 2003 00:41:29

Так у тебя адрес или указатель?

Если указатель на back-Buffer, тогда берем методом DirectDraw контекст Surface'а: GetDC, lpDDSBackSurface, ADDR hdc
Рисуем...
Ну а потом освобождаем методом DirectDraw контекст Surface'а: ReleaseDC, lpDDSBackSurface, hdc
Думаю ты это и без меня знаешь

С Dll хитро :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078