Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Blitz3D > Полезные функции

Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново...

Ответ
 
Опции темы
Старый 13.10.2015, 15:49   #16
IgorOK
Мастер
 
Аватар для IgorOK
 
Регистрация: 26.10.2009
Сообщений: 1,169
Написано 594 полезных сообщений
(для 2,150 пользователей)
Ответ: Прозрачный прямоугольник с краем

Сообщение от 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
(Online)
 
Ответить с цитированием
Старый 13.10.2015, 16:36   #17
polopok
ПроЭктировщик
 
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений
(для 71 пользователей)
Ответ: Прозрачный прямоугольник с краем

Позже разберусь в чём дело, а пока используй рекомендованные значения в коментариях функции .
И спасибо за сообощение
__________________
Мой проект здесь
(Offline)
 
Ответить с цитированием
Старый 14.10.2015, 05:44   #18
polopok
ПроЭктировщик
 
Регистрация: 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, 06:15   #19
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: Планета Земля
Сообщений: 4,112
Написано 2,314 полезных сообщений
(для 6,448 пользователей)
Ответ: Прозрачный прямоугольник с краем

Сообщение от 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? █
Пека: AMD Athlon II x4 2.6Ghz; 8Gb ram; Nvidia Geforce GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (14.10.2015)
Старый 14.10.2015, 07:27   #20
polopok
ПроЭктировщик
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 20:00.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com