Про DirectDraw7

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Про DirectDraw7

Сообщение 13GHOST » 09.05.2005 (Пн) 9:50

Подскажите как сделать програчность картинки в диапазоне цветов, т.е. имеем битмап надо его загрузить так чтобы сделать програчным не какой-то один цвет, а диапазон цветов, например от RGB(240,240,240) до RGB(255,255,255) :?:
З.Ы В DirectDraw7...

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 10.05.2005 (Вт) 10:21

Блин, неужели никто не знает :(

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 10.05.2005 (Вт) 14:41

После загрузки картинки в поверхность DirectDraw (с помощью CreateSurfaceFromFile, например), ты можешь выставить диапазон прозрачных цветов для данной поверхности с помощью метода SetColorKey поверхности. Например так:

Код: Выделить всё
Dim dd As DirectDraw7
Dim ddsd2 As ddsd2 As DDSURFACEDESC2
Dim key As DDCOLORKEY
Dim DXLoadSprite As DirectDrawSurface7

ddsd2.lHeight = 32
ddsd2.lWidth = 32
Set DXLoadSprite = dd.CreateSurfaceFromFile("sprite.bmp", ddsd2)
   
key.low = &h000000
key.high = &h00FF00
DXLoadSprite.SetColorKey DDCKEY_SRCBLT, key


Вот только точно не помню насчет low и high что там первое, а что второе... Поэкспериментируй в общем :) [/code]
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 10.05.2005 (Вт) 14:43

Упс, ну в общем вторая строка:

Код: Выделить всё
Dim ddsd2 As DDSURFACEDESC2


:lol:
То, что для одних константа, для других только переменная...

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 10.05.2005 (Вт) 18:31

Дык я тоже так думал а на практике не фига не получается, прозрачный цвет опредиляется только свойством low а high вообще хоть какой ставь, все равно один цвет прозрачным делает :(

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 10.05.2005 (Вт) 18:32

Дык я тоже так думал а на практике не фига не получается, прозрачный цвет опредиляется только свойством low а high вообще хоть какой ставь, все равно один цвет прозрачным делает :(

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 11.05.2005 (Ср) 0:07

Да? Хм... В принципе я только один цвет юзал для транспарента :? Ладно, почитаю на досуге документаху от мелкомягких - может что нарою...
То, что для одних константа, для других только переменная...

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 11.05.2005 (Ср) 17:43

Я был бы очень благодарен :)

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 24.11.2005 (Чт) 13:39

Ндя... Многовато времени прошло, конечно. Тут вот какая штука... Недавно я снова наткнулся на те же грабли и решил найти этот топик. В общем вся проблема в том, что VB-шная RGB возвращает цвет в 24-битном представлении. А DirectDraw работает как правило в 16-битном. Отсюда и глюки с выставлением диапазона прозрачности. В low и high нужно выставлять цвет именно в той глубине цветности, в которой работает DirectDraw.
То, что для одних константа, для других только переменная...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 24.11.2005 (Чт) 22:30

Odrick, ты человека не путай. что значит "работае в основном в 16битном режиме"? Ужос! DD работает в том режиме, что задал программист и ни в каком другом.

Данный тим прозрачности осуществляется достаточно просто. Поверхность следует переносить попиксельно на приемник, исключая перенос точек с необходимым цветовым ключом.
ХЎ

Дезертир
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 15.12.2005 (Чт) 1:48

Сообщение Дезертир » 22.12.2005 (Чт) 0:35

d3drm, к тебе посоветовали обратиться со следующими вопросами:
1. Как спрайт на экране повернуть, отразить по вертикали\горизонтали, что б не создавать лишние кадры анимации с соответствующим поворотом?
2. Как получить цвет любого пиксела в любом спрайте или хотя бы узнать, прозрачен этот пиксел на экране или нет?
И всех прошу ответить, кто знает
И еще: где взять документацию по ДХ от мелкомягких, про кот. все говорят?
Даешь нормальные программы в Винды!

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Re: Про DirectDraw7

Сообщение ReMAG » 22.12.2005 (Чт) 0:44

13GHOST писал(а):Подскажите как сделать програчность картинки в диапазоне цветов, т.е. имеем битмап надо его загрузить так чтобы сделать програчным не какой-то один цвет, а диапазон цветов, например от RGB(240,240,240) до RGB(255,255,255) :?:
З.Ы В DirectDraw7...


Чего-то я не въеду. :) Пространство цветов в RGB - 3-хмерное. Как можно указать диапазон точек в 3D через 2 точки ("от RGB(240,240,240) до RGB(255,255,255)")?.. И какие цвета находятся между RGB(r1, g1, b1) и RGB(r2, g2, b2)?
Никогда не говори "никогда"...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.12.2005 (Чт) 1:24

