Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

Шрифт   Найти похожие ветки 

 
Evgeniy_K   (2004-07-21 20:04) [0]

У меня есть 4 битовая картинка - матрица букв. Я хочу ее использовать для составления слов, чтобы эффективней было, как лучше сделать? Попиксельно альфаканал накладывать - имхо, не оптимально. Есть ли другой вариант? Direct Draw - JEDI


 
cyborg ©   (2004-07-21 20:09) [1]

Не понятно.
Шрифт - обыкновенная поверхность с цветовым ключём. Каждую букву выводишь на другую поверхность.


 
Evgeniy_K   (2004-07-21 20:24) [2]

Шрифт представляет собой четырехбитовую картинку. Чем ярче пиксель, тем выше прозрачность. Т.е. картинка-маска задает альфа канал.

Как работает:
Я выбираю цвет. И потом нужно цветом вывести шрифт, шрифт выводится ч/з маску. Например, черный пиксель - выбранный цвет. Чем светлее пиксель, тем выше его прозрачность, т.е. у меня будет шрифт не монотонный, а с переходами. Где белый цвет - там прозрачные места. Так понятно?


 
cyborg ©   (2004-07-21 20:29) [3]

Думаю, что такой шрифт будет тормозить игру.


 
Evgeniy_K   (2004-07-21 20:39) [4]

тема закрыта


 
Evgeniy_K   (2004-07-21 20:40) [5]

не будет, ибо рендерится он будет при загрузке, а потом хранится в памяти.


 
OSokin   (2004-07-21 20:59) [6]

Не понял... У меня было куда все проще... Я просто брал байт или два, расписывал их побитно, брал каждый бит поотдельности, смотрел: 1 - inverted, 0 - transparent...


 
Белый Крыс ©   (2004-07-21 22:25) [7]

2 Evgeniy_K  
Куда рендериться???
Когда будет происходить вывод шрифта на экран, результируемый цвет пикселя должен просчитываться, используя текущий цвет пиксела и уровень прозрачности (альфы). Понятное дело, это будет происходить каждый кадр.


 
ПсихЪ_задумчивый   (2004-07-22 10:22) [8]


> Белый Крыс ©   (21.07.04 22:25) [7]

Лучше для каждой строки или всей текстовой области делать отдельную поверхность. Цвет букв задавать следующим образом.
1.1 Буквы - белые на чёрном фоне (белый - колоркей)
1.2 Поверхность для нанесения текста (колоркей - цвет фона букв, чёрный)
2. Выбираем цвет букв - зелёный
3. Закрашиваем поверхность для нанесения текста зелёным цветом
4. Наносим (блитим, отрисовываем) на эту поверхность буквы с флагом колоркея
5. Получаем зелёные буквы на чёрном фоне
6. Рисуем поверхность куда следует с флагом колоркея
7. Получаем зелёные буквы на нужном вам фоне
8.1 Если текст неизменен - повторяем 6
8.2 Иначе - 2


 
Белый Крыс ©   (2004-07-22 14:18) [9]

2 ПсихЪ_задумчивый
:) Спасибо. Но вот только первая строчка должна быть не
> Белый Крыс ©   (21.07.04 22:25) [7],
а Evgeniy_K.
Но, я сказал - уровень прозрачности. Т.е. в данном случаем твой способ не подойдет. Потому что требования другие. Нужен не прозрачный фон, а прозрачные буквы. Т.е. сквозь текст просматривался, скажем там, инвентарь. Что касается DirectDraw. То тут можно использовать не BitMap fonts, а обычные. Рисовать WinAPI"вской функцией.


 
ПсихЪ_задумчивый   (2004-07-22 14:48) [10]


> Белый Крыс ©   (22.07.04 14:18) [9]

Если ты ещё раз внимательно прочтёшь всё, что я написал и разберёшь каждый пункт, и тех, которые я написал, то явственно увидишь, что:
1. На БэкБуффер выводятся буквы выбранного в пункте 2 цвета с прозрачным цветом.
2. Градиентной прозрачности, затухающих краёв и ново-хитрых альфа-каналов нет для максимального быстродействия (используется исключительно игра цветовыми ключами).


 
Белый Крыс ©   (2004-07-22 15:32) [11]

