PureBoard
https://www.purebasic.fr/german/

Unterschied Image/Sprite
https://www.purebasic.fr/german/viewtopic.php?f=4&t=30614
Seite 1 von 2

Autor:  diceman [ 14.02.2018 13:28 ]
Betreff des Beitrags:  Unterschied Image/Sprite

Entschuldigung, wenn das eine blöde Frage ist, aber kann mir jemand einmal einen kleinen Crash-Kurs geben, worin sich Images und Sprites unterscheiden?
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 ;-) ) gab es nur den Image-Befehl.

Autor:  Derren [ 14.02.2018 13:31 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

Sprites werden auf einem Screen (für Spiele) angezeigt.
Images entweder in einem Image-Gadget, oder können auf ein Canvas-Gadget gezeichnet werden. Um Images auf einem Screen anzuzeigen, muss erst ein Sprite erstellt werden, auf den das Image gezeichnet wird.

Autor:  diceman [ 14.02.2018 13:56 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

Schonmal danke für die Antwort, aber Images kann ich doch auch auf einen Screen anzeigen? :?
Habe gerade meinen Minesweeper-Klon fertigprogrammiert - da öffne ich einen Windowed Screen und zeichne Images drauf.

Autor:  NicTheQuick [ 14.02.2018 14:07 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

Ein größerer Unterschied ist dieser: Sprites werden im Grafikkartenspeicher abgelegt und können dementsprechend sehr schnell von der Grafikkarte angezeigt und manipuliert werden. Deswegen gibt es in der Hinsicht auch einen Haufen mehr Befehle bei Sprites. Images werden im Arbeitsspeicher abgelegt und unter Windows zum Beispiel von GDI verwaltet, bei Linux von GTK. Sie eignen sich nicht für eine super schnelle Bildschirmausgabe und lassen sich auch nicht auf so viele Weisen in Echtzeit manipulieren wie Sprites.
Grob gesagt: Images werden von der CPU gerendert, Sprites von der GPU. Das kann gerade bei vielen gleichzeitigen Bildern einen enormen Geschwindigkeitsunterschied bringen.

Autor:  Kiffi [ 14.02.2018 14:12 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

@diceman:

ich glaube, dass Du die Unterschiede am besten erkennst, wenn Du Dir die jeweiligen Hilfeseiten anschaust:

http://www.purebasic.com/german/documentation/image/index.html

http://www.purebasic.com/german/documentation/sprite/index.html

Zitat:
'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.


Grüße ... Peter

Autor:  diceman [ 14.02.2018 14:14 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

Alles klar, also lautet die Überlegung hier Arbeitsspeicher vs. Grafikkarte. :allright:
Das ganze Transparenz-/ Alpha-Gedöns muß ich aber noch verinnerlichen, also wo ich welche Parameter initialisieren muß, damit das so funktioniert wie ich mir das wünsche. Hatte in Blitzbasic ausschließlich die Möglichkeit, eine Farbe in einem Image auf Transparent zu setzen, während PureBasic mir eine ganze Bibliothek an Befehlen zur Bildmanipulation anbietet; da probiere ich aber gerne selbst ein bißchen rum.

@Kiffi
Ja, die Hilfe habe ich mir durchgelesen; fand das aber, mit Verlaub, nicht so eindeutig, insbesondere was Unterschiede und Anwendungsgebiete angeht.
Zitat:
[...] 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.

Das trifft auf den ersten Blick erstmal auch auf Images zu. :)

Autor:  Kiffi [ 14.02.2018 17:28 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

diceman hat geschrieben:
Ja, die Hilfe habe ich mir durchgelesen; fand das aber, mit Verlaub, nicht so eindeutig, insbesondere was Unterschiede und Anwendungsgebiete angeht.

mir fielen da auf Anhieb RotateSprite() und SpritePixelCollision() auf, welches in Spielen ja ganz nützlich sein könnte (vermutlich; bin kein Spiele-Programmierer).

Grüße ... Peter

Autor:  diceman [ 14.02.2018 19:52 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

So langsam steige ich durch ...
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, was sich einfach und intuitiv implementieren lässt, aber mit DisplayTransparentSprite() und TransparentSpriteColor() scheint es zu funktionieren, und das reicht auch erstmal für meine bescheidenen Zwecke. :-)
Danke euch allen!

Autor:  ccode_new [ 14.02.2018 21:47 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

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


Hallo diceman!

Ich habe mal folgende "LoadImageTransparent" - Funktion im Forum gefunden. Sieht ganz nice aus.
Quelle: http://www.purebasic.fr/english/viewtopic.php?t=66303

Code:
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

Autor:  Derren [ 15.02.2018 15:36 ]
Betreff des Beitrags:  Re: Unterschied Image/Sprite

Du zeichnest deine Bilder dann aber in jedem Durchlauf auf den Screen, oder seit wann gibt es "DisplayImage()" auf einem Screen?

Von StartDrawing() im Mainloop sollte aus Geschwindigkeitsgründen abgesehen werden. Steht auch in der Hilfe afair.
Fällt dir bei Minesweeper vielleicht nicht auf, aber wenn du das mit einem kleinen Shooter-Game oder so machst, dann bricht dir wahrscheinlich deine Framerate so richtig ein.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/