2d3drm - ладно-ладно, это я неверно выразился. А по поводу:

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

это, извините, ерунда ;) Именно для того, чтобы не делать это попиксельно для каждой поверхности можно (и нужно) выставлять диапазон псевдопрозрачного цвета, который не переносится при блиттинге с соответствующим параметром.

1. Как спрайт на экране повернуть, отразить по вертикали\горизонтали, что б не создавать лишние кадры анимации с соответствующим поворотом?

если имеется в виду поворот с помощью 3D, то это действительно к d3drm. Если интересен поворот с помощью DirectDraw могу подсуетить свою функцийку (которая переделана, правда, из одного примера).

2. Как получить цвет любого пиксела в любом спрайте или хотя бы узнать, прозрачен этот пиксел на экране или нет?

элементарно с помощью GetLockedPixel. Например:

Код: Выделить всё
    Dim ReсTmp As RECT
   
    RecTmp.Left = 0
    RecTmp.Top = 0
    RecTmp.Right = 32
    RecTmp.Bottom = 32
   
    Sprite.Lock RecTmp, ddsd2, DDLOCK_WAIT, 0
    nColor = Sprite.GetLockedPixel(nX, nY)
    Sprite.Unlock RecTmp


то есть - лочим поверхность (Sprite), получаем цвет пиксела, разлочиваем поверхность.

Чего-то я не въеду. Пространство цветов в RGB - 3-хмерное. Как можно указать диапазон точек в 3D через 2 точки ("от RGB(240,240,240) до RGB(255,255,255)")?.. И какие цвета находятся между RGB(r1, g1, b1) и RGB(r2, g2, b2)?


? Ты действительно так думаеш??? :lol:
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.12.2005 (Чт) 13:09

Уф... Отсмеялся, отоспался.... Теперь, пожалуй, попробую объяснить:

RGB(240,240,240) = &hF0F0F0 = 15790320
RGB(255,255,255) = &hFFFFFF = 16777215

Думаю, как найти диапазон от 15790320 до 16777215 понятно? ;)
То, что для одних константа, для других только переменная...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.12.2005 (Чт) 13:16

Odrick писал(а):Думаю, как найти диапазон от 15790320 до 16777215 понятно? ;)

Неправильно.
Надо инкрементировать составляющие.
Для наводки проанализируй разницу между 255 и 256.
Lasciate ogni speranza, voi ch'entrate.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.12.2005 (Чт) 15:51

Дык... Само собой. Я просто пытаю объяснить человеку, что

Пространство цветов в RGB - 3-хмерное. Как можно указать диапазон точек в 3D через 2 точки ("от RGB(240,240,240) до RGB(255,255,255)")?..


это несколько неправильное утверждение ;)
То, что для одних константа, для других только переменная...

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 22.12.2005 (Чт) 16:06

Чего-то я не въеду. Пространство цветов в RGB - 3-хмерное. Как можно указать диапазон точек в 3D через 2 точки ("от RGB(240,240,240) до RGB(255,255,255)")?.. И какие цвета находятся между RGB(r1, g1, b1) и RGB(r2, g2, b2)?

? Ты действительно так думаеш??? :lol:


Да, действительно так :lol:
Никогда не говори "никогда"...

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 22.12.2005 (Чт) 16:07

Odrick писал(а):Дык... Само собой. Я просто пытаю объяснить человеку, что

Пространство цветов в RGB - 3-хмерное. Как можно указать диапазон точек в 3D через 2 точки ("от RGB(240,240,240) до RGB(255,255,255)")?..


это несколько неправильное утверждение ;)


А как правильно?
Никогда не говори "никогда"...

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 22.12.2005 (Чт) 16:13

alibek писал(а):
Odrick писал(а):Думаю, как найти диапазон от 15790320 до 16777215 понятно? ;)

Неправильно.
Надо инкрементировать составляющие.


Это уже ближе к моему пониманию. То есть, любой цвет RGB(r3, g3, b3), для которого выполняется
r1 < r3 < r2; g1 < g3 < g2; b1 < b3 < b2;
в данном контексте находится между RGB(r1, g1, b1) и RGB(r2, g2, b2).
Но разве есть готовый метод так сравнивать цвета, кроме как самому попиксельно проверять все эти условия?

p.s. Кстати, в таком случае этот диапазон в 3d - куб, заданный двумя противоположными вершинами (r1, g1, b1) и (r2, g2, b2) с гранями, параллельными осям координат.
Последний раз редактировалось ReMAG 22.12.2005 (Чт) 16:25, всего редактировалось 1 раз.
Никогда не говори "никогда"...

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 22.12.2005 (Чт) 16:22

Odrick писал(а):Уф... Отсмеялся, отоспался.... Теперь, пожалуй, попробую объяснить:

RGB(240,240,240) = &hF0F0F0 = 15790320
RGB(255,255,255) = &hFFFFFF = 16777215

Думаю, как найти диапазон от 15790320 до 16777215 понятно? ;)


Раз отсмеялся, то задумайся, а лучше нарисуй рядом цвета &hF0F0F0 = 15790320, &hFFFFFF = 16777215, и, например, &hF42400 = 16000000 и ответь на вопрос: находится ли третий цвет между вторым и первым, или это только сначала так казалось.
Никогда не говори "никогда"...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.12.2005 (Чт) 17:08

Раз отсмеялся, то задумайся, а лучше нарисуй рядом цвета &hF0F0F0 = 15790320, &hFFFFFF = 16777215, и, например, &hF42400 = 16000000 и ответь на вопрос: находится ли третий цвет между вторым и первым, или это только сначала так казалось.

Для DirectDraw - да, находится. И считается прозрачным при блиттинге поверхности с флагом DDBLTFAST_SRCCOLORKEY. Мы говорим о численном представлении цвета, а не о визуальном его отображении. В конце концов, никто тебе не мешает поэкспериментировать прежде чем спорить. Тем более спор уже ушел из области технической реализации псевдопрозрачности в DirectDraw в область умозрительных рассуждений. Вот неплохая статейка, в которой затрагивается этот вопрос а также решение проблемы цветовых ключей в 16-битном режиме http://www.realcoding.net/article/view/12 . Правда на Delphi, но это не проблема, надеюсь. Советую почитать, провести парочку экспериментов с DirectDraw, после чего можем продолжить наш диалог.
То, что для одних константа, для других только переменная...

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 22.12.2005 (Чт) 17:31

Прочитал. Секцию Transparency. Ключи прозрачности и технические аспекты реализации псевдопрозрачности в DirectDraw - это, конечно, хорошо, но я, собственно, как здесь уже заметил уважаемый Odrick, не об этом.
Собственно, мысль: если подразумевается "численное представление цвета", то говорить "диапазон цветов, например от RGB(240,240,240) до RGB(255,255,255)" не есть правильно. В таком случае корректнее "от &hF0F0F0 до &hFFFFFF". Тогда понятно, о чем идет речь.
Никогда не говори "никогда"...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.12.2005 (Чт) 17:41

Гм... Ну смотря как воспринимать информацию RGB(240,240,240) (если говорить о VB-шной функции) как раз возвращает &hF0F0F0 ;) Так что это одно и то же. Кстати, есть ли возможность сделать побитовый сдвиг числа средствами API? Че-т я такого не припоминаю... Хочется сделать аналог того, что описано в указанной статье для VB...
То, что для одних константа, для других только переменная...

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 22.12.2005 (Чт) 18:14

Odrick писал(а):Гм... Ну смотря как воспринимать информацию RGB(240,240,240) (если говорить о VB-шной функции) как раз возвращает &hF0F0F0 ;) Так что это одно и то же.


Если я хочу написать 1 (т.е. число один), я пишу 1, а не cos(0), хотя это и одно и то же, в т.ч. и если говорить о VB-шной функции. А если я пишу cos(0), то я что-то этим подразумеваю.

Odrick писал(а):Кстати, есть ли возможность сделать побитовый сдвиг числа средствами API? Че-т я такого не припоминаю... Хочется сделать аналог того, что описано в указанной статье для VB...


Такой API нет, насколько я знаю. Можно использовать "* 2^n" и Mod, "/ 2^n", например. Или еще как поизвращаться. В VB 2005 эта функция появилась. Наконец-то :)
Никогда не говори "никогда"...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.12.2005 (Чт) 18:30

Угу, именно. Пока добрался до форума уже сам сообразил, что гоню и можно обойтись простыми математическими операциями :) Оки, постараюсь выжать немного времени и написать функцийки для перевода цвета из 24-битного в 16-битный режим и обратно с привязкой к видеокарточке конкретной машины.
То, что для одних константа, для других только переменная...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 22.12.2005 (Чт) 20:20

Вопрос - нафига вообще задавать диапазон цветов, если потом все эти цвета будут прозрачными, то есть неразличимыми. Можно после загрузки заменить все эти цвета на один, и задать его прозрачным, или вообще переписать цвета в файле.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.12.2005 (Чт) 20:37

Ну это вопрос не ко мне. Я всегда использую один цвет как транспарент. А именно r=0, g=0, b=0. Ибо только при его использовании гарантировано транспарент будет транспарентом при любой глубине цвета. Но видимо человеку нужно было ;) А по поводу замены при загрузке - а зачем делать лишнюю работу, если это может (и должен) делать DirectDraw?
То, что для одних константа, для других только переменная...

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Сообщение Drag » 04.02.2006 (Сб) 12:51

Я в графических файлах использую цвет RGB(0,0,0) как прозрачный и RGB(1,1,1) как черный непрозрачный. Но такая вот проблема с транспарентом: помещаю
Код: Выделить всё
Dim ddtrans1 As DDCOLORKEY
ddtrans1.low = RGB(0, 0, 0)
ddtrans1.high = RGB(0, 0, 0)
Surface.SetColorKey DDCKEY_SRCBLT, ddtrans1

в процедуру создания поверхности из графического файла, затем с помощью нее создаю поверхность из bmp, но прозрачным считается диапазон(!!!) цветов от RGB(0,0,0) до RGB(7,7,7) :?. С помощью PhotoImpact'a прощелкал все зоны с цветом RGB(1,1,1) - они таковыми и являются, т.е. имеют цвет RGB(1,1,1). Последовательно увеличивая значения цветов, я увидел, что прозрачность теряется только при значении цвета >=8. Раньше такого не было...
И еще - делаю заливку поверхности цветом RGB(250,0,0) - она заполняется СИНИМ цветом. Исользую полноэкранный режим 1024x768x32

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 04.02.2006 (Сб) 14:05

Ты в 16-битном попробуй... ;)
То, что для одних константа, для других только переменная...

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Сообщение Drag » 04.02.2006 (Сб) 14:09

Пробовал. Да и к тому же в этом же режиме совсем недавно все работало великолепно

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 111

    TopList