Unterschied Image/Sprite

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Unterschied Image/Sprite

Beitrag von diceman »

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.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Unterschied Image/Sprite

Beitrag von Derren »

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.
Signatur und so
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Unterschied Image/Sprite

Beitrag von diceman »

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.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Unterschied Image/Sprite

Beitrag von NicTheQuick »

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.
Bild
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Unterschied Image/Sprite

Beitrag von Kiffi »

@diceman:

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

http://www.purebasic.com/german/documen ... index.html

http://www.purebasic.com/german/documen ... index.html
'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
Hygge
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Unterschied Image/Sprite

Beitrag von diceman »

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.
[...] 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. :)
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Unterschied Image/Sprite

Beitrag von Kiffi »

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
Hygge
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Unterschied Image/Sprite

Beitrag von diceman »

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!
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Unterschied Image/Sprite

Beitrag von ccode_new »

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: 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Re: Unterschied Image/Sprite

Beitrag von Derren »

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.
Signatur und so
Antworten