2 ПсихЪ_задумчивый
(((((((;
Если ты ещё раз внимательно прочтёшь всё, что я написал и разберёшь это, то ты увидешь, что я говорю именно про затухающих краёв, полупрозрачность самих и букв и т.д.
:))
Я прекрасно понял твои слова, потому и говорю что в данном случае с учетом требований о "полупрозрачности и т.д." этот способ не подходит.
Интересно, что будет быстрее, твой способ или вот это

procedure DrawText2(const surf : IDirectDrawSurface7; hFont : HFONT; strText : PCHAR; OX, OY : DWORD; crForeground : COLORREF);
var
   DC : HDC;
   hr : HRESULT;
begin
 DC := 0;
 if( ( surf = nil ) or ( strText = nil ) ) then Exit;
 hr := surf._Restore;
 if( FAILED( hr ) ) then Exit;
 hr := surf.GetDC( DC );
 if( FAILED( hr ) ) then Exit;
 SetBkMode(DC, TRANSPARENT);  /// Обрати внимание
 SetTextColor( DC, crForeground );
 if( hFont <> 0 ) then SelectObject( DC, hFont );
 TextOut( DC, OX, OY, strText, length(strText) );
 hr := surf.ReleaseDC( DC );
 if( FAILED( hr ) ) then Exit;
end;

??


 
ПсихЪ_задумчивый   (2004-07-22 16:36) [12]


> Белый Крыс ©   (22.07.04 15:32) [11]

Мой способ будет быстрее и обладать большими возможностями, ибо позволит использовать нарисованные заранее формы шрифтов. Нарисованные так, как нужно разработчику, а не так, как отрендерит пользовательская винда.

В задании сказано, что нужно просто заранее выводить с антиалиасингом битмэпнутые шрифты. Но в четыре байта данные о полупрозрачности не воткнёшь, и автор не хочет юзать попиксельную прорисовку...


 
Белый Крыс ©   (2004-07-22 17:14) [13]

>нарисованные заранее формы шрифтов
Это как? Какие формы. Ну я тоже могу любые шрифты и "формы" использовать :).
>так, как отрендерит пользовательская винда.
Не хочу удивить сильно, но она отрисует текст "так, как нужно разработчику". Я этому не удивлен и проблем с этим не встречал.
А вот ЧТО сказано в задании:
Чем ярче пиксель, тем выше прозрачность. [2] Так более того, эти 4 байта и ЕСТЬ данные о прозрачности. Т.е. именно рисуется буква, которая (именно сама буква, а не фон) полупрозрачна. Как сказано в том же 2 посте, там где белый - там прозрачно, черный - непрозрачно, а градации серого - уровни прозрачности, чем светлее, тем прозрачнее(по-крайней мере так написано).
Потому и задан был вопрос. Ведь как сделать ключевые цвета и так ясно, тем более что в принципе  твой вариант автор сам же и изложил [2].
Что касается моей процедуры, это как замена твоего способа(без полупрозрачности), т.е. без bitmap шрифтов.


 
ПсихЪ_задумчивый   (2004-07-22 17:21) [14]


> Белый Крыс ©   (22.07.04 17:14) [13]

Дык с полупрозрачностью на DirectDraw и так ясно - она тормозная, как мой комп. (: Даже если использовать специальные функции, написанные на С++ (http://), это всё равно не помогает.
Поэтому остаётся только использование разноцветный битмэпнутых шрифтов без антиалиасинга. Вот я и предложил метод. А системные шрифты - это отстой некрасивый, подойдёт исключительно для вывода на экран отладочной инфы.


 
ПсихЪ_задумчивый   (2004-07-22 17:23) [15]

Забыл ссылку дописать: http://tzlab.amillo.net/?desc=cpp/directx.htm - AlphaDLL - несколько функций отрисовки прозрачности, написана на С++, в архиве примеры использования на С++ и на Delphi. Если нужны исходники - в мыло.


 
Белый Крыс ©   (2004-07-22 17:33) [16]

Так бы сразу ;). Просто автор изначально указал о полупрозрачных шрифтах.  
>отстой некрасивый
Те же рисованный только в профиль. :)
Почему, да потому что рисованный разве что scale"ом увеличивать, а обычные - лучше.
Потому лучше всего сразу брать отрисованный нужным цветом со всеми затенениями и эффектами шрифты и рисуютсю с колоркеем - самое быстрое и КАЧЕСТВЕННОЕ.
Твои способ не предложит букв с эффектами.
Спасибо. Ссылку не надо. Я это уже бросил.


 
cyborg ©   (2004-07-22 18:09) [17]

Ладно спорить, мы вчера в аське решили проблему ;), там не прозрачность нужно было ему.


 
Evgeniy_K   (2004-07-23 10:37) [18]

полупрозрачность я иначе реализовал ;), а то что мне нужно здесь было, мы с киборгом уже решили :)



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.489 c
14-1098496438
SergP
2004-10-23 05:53
2004.11.14
Зацените перл...


8-1092082366
Константинов
2004-08-10 00:12
2004.11.14
Run time вставить субтитры в фильм реально ли?


4-1096899008
OlegL
2004-10-04 18:10
2004.11.14
Кассовые апараты


3-1097640812
sapsi
2004-10-13 08:13
2004.11.14
Раскрашивание грида


14-1098424495
Polevi
2004-10-22 09:54
2004.11.14
зенит чемпион





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский