-
Здравствуйте! Я пишу игрушку на Delphi и меня заинтересовал один интересный вопрос. Сейчас попробую пояснить, в чем проблема. На форме лежит Image и мне нужно в некоторых местах сделать его полностью прозрачным, а в некоторых полупрозрачным. Хочу сделать эффект - взрыва. Пожалуйста, помогите с проблемкой или дайте ссылку на исходник. Буду очень благодарен.
P.S. Сразу скажу, что компонентами DelphiX я не пользуюсь.
-
-
IMage для этого точно не лучший вариант...
-
> @!!ex ©
Хех! Прикинь, если гонки - все объекты в TImage... ППЦ полное)))
-
> P.S. Сразу скажу, что компонентами DelphiX я не пользуюсь.
Тогда и TImage не пользуйся. Из всех вариантов ты выбрал самый тормозной и негибкий. Рисуй все в памяти а потом выводи прямо на окно формы.
-
Всем спасибо! Вы были правы как и все ...Эх! Решил все-таки изучить компоненты DelphiX. Что-то вроде получается... но вот опять вопросик: как сделать альфа-прозрачность в DelphiX? Кто сможет, помогите пожалуйста! :)
-
> Danco ©
Выкинь DelphiX куда-нить подальше! Учись писать на чистом WinAPI + DirectX(Direct3D API) или OGL API. С DirectX API могу помочь. Есть базовые знания по Direct3D9, DirectInput, DirectSound, DirectMusic, DirectShow9.
-
>>Elec3C Буду очень благодарен, если поможешь. :) Так ка знаю, что DelphiX не очень хорошая вешь... Много проблем с ней ...проверил на практике.
-
> DelphiX не очень хорошая вешь
Ну так чё собираешься писать на ней тогда! Или ты подумал, что DelphiX и DirectX это одно и тоже???
-
Elec3C ©
Нет...
>С DirectX API могу помочь.
Чем именно можешь помочь?
-
А чем надо, тем и могу помочь(по DX API конечно же).
-
Хочу знать ВСЕ! ;) Книгу на днях купил по OpenGL Краснова. Что-то там мало чего интересного... Можешь подкинуть какую-нить книжку по DX API ...почитать что ли, а то не совсем понимаю что это такое. )
P.S. Всех! С Новым годом!
-
возьмы PowerDraw/Asphyre и не изобретай велосипеды.
зыж ПОЛНОСТЬЮ прозрачная картинка попросту не видна и потому не нужна.
-
Э-э-э! Вы тут на GDI не наезжайте =). В-общем, тут есть четыре варианта: рисовать не каждый пискель, рисовать действительно полупрозрачные пиксели, рисовать на полупрозрачной поверхности и еще один =). Первый вариант реализуется простым циклом или отрисовкой по маске. Второй вариант требует, чтоб была задняя поверхность. Берутся 2 пикселя: из исходного изображения и из соотв. места на задней поверхности. Эти пиксели преобразуются из RGB в HLS, вычисляется среднее значение, преобразуется обратно в RGB и рисуется =). Третий вариант. Рисуем все не на TImage, а на потомке от TWinControl, например, на TPanel, и уже этому компоненту ставим прозрачность, например, этой функцией: function SetWindowAlpha(Window: HWND; Alpha: Byte; UseColorKey: Boolean = False; ColorKey: COLORREF = $000000): Boolean;
const
ColorKeys: Array[False..True] of Integer = (0, LWA_COLORKEY);
var
AStyle: Integer;
begin
Result := False;
AStyle := GetWindowLong(Window, GWL_EXSTYLE);
if (Alpha = 255) and (not UseColorKey) then begin
Result := SetWindowLong(Window, GWL_EXSTYLE, AStyle or not WS_EX_LAYERED) <> 0;
end else begin
if SetWindowLong(Window, GWL_EXSTYLE, AStyle or WS_EX_LAYERED) = 0 then Exit;
Result := SetLayeredWindowAttributes(Window, ColorKey, Alpha, LWA_ALPHA or ColorKeys[UseColorKey]);
end;
end; Четвертый вариант - воспользоваться сторонними функциями =)
-
> Можешь подкинуть какую-нить книжку по DX API ...почитать > что ли, а то не совсем понимаю что это такое.
Э... Я пытался разобраться по мануалу из DX SDK, примерам оттуда же и статьям с сайтов типа mirgames.ru (хотя на old.mirgames.ru статей побольше)
-
Pir Спасибо!
-
Danco как понятно из первого сообщения то ты делаешь 2D игру, и честнго говоря компонент TImage действительно не самый лучший выбор, так как поддержка альфа канала у него конечно есть, но он страшно глюююючит на больших разрешениях из за структуры прорисовки окна, она может нормально работать только 24 битными изображениями, так что у тебя один выход рисовать всё на одном большом битмапе а ещё лучше берез GDI+(там и сглаживание есть, притом не надо особо мудится) прямо на форме, а что касается взрыва надо закатать в png файл по кадрам весь твой взрыв и потом по кадрам его выводить либо через gdi(альфа канал там при прорисовке автоматом поддерживается).
|