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)

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, время: 00:58.

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