Auf den ersten Blick sind beides erstmal ein Werkzeug um Bilder auf dem Bildschirm darzustellen.
Wann sollte man was benutzen? In Blitzbasic (mein leider nicht mehr sicheres Herkunftsland

Grüße ... Peter'Sprites' sind Computerspielern bestens bekannt. Diese sind kleine Bilder, manchmal auch 'Brushes' (Pinsel) genannt, welche an jeder Position des Bildschirms angezeigt werden können. Die Sprites können mittels einem transparenten Layer (Schicht) über Grafiken bewegt werden. Noch besser: PureBasic erlaubt das Ausführen von Echtzeit-Effekten wie Schatten, Alpha-Blending, Einfärben, Zoomen, Rotieren, ... - und all dies im Fenster- oder 'Fullscreen' (Bildschirm) Modus.
Das trifft auf den ersten Blick erstmal auch auf Images zu.[...] kleine Bilder, manchmal auch 'Brushes' (Pinsel) genannt, welche an jeder Position des Bildschirms angezeigt werden können. Die Sprites können mittels einem transparenten Layer (Schicht) über Grafiken bewegt werden.
mir fielen da auf Anhieb RotateSprite() und SpritePixelCollision() auf, welches in Spielen ja ganz nützlich sein könnte (vermutlich; bin kein Spiele-Programmierer).diceman hat geschrieben:Ja, die Hilfe habe ich mir durchgelesen; fand das aber, mit Verlaub, nicht so eindeutig, insbesondere was Unterschiede und Anwendungsgebiete angeht.
Hallo diceman!diceman hat geschrieben:Eigentlich wollte ich erstmal nur wissen, wie man eine bestimmte Farbe in einem Bild maskiert, so daß diese transparent dargestellt wird. Für Image habe ich diesbezüglich nix so wirklich gefunden
Code: Alles auswählen
EnableExplicit
UsePNGImageDecoder()
UseJPEGImageDecoder()
UseTGAImageDecoder()
UseGIFImageDecoder()
UseTIFFImageDecoder()
Global fname.s = ""
Procedure ByteSwap32(addrLong)
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
!mov rax, [p.v_addrLong]
!mov ecx, [rax]
!bswap ecx
!mov [rax], ecx
CompilerElse
!mov eax, [p.v_addrLong]
!mov ecx, [eax]
!bswap ecx
!mov [eax], ecx
CompilerEndIf
EndProcedure
Procedure.i LoadImageTransparent (hLoadImg, TransparentColorRGB.l)
Protected width,height,pitch,imgbase, x,y, hImg32, *RGBA.Long
width = ImageWidth(hLoadImg)
height = ImageHeight(hLoadImg)
hImg32 = CreateImage(#PB_Any, width, height, 32)
If hImg32 = 0: ProcedureReturn 0: EndIf
If StartDrawing(ImageOutput(hImg32)) = 0
FreeImage(hImg32): ProcedureReturn 0
EndIf
If DrawingBufferPixelFormat() & #PB_PixelFormat_32Bits_RGB
TransparentColorRGB | $FF000000 ;Linux & OSX
Else
ByteSwap32(@TransparentColorRGB) ;Windows
TransparentColorRGB = (TransparentColorRGB >> 8) | $FF000000
EndIf
DrawingMode(#PB_2DDrawing_Default)
DrawImage(ImageID(hLoadImg),0,0,width,height)
pitch = DrawingBufferPitch()
imgbase = DrawingBuffer()
width-1: height-1
For y = 0 To height
*RGBA = imgbase + (y * pitch)
For x = 0 To width
If *RGBA\l = TransparentColorRGB
*RGBA\l = 0
EndIf
*RGBA+4
Next x
Next y
StopDrawing()
ProcedureReturn hImg32
EndProcedure
fname = OpenFileRequester("Wähle ein Bild","", "*.*", 0)
Define hLoadImg = LoadImage(#PB_Any, fname)
Define TransparentColor.l = RGB(0,255,33) ;Wähle die Transparentsfarbe
Define hTransparentImg = LoadImageTransparent(hLoadImg, TransparentColor)
If hTransparentImg = 0
MessageRequester("Fehler","Das Bild konnte nicht geladen werden."): End
EndIf
FreeImage(hLoadImg)
OpenWindow(0,0,0,500,500,"Transparentsfarbe bei Bilder",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowColor(0,RGB(0,0,0))
ImageGadget(0,0,0,400,400, ImageID(hTransparentImg))
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow