|
Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново... |
13.10.2015, 18:49
|
#16
|
Мастер
Регистрация: 26.10.2009
Сообщений: 1,194
Написано 615 полезных сообщений (для 2,209 пользователей)
|
Ответ: Прозрачный прямоугольник с краем
Сообщение от moka
Зачем?
Не лучше ли заняться реальной разработкой игр или приложений, исползуя современные и развитые платформы и библиотеки?
Зачем заниматься некро-кодингом?
|
По теме: Может я что-то не так делаю, но результат странный получается. При уменьшении/увеличении альфы, прямоугольник меняет цвет непредсказуемым образом. ЧЯДНТ?
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
|
(Offline)
|
|
13.10.2015, 19:36
|
#17
|
ПроЭктировщик
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений (для 71 пользователей)
|
Ответ: Прозрачный прямоугольник с краем
Позже разберусь в чём дело, а пока используй рекомендованные значения в коментариях функции .
И спасибо за сообощение
__________________
Мой проект здесь
|
(Offline)
|
|
14.10.2015, 08:44
|
#18
|
ПроЭктировщик
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений (для 71 пользователей)
|
Ответ: Прозрачный прямоугольник с краем
Исправил функцию . теперь параметр 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
__________________
Мой проект здесь
|
(Offline)
|
|
14.10.2015, 09:15
|
#19
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Прозрачный прямоугольник с краем
Сообщение от IgorOK
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))
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.10.2015, 10:27
|
#20
|
ПроЭктировщик
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений (для 71 пользователей)
|
Ответ: Прозрачный прямоугольник с краем
Для тех ,кто привык задавать значения от 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
__________________
Мой проект здесь
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:25.
|