forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Прозрачный прямоугольник с краем (http://forum.boolean.name/showthread.php?t=20033)

polopok 10.10.2015 20:01

Прозрачный прямоугольник с краем
 
Прямоугольник с изменяемой прозрачностью в пределах от 0 до 255.
Так же есть возможность отрисовки полупрозрачного борта .
Код функции под спойлером :
Код:

;===============================================
;
;    Transparent Rect , alpha% = ( from 0 to 255 )

;
;===============================================

Function AlphaRect(Point_X# = 0 ,Point_Y# = 0 ,width ,height ,R = 255 ,G = 255 ,B = 255 ,A% = 255 ,border = False)

If A <= 0 And border = False
    Return
ElseIf (A <= 0 And border = True ) Or (A > 0 And border = False ) Or (A > 0 And border = True )

    Buffer = BackBuffer()
    LockBuffer Buffer
    RGB =  255 Shl 24 Or R Shl 16 Or G Shl 8 Or B ;
    For localY# = Point_Y To  Point_Y + height -1
    For localX# = Point_X To Point_X + width -1
        If localX > 0 And localX < GraphicsWidth() And localY > 0 And localY < GraphicsHeight()
        bgRGB = ReadPixelFast (localX ,localY ,Buffer )

        WritePixelFast localX ,localY , GetPixelForOpacity( bgRGB , RGB , A),Buffer
       
        If border
            NewRGB =(255-RGB *(A-((255-RGB )*(255-bgRGB  ) Shr 8)-A) Shr 8)
            WritePixelFast localX ,Point_Y , NewRGB ,Buffer
            WritePixelFast localX ,Point_Y+ height , NewRGB , Buffer
            WritePixelFast Point_X ,localY, NewRGB ,Buffer
            WritePixelFast Point_X + width ,localY, NewRGB , Buffer
        EndIf
        End If

    Next : Next
    UnlockBuffer Buffer
End If
End Function

Function GetPixelForOpacity( pixelBackground, pixelForeground, pixelAlpha)
    If pixelForeground = $ff000000 Then pixelForeground = pixelBackground
        bgsourceR = ((pixelForeground And $00FF0000) Shr 16);
        bgsourceG = ((pixelForeground And $0000FF00) Shr 8);
        bgsourceB = ((pixelForeground And $000000FF));

        sourceR = ((pixelBackground And $00FF0000) Shr 16);
        sourceG = ((pixelBackground And $0000FF00) Shr 8);
        sourceB = ((pixelBackground And $000000FF));

        newR = sourceR * pixelAlpha/255 + bgsourceR * ( 255-pixelAlpha)/255;
        newG = sourceG * pixelAlpha/255 + bgsourceG * (255- pixelAlpha)/255;
        newB = sourceB * pixelAlpha/255 + bgsourceB * (255- pixelAlpha)/255;

        Return (255 Shl 24 Or newR Shl 16 Or newG Shl 8 Or newB);
End Function



P.S. Думаю тут и без скриншота всё понятно .

SBJoker 11.10.2015 17:00

Ответ: Прозрачный прямоугольник с краем
 
Это конечно круто, но что мешает выводить так любую картинку?
Попиксельные операции дают полную свободу действий, однако производительность страдает, для того и есть фрагментные шейдеры.

polopok 11.10.2015 19:23

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от SBJoker (Сообщение 300432)
Это конечно круто, но что мешает выводить так любую картинку?
Попиксельные операции дают полную свободу действий, однако производительность страдает, для того и есть фрагментные шейдеры.

По поводу прозрачности картинки уже писал в этом http://forum.boolean.name/showthread.php?t=17431 посте.
Эффективность можно повысить если изображение загрузить в банк памяти и соответственно буфер представить банком памяти , остаётся лишь проход по значениям обоих банков с выводом результата в банк буфера

moka 12.10.2015 02:42

Ответ: Прозрачный прямоугольник с краем
 
Зачем?
Не лучше ли заняться реальной разработкой игр или приложений, исползуя современные и развитые платформы и библиотеки?
Зачем заниматься некро-кодингом?

polopok 12.10.2015 04:23

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от moka (Сообщение 300449)
Зачем?
Не лучше ли заняться реальной разработкой игр или приложений, исползуя современные и развитые платформы и библиотеки?
Зачем заниматься некро-кодингом?

:-)А никто ни кого ни к чему не принуждает ...
P.S.Каждый ***чит ,как ,где и чем хочет. :moil:

moka 13.10.2015 02:46

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от polopok (Сообщение 300451)
:-)А никто ни кого ни к чему не принуждает ...
P.S.Каждый ***чит ,как ,где и чем хочет. :moil:

