PNG Sprite zerstückeln

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

PNG Sprite zerstückeln

Beitrag von Josef Sniatecki »

Hallo an alle,

ich habe folgendes Problem: Ich besitze ein Tileset das im PNG-Format vorliegt, weil diese Teile später auch den Alpha-Kanal unterstützen sollen. Das Problem ist nun, dass ich keine 3D-Sprites aus den Tiles erstellen kann, da ClipSprite leider keinen Einfluss hat. Außerdem kann ich auch kein PNG-Sprite anzeigen lassen und dieses dann durch GrabSprite zerstückeln, da der Alpha-Kanal verloren gehen würde.

Gibt es irgendeine Möglichkeit, in PureBasic PNG-Sprites zu zerteilen?

Hier mein fehlgeschlagener Versuch:

Code: Alles auswählen

LoadSprite(0, "Tileset.png", #PB_Sprite_Texture)
ClipSprite(0, #FieldSize*X, #FieldSize*Y, #FieldSize, #FieldSize)
Tile_X_Y = CreateSprite3D(#PB_Any, 0)
Gruß Josef
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PNG Sprite zerstückeln

Beitrag von STARGÅTE »

lade das TitleSet erst mal als IMAGE, dies kannst du zerstückeln, auch mit Alpha und dann im temp-Ordner speichern, von dort aus lädst du das neue Bild als Sprite...

das mag nicht perfekt sein, sollte aber gehen
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Re: PNG Sprite zerstückeln

Beitrag von Josef Sniatecki »

Danke für deinen Tipp. Darauf wäre ich garnicht gekommen.

Hab schon mal gecodet:

Code: Alles auswählen

Procedure.i GetTile(Set.i, X.i, Y.i)
  Protected Tile.i, Sprite.i
  
  Tile = GrabImage(Set, #PB_Any, #FieldSize*X, #FieldSize*Y, #FieldSize, #FieldSize)
  SaveImage(Tile, "Temp.png", #PB_ImagePlugin_PNG)
  
  Sprite = LoadSprite(#PB_Any, "Temp.png", #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
  ProcedureReturn CreateSprite3D(#PB_Any, Sprite)
EndProcedure
Entsteht zwar ne Windows-Ladezeit, aber dafür geht's :allright:.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Re: PNG Sprite zerstückeln

Beitrag von kswb73 »

Oder wie wäre es damit:
Du lädst das das Bild als Image. Anstelle es dann im Temp Order zu speichern, malst du es einfach mittel DrawAlphaImage() in dein Sprite.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PNG Sprite zerstückeln

Beitrag von STARGÅTE »

das prolem ist aber das DrawAlphaImage() den AlphaChannel nicht selbst mit in das Sprite kopiert.
soll heißen das Image wird mit AlphaBlending auf das leere (schwarze, aber nicht transparente) Sprite gemalt.
und die ganzen Alpha-Sachen aus der 2D-Drawing-Lib sind nur für ImageOutput().
Man kann also ein Sprite selbst wenn es mit #PB_Sprite_AlphaBlending erstellt ist nicht durchschtig machen in bezug auf den Alphachannel
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: PNG Sprite zerstückeln

Beitrag von Thorium »

Kann man schon durchsichtig machen. Du musst die Images nur zu fuß auf die Sprites malen. Dann klappt das. Einfach den Pointer zu den Buffern holen und dann den Kram mit den Memory befehlen rüberkopieren. Darauf achten das pitch und pixelformat berücksichtigt werden müssen.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PNG Sprite zerstückeln

Beitrag von STARGÅTE »

danke Thorium für den Tip :

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitKeyboard() 

OpenWindow(0, 0, 0, 800, 600, "SCREEN", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

CreateSprite(0, 256, 256, #PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(0))
 Debug DrawingBufferPixelFormat()
 For y = 0 To 255
  For x = 0 To 255
   *Buffer = DrawingBuffer() + y*4*256 + x*4
   PokeL(*Buffer, RGBA(y,255,255,x))
  Next
 Next
StopDrawing()
CreateSprite3D(0, 0) 

Repeat

 WaitWindowEvent(10)
 
 ClearScreen($FF8000)
 
 Start3D()
  DisplaySprite3D(0,0,0)
 Stop3D()
 
 FlipBuffers()

 ExamineKeyboard()
 If KeyboardPushed(#PB_Key_Escape) : End : EndIf

ForEver
wusste garnicht das es "so einfach" ist.
Ich hoffe trotzdem das die "richtigen"-alpha-Sachen die zur Zeit nur bei Image gehen auch bei Sprites gehen, damit man sich diese "umweg" sparen kann.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Re: PNG Sprite zerstückeln

Beitrag von dllfreak2001 »

Weil es gerade zum Thread-Verlauf passt... warum wird hier das Image nicht
nicht mit einem Transparenzverlauf dargestellt.

Code: Alles auswählen

UsePNGImageDecoder()

CreateImage(0, 256, 256, 32)

StartDrawing(ImageOutput(0))
  For y = 0 To 255
    For x = 0 To 255
      Plot(x,y, RGBA(y, 100, 0, x))
    Next
  Next
StopDrawing()

OpenWindow(0, 0, 0, 500, 500, "Alpha-Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(0, 100, 120, 400, 400, ImageID(0))

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
I´a dllfreak2001
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PNG Sprite zerstückeln

Beitrag von STARGÅTE »

weil du im falschen DrawingMode arbeitest:

Das Image ist beim erstellen gefüllt mit RGBA(0,0,0,255)
Das muss erst mal mit AlphaChannel auf 0 gesetzt werden

Code: Alles auswählen

DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,ImageWidth(0),ImageHeight(0),$00000000)
danach musst du mit AlphaBlend arbeiten damit die fArbe richtig draufgesetzt wird:

Code: Alles auswählen

UsePNGImageDecoder()

CreateImage(0, 256, 256, 32)

StartDrawing(ImageOutput(0))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0,0,ImageWidth(0),ImageHeight(0),$00000000)
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  For y = 0 To 255
    For x = 0 To 255
      Plot(x,y, RGBA(y, 100, 0, x))
    Next
  Next
StopDrawing()

OpenWindow(0, 0, 0, 500, 500, "Alpha-Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(0, 100, 120, 400, 400, ImageID(0))

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Für sowas habe ich schon mal n Procedure geschrieben:

Code: Alles auswählen

 Procedure CreateTransparentImage(Image, Width, Height)
  Protected Result = CreateImage(Image, Width, Height, 32)
  If Image = #PB_Any : Image = Result : EndIf
  If IsImage(Image)
   If StartDrawing(ImageOutput(Image))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0,0,ImageWidth(Image),ImageHeight(Image),$00000000)
    StopDrawing()
    ProcedureReturn Result
   EndIf
  EndIf
 EndProcedure
sie erstellt sofort ein komplett echt transparentes Image (geht mit Index und #PB_any)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Re: PNG Sprite zerstückeln

Beitrag von dllfreak2001 »

Achso, ich habe gedacht, der Plot-Befehl könnte den Alpha-Wert des entsprechenden Pixels direkt manipulieren.
<) Danke für den Code!
I´a dllfreak2001
Antworten