Решение про накладывание изображения на изображение:

Graphics 800, 600
Explosion = LoadImage("Картинка1")
bg = LoadImage("Картинка2", DYNAMICIMAGE)
Repeat
Cls
DrawImage bg, 0, 0
If MouseHit(1)
DrawToPixmap(Explosion, 0, LockImage(bg), MouseX(), MouseY())
End If
Flip
Until KeyHit(KEY_ESCAPE)
Function ARGB_Alpha:Int(ARGB:Int)
Return (argb Shr 24) & $ff
'Return Int((ARGB & $FF000000:Int) / $1000000:Int)
End Function
Function ARGB_Red:Int(ARGB:Int)
Return (argb Shr 16) & $ff
' Return Int((ARGB & $00FF0000:Int) / $10000:Int)
End Function
Function ARGB_Green:Int(ARGB:Int)
Return (argb Shr 8) & $ff
' Return Int((ARGB & $0000FF00:Int) / $100:Int)
End Function
Function ARGB_Blue:Int(ARGB:Int)
Return (argb & $ff)
' Return (ARGB & $000000FF:Int)
End Function
Function ARGB_Color:Int(alpha:Int,red:Int,green:Int,blue:Int)
Return (Int(alpha * $1000000) + Int(RED * $10000) + Int(green * $100) + Int(blue))
End Function
Function DrawToPixmap(image:TImage, framenr:Int = 0, Pixmap:TPixmap, x:Int, y:Int, alpha:Float = 1.0, Multiply:Int = 1)
Local TempPix:TPixmap = Null
If framenr = 0 Then TempPix = LockImage(image)
If framenr > 0 Then TempPix = LockImage(image, Framenr)
For Local i:Int = 0 To ImageWidth(image) - 1
For Local j:Int = 0 To ImageHeight(image) - 1
If x + i < pixmap.width And y + j < pixmap.Height 'And i >= x And j >= y
Local sourcepixel:Int = ReadPixel(TempPix, i, j)
Local destpixel:Int = ReadPixel(pixmap, x+i,y+j)
Local destA:Float = ARGB_Alpha(destpixel)
Local sourceA:Float = ARGB_Alpha(sourcepixel) * alpha
If sourceA = 255 Then destA = 0
Local destR:Float = ARGB_Red(destpixel)
Local destG:Float = ARGB_Green(destpixel)
Local destB:Float = ARGB_Blue(destpixel)
Local SourceR:Float = ARGB_Red(Sourcepixel)
Local SourceG:Float = ARGB_Green(Sourcepixel)
Local SourceB:Float = ARGB_Blue(Sourcepixel)
Local AlphaSum:Int = destA + sourceA
If multiply = 1
sourceR = (sourceR * sourceA / AlphaSum) + destA / AlphaSum * (destR * destA / AlphaSum)
sourceG = (sourceG * sourceA / AlphaSum) + destA / AlphaSum * (destG * destA / AlphaSum)
sourceB = (sourceB * sourceA / AlphaSum) + destA / AlphaSum * (destB * destA / AlphaSum)
Else
sourceR = (sourceR * sourceA / AlphaSum) + (destR * destA / AlphaSum)
sourceG = (sourceG * sourceA / AlphaSum) + (destG * destA / AlphaSum)
sourceB = (sourceB * sourceA / AlphaSum) + (destB * destA / AlphaSum)
EndIf
If AlphaSum > 255 Then AlphaSum = 255
sourcepixel = ARGB_Color(AlphaSum, SourceR, sourceG, sourceB)
If SourceA <> 0 Then WritePixel(Pixmap, x + i, y + j, sourcepixel)
EndIf
Next
Next
If framenr = 0 UnlockImage(image)
If framenr > 0 UnlockImage(image, framenr)
End Function
Этот способ ещё тормознее и без alpha канала:
Local e:TPixmap = LockImage(imgBlood)
Local p:TPixmap = LockImage(imgFloor)
MaskPixmap(e, 0, 0, 0)
p.Paste(e, MouseX(), MouseY())
UnlockImage(imgBlood)
UnlockImage(imgFloor)
Нужели это всё, что можно сделать?
В Blitz3D подобное - расплюнуть.
Я понимаю, что тут какбы 3D-2D, но ведь SetBuffer(TextureBuffer()) в B3D есть, значит и тут чёто подобное должнобыть.
Просто я помню как я грабил экран в B3D и текстурил этим всю мапу и воду и скайбокс и юнитов. Баловался кароче