При чем тут принуждение?
Вот, залайкавший L.D.M.T. некро-кодил, и за столько лет ничему не научился, даже примитивную html форму по работе не может сделать, готов заплатить другим.

Заачем?
Разве нету желания создавать что-то крутое и интересное, что люди смогут попробовать и использовать?

polopok 13.10.2015 03:19

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

impersonalis 13.10.2015 11:36

Ответ: Прозрачный прямоугольник с краем
 
moka - ты сублимируешь латентную религиозность в кодовых холиварах. Надоел уже с этой темой хуже фанатиков. В каждом треде (хоть про цпп, хоть про б3д) вспыхивает один и тот же флейм, а ведь ворчание стариков опрокинуло blitz.pp в своё время. Ведёшь себя как член комиссии, выделяющей грант на мильон евро за вышеприведённый код. Тыжнормальный - лучше запили нам демку какую, или про эвент какой расскажи.

moka 13.10.2015 13:55

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от impersonalis (Сообщение 300496)
moka - ты сублимируешь латентную религиозность в кодовых холиварах. Надоел уже с этой темой хуже фанатиков. В каждом треде (хоть про цпп, хоть про б3д) вспыхивает один и тот же флейм, а ведь ворчание стариков опрокинуло blitz.pp в своё время. Ведёшь себя как член комиссии, выделяющей грант на мильон евро за вышеприведённый код. Тыжнормальный - лучше запили нам демку какую, или про эвент какой расскажи.

Ничего против CPP не имею. Язык может и работу дать, только если опять же, не манчкинством заниматься, а делом.

На демки времени нету совсем, работа-работа-рабство.
Евенты, когда пройдут, расскажу.

Причины по которым я негодую, это то что почти все кто тут сидит с давних времен, пересели с б3д на что-то более дельное, и чем раньше это сделали, тем лучше.
Посмотри на HolyDel, PAX, Mr_F, ARENSHI, да почти все наши старожилы на что-то дельное перешли, и все пробиваются, все двигаются вперед, получают свои деньги за свои творения, или хотя бы реальные проекты, с реальными пользователями.
А не код, который максимум 3 человека скопи-пастят, и больше никто не увидит. Хотя бы на JS'е писал тоже самое, так хоть побольше людей увидило, и может кому-то пригодилось бы, но и это сомнительно.

Разве никто не хочет чтобы его хобби стало работой, приносящей не только фан, но и бабло?

Arton 13.10.2015 14:03

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от moka (Сообщение 300503)
Причины по которым я негодую, это то что почти все кто тут сидит с давних времен, пересели с б3д на что-то более дельное, и чем раньше это сделали, тем лучше.
Посмотри на HolyDel, PAX, Mr_F, ARENSHI, да почти все наши старожилы на что-то дельное перешли, и все пробиваются, все двигаются вперед, получают свои деньги за свои творения, или хотя бы реальные проекты, с реальными пользователями.
А не код, который максимум 3 человека скопи-пастят, и больше никто не увидит. Хотя бы на JS'е писал тоже самое, так хоть побольше людей увидило, и может кому-то пригодилось бы, но и это сомнительно.

Разве никто не хочет чтобы его хобби стало работой, приносящей не только фан, но и бабло?

Интересно, что за таракан в твоей голове заставляет писать это.
Тебе важно что бы каждое действие имело конечную цель и обязательно полезную/продуктивную.
Пишешь что не надо навязывать мнение другим и сам отчаянно навязываешь своё.
Почему же ты так беспокоишься за других.


moka 13.10.2015 14:15

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от Arton (Сообщение 300505)

Интересно, что за таракан в твоей голове заставляет писать это.
Тебе важно что бы каждое действие имело конечную цель и обязательно полезную/продуктивную.
Пишешь что не надо навязывать мнение другим и сам отчаянно навязываешь.
Почему же ты так беспокоишься за других.


Картинка иллюстрирует твою сторону взгляда, т.к. тебе не ясна моя мотивация.
Мотивация простая, такая же как у любого другого человека который стремиться чего-то добиваться в жизни, и желает того же другим.
Я чему-то вроди научился, и начинал с б3д, много общего со многими на булке.
И выбравшись до какого-то уровня, вижу свои и чужие "ошибки", или скорее "погрехи", которые если увидеть чутка раньше, можно лучше и дальше уйти вперед в итоге.
Разве это не круто видеть как народ развивается, и достигает успехов? По мне так это отлично.
Я лично имею список людей, которые кто-то также начинал на булке, а кто-то еще где-то. Мне удалось в ранее время их немного направить, советом или объяснив там что-то по коду. И сейчас они весьма в хорошем положении. Я не приписываю себе ничего, т.к. каждая мелкая деталь важна, и в итоге - это они делают, не я за них. И когда видишь такой рост и развитие. Чертовски приятно, и радостно за людей.

Желаю просто всем чтобы двигались, и развивались. Всего-то.
Порой слышу отмазы, которые звучат для меня как "он тупой, и ему нравится быть тупым, оставь его в покое, не мешай ему тупить". От таких отмаз, мне становится грустно.

Думаю мотивация теперь ясна?

Arton 13.10.2015 14:57

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от moka (Сообщение 300507)
Картинка иллюстрирует твою сторону взгляда, т.к. тебе не ясна моя мотивация...

С чего ты это взял? Мне понятна твоя мотивация, хотя и не ясны причины, а вот ты меня похоже не понял, или не хочешь.
Когда человек действительно понимает (осознаёт), он перестаёт повторять одно и тоже.

Объяснять что-либо тебе я не собираюсь, вдруг обидишься ты сам в состояние разобраться.

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 500 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

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

impersonalis 13.10.2015 15:01

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от moka (Сообщение 300507)
Желаю просто всем чтобы двигались, и развивались. Всего-то.
Порой слышу отмазы, которые звучат для меня как "он тупой, и ему нравится быть тупым, оставь его в покое, не мешай ему тупить". От таких отмаз, мне становится грустно.

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

polopok 13.10.2015 15:16

Ответ: Прозрачный прямоугольник с краем
 
Мда ... Все ,вы ,правы и даже я .
moka , я очень признателен за попытки мотивировать меня ,так же рад тому ,что на этом голубом ,овалообразном шарике земли таки есть люди не равнодушные к другим человек'ам ,ведь одно понимание собственной необходимости повышает стремление к познанию и расширения мира.

moka 13.10.2015 16:49

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от impersonalis (Сообщение 300511)
Фанатики рассуждают точно также. Основная проблема - система ценностей: кто-то хочет поиграться с алгоритмами, кто-то заняться ненормальным программированием, кто-то тихонько ковыряется в свободное время (как хобби, которое не умерщвляется, став работой), кто-то изобретает велосипед, т.к. для него это лучший подход к пониманию материала и т.п.
Разумеется, стоит прокомментировать, на случай если человек действительно не понимает, что занят не совсем тем, на что рассчитывает (возможно, даже перенести тему из данного раздела в какие-нибудь "примеры кода"). Но не одним и тем же людям по n-ому разу.
Большинство фанатиков свято верят, что несут свет знаний тёмным дикарям. Тех, кто лишь прикрывается личной миссионера - не так много.

Это все очевидные вещи, и мне известно то что ты здесь пишешь.
Я еще не подрос чтобы мириться с окружением, и принимать его как есть. У меня все еще подростковый максимализм где-то, частично остался. И желание "бежать" вперед есть. Время прийдет, и я угомонюсь. А пока, с осознанием того что ты и остальные пишут, я буду гнуть свою палку.

Вреда в моих текстах не вижу, и это важно. Тем более каждый имеет право не читать.

Arton, причины такие же как у любого ученого стремление к познанию, или ребенка попробовать все на вкус, любопытство и не усидчивость - причина которая ведет к мотивации описанной выше.
Я все же не удержался и ответил.

IgorOK 13.10.2015 18:49

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от moka (Сообщение 300449)
Зачем?
Не лучше ли заняться реальной разработкой игр или приложений, исползуя современные и развитые платформы и библиотеки?
Зачем заниматься некро-кодингом?



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

Код:

Graphics 1024, 768, 32, 2
SetBuffer BackBuffer()

Local Alpha#=1

While Not KeyHit(1)
        If KeyDown(2) Then Alpha=Alpha+.01
        If KeyDown(3) Then Alpha=Alpha-.01
       
        If Alpha<0
                Alpha=0
               
        ElseIf Alpha>1
                Alpha=1
        EndIf
        AlphaRect(50 , 50 , 100 , 100, 255, 0, 0, Alpha, False)
       
        Text 20, 20, Alpha
        Flip:Cls
Wend
End


polopok 13.10.2015 19:36

Ответ: Прозрачный прямоугольник с краем
 
Позже разберусь в чём дело, а пока используй рекомендованные значения в коментариях функции .
И спасибо за сообощение

polopok 14.10.2015 08:44

Ответ: Прозрачный прямоугольник с краем
 
Исправил функцию . теперь параметр Alpha в пределах [0 ; 255]
Alpha = 0 не прозрачно ; Alpha = 255 прозрачно

Код под спойлером :
Код:

Graphics 1024, 768, 32, 2
SetBuffer BackBuffer()

Local Alpha=0 : v = 5

While Not KeyHit(1)

    Alpha=Alpha + v
   
    If Alpha <=0
        Delay 200
        v=5
    ElseIf    Alpha >= 255
        Delay 200
        v= -5
    EndIf
    Color 255,0,0
    Rect 0,0,100,100,1   
    Color 0,0,255
    Rect 100,0,100,100,1   
    Color 0,255,0
    Rect 200,0,100,100,1   
    Color 255,255,0
    Rect 300,0,100,100,1   
    Color 0,255,255
    Rect 400,0,100,100,1   
    Color 128,128,128
    Rect 0,100,200,100,1       
    Color 28,28,28
    Rect 0,200,200,100,1       
    Color 228,228,228
    Rect 300,100,200,100,1   
    Color 255,255,255
    Rect 200,100,100,200,1           
;    AlphaRect(50,50 , 400 , 200, 255, 0, 0, 255 , 1)   
    AlphaRect(50,50 , 400 , 200, 255, 0, 0, Alpha ,1 )

    Color 25,25,25
    Text 20, 20, Alpha
    Flip:Cls
Wend
End


Function AlphaRect(Point_X# = 0 ,Point_Y# = 0 ,width ,height ,R = 255 ,G = 255 ,B = 255 ,A% = 255 ,border = False)

If A <= 0 And border = False
    Return
ElseIf (A <= 0 And border = True ) Or (A > 0 And border = False ) Or (A > 0 And border = True )

    Buffer = BackBuffer()
    LockBuffer Buffer
    RGB =  255 Shl 24 Or R Shl 16 Or G Shl 8 Or B ;
    For localY# = Point_Y To  Point_Y + height -1
    For localX# = Point_X To Point_X + width -1
        If localX > 0 And localX < GraphicsWidth() And localY > 0 And localY < GraphicsHeight()
        bgRGB = ReadPixelFast (localX ,localY ,Buffer )

        WritePixelFast localX ,localY , GetPixelForOpacity( bgRGB , RGB , A),Buffer
       
        If border
            NewRGB =(255-RGB *(A-((255-RGB )*(255-bgRGB  ) Shr 8)-A) Shr 8)
            WritePixelFast localX ,Point_Y , NewRGB ,Buffer
            WritePixelFast localX ,Point_Y+ height , NewRGB , Buffer
            WritePixelFast Point_X ,localY, NewRGB ,Buffer
            WritePixelFast Point_X + width ,localY, NewRGB , Buffer
        EndIf
        End If

    Next : Next
    UnlockBuffer Buffer
End If
End Function

Function GetPixelForOpacity( pixelBackground, pixelForeground, pixelAlpha)
    If pixelForeground = $ff000000 Then pixelForeground = pixelBackground
        bgsourceR = ((pixelForeground And $00FF0000) Shr 16);
        bgsourceG = ((pixelForeground And $0000FF00) Shr 8);
        bgsourceB = ((pixelForeground And $000000FF));

        sourceR = ((pixelBackground And $00FF0000) Shr 16);
        sourceG = ((pixelBackground And $0000FF00) Shr 8);
        sourceB = ((pixelBackground And $000000FF));

        newR = sourceR * pixelAlpha/255 + bgsourceR * ( 255-pixelAlpha)/255;
        newG = sourceG * pixelAlpha/255 + bgsourceG * (255- pixelAlpha)/255;
        newB = sourceB * pixelAlpha/255 + bgsourceB * (255- pixelAlpha)/255;

        Return (255 Shl 24 Or newR Shl 16 Or newG Shl 8 Or newB);
End Function


Randomize 14.10.2015 09:15

Ответ: Прозрачный прямоугольник с краем
 
Цитата:

Сообщение от IgorOK (Сообщение 300522)
Код:

If Alpha<0
        Alpha=0
ElseIf Alpha>1
        Alpha=1
EndIf


Код:

Alpha = Max(0, Min(Alpha, 1))
И версия для безумных
Код:

Alpha = Max(0, Min(Alpha + ((-KeyDown(3) + KeyDown(2)) * 0.01),  1))

polopok 14.10.2015 10:27

Ответ: Прозрачный прямоугольник с краем
 
Для тех ,кто привык задавать значения от 0.0 до 1.0

Код:


Function AlphaRect(Point_X# = 0 ,Point_Y# = 0 ,width ,height ,R = 255 ,G = 255 ,B = 255 ,A# = 1.0 ,border = False)

If A <= 0 And border = False
    Return
ElseIf (A <= 0 And border = True ) Or (A > 0 And border = False ) Or (A > 0 And border = True )

    Buffer = BackBuffer()
    LockBuffer Buffer
    RGB =  255 Shl 24 Or R Shl 16 Or G Shl 8 Or B ;
    For localY# = Point_Y To  Point_Y + height -1
    For localX# = Point_X To Point_X + width -1
        If localX > 0 And localX < GraphicsWidth() And localY > 0 And localY < GraphicsHeight()
        bgRGB = ReadPixelFast (localX ,localY ,Buffer )

        WritePixelFast localX ,localY , GetPixelForOpacity( bgRGB , RGB , A),Buffer
       
        If border
            NewRGB =(1.0-RGB *(A-((1.0-RGB )*(1.0-bgRGB  ) Shr 8)-A) Shr 8)
            WritePixelFast localX ,Point_Y , NewRGB ,Buffer
            WritePixelFast localX ,Point_Y+ height , NewRGB , Buffer
            WritePixelFast Point_X ,localY, NewRGB ,Buffer
            WritePixelFast Point_X + width ,localY, NewRGB , Buffer
        EndIf
        End If

    Next : Next
    UnlockBuffer Buffer
End If
End Function

Function GetPixelForOpacity( pixelBackground, pixelForeground, pixelAlpha#)
    If pixelForeground = $ff000000 Then pixelForeground = pixelBackground
        bgsourceR = ((pixelForeground And $00FF0000) Shr 16);
        bgsourceG = ((pixelForeground And $0000FF00) Shr 8);
        bgsourceB = ((pixelForeground And $000000FF));

        sourceR = ((pixelBackground And $00FF0000) Shr 16);
        sourceG = ((pixelBackground And $0000FF00) Shr 8);
        sourceB = ((pixelBackground And $000000FF));

        newR = sourceR * pixelAlpha/1.0 + bgsourceR * ( 1.0-pixelAlpha)/1.0;
        newG = sourceG * pixelAlpha/1.0+ bgsourceG * (1.0- pixelAlpha)/1.0;
        newB = sourceB * pixelAlpha/1.0+ bgsourceB * (1.0- pixelAlpha)/1.0;

        Return (255 Shl 24 Or newR Shl 16 Or newG Shl 8 Or newB);
End Function



Часовой пояс GMT +4, время: 02:30.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot