Seite 2 von 2
Re: Sprite als tga speichern
Verfasst: 19.06.2018 13:35
von Jan125
Beim Downgrade auf eine PB-Version mit DX7 Subsystem oder früher (5.0) gibt es dafür sogar einen Befehl.
SetSpriteOutput, oder so, damit konnte man Sprites auf Speites zeichnen. :3
Re: Sprite als tga speichern
Verfasst: 19.06.2018 14:02
von Imhotheb
Sieh dir mal GrabSprite() an:
Aus der Hilfe: Fotografiert ("grab") den Bildschirminhalt im Bereich von (x, y, Breite, Höhe) und erstellt daraus ein neues #Sprite. In der Kombination von Grabsprite und SaveSprite() ist es somit z.B. möglich, einen Screenshot eines Spiels zu erstellen.
Re: Sprite als tga speichern
Verfasst: 19.06.2018 18:51
von Syntacks_Error
grabSprite() hört sich gut an, liefert bei mir aber auch nur das große blaue Hintergrundsprite ohne die kleinen Rechtecke:
Code: Alles auswählen
EnableExplicit
UsePNGImageDecoder()
InitSprite()
InitKeyboard()
Define window.i,screenwindow,spriteBig, spriteNr,x,y,painted,newSprite, Ergebnis
Global NewList spriteList.i()
window = OpenWindow(#PB_Any, 200,200,800,800,"Test")
screenwindow = OpenWindowedScreen(WindowID(window),0,0,800,800)
Procedure createspriteBig()
Define spriteBig,x,y,
spriteBig = CreateSprite(#PB_Any,800,800)
StartDrawing(SpriteOutput(spriteBig))
FillArea(0,0,-1,$FFCC66)
StopDrawing()
ProcedureReturn spriteBig
EndProcedure
Procedure createSprites()
Define spriteNr,x,y
For x = 1 To 20
spriteNr = CreateSprite(#PB_Any,15,15)
RotateSprite(spriteNr,x*18,#PB_Absolute)
AddElement(spriteList())
spriteList() = spriteNr
Next
EndProcedure
spriteBig = createspriteBig()
createSprites()
Repeat
DisplaySprite(spriteBig,0,0)
If painted = 0
ForEach spriteList()
x + 1 : y + 1
DisplaySprite(spriteList(), x*35,y*35)
Next
x = 0 : y = 0
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
EndIf
ExamineKeyboard()
If KeyboardInkey()
StartDrawing(SpriteOutput(spriteBig))
DrawingMode(#PB_2DDrawing_Default )
ForEach spriteList()
x + 1 : y + 1
;DrawImage(SpriteID(spriteList()),x*35,y*35)
;Box(x*35,y*35,15,15,0)
Next
StopDrawing()
MessageRequester("Bild speichern und schließen?","",#PB_MessageRequester_YesNo)
newSprite = GrabSprite(#PB_Any, 0,0,800,800) ; < ===== grabsprite()
Ergebnis = SaveSprite(newSprite,"sprite.png")
Debug Ergebnis
If #PB_MessageRequester_Yes
SaveSprite(spriteBig,"sprite.png")
End
EndIf
EndIf
Until WaitWindowEvent() = #PB_Event_CloseWindow
Wahrscheinlich mache ich da etwas falsch?
Ich habe noch 4.51 und 5.2etwas auf dem Computer, da habe ich leider nichts gefunden. Wenn es keine andere Lösung gibt, muss ich wahrscheinlich das Musem durchsuchen.
Re: Sprite als tga speichern
Verfasst: 19.06.2018 19:42
von ccode_new
Hallo!
Syntacks_Error hat geschrieben:grabSprite() hört sich gut an, liefert bei mir aber auch nur das große blaue Hintergrundsprite ohne die kleinen Rechtecke:
Ich habe es dir mal repariert!
Code: Alles auswählen
EnableExplicit
UsePNGImageDecoder()
UsePNGImageEncoder() ;Hallo Encoder ;)
InitSprite()
InitKeyboard()
Define window.i,screenwindow,spriteBig, spriteNr,x,y,painted,newSprite, Ergebnis
Global NewList spriteList.i()
window = OpenWindow(#PB_Any, 200,200,800,800,"Test",#PB_Window_SystemMenu)
screenwindow = OpenWindowedScreen(WindowID(window),0,0,800,800,0,0,0,#PB_Screen_NoSynchronization)
Procedure createspriteBig()
Define spriteBig,x,y,
spriteBig = CreateSprite(#PB_Any,800,800)
StartDrawing(SpriteOutput(spriteBig))
FillArea(0,0,-1,$FFCC66)
StopDrawing()
ProcedureReturn spriteBig
EndProcedure
Procedure createSprites()
Define spriteNr,x,y
For x = 1 To 20
spriteNr = CreateSprite(#PB_Any,15,15)
RotateSprite(spriteNr,x*18,#PB_Absolute)
AddElement(spriteList())
spriteList() = spriteNr
Next
EndProcedure
spriteBig = createspriteBig()
createSprites()
Repeat
DisplaySprite(spriteBig,0,0)
If painted = 0
ForEach spriteList()
x + 1 : y + 1
DisplaySprite(spriteList(), x*35,y*35)
Next
x = 0 : y = 0
EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_All)
StartDrawing(SpriteOutput(spriteBig))
DrawingMode(#PB_2DDrawing_Default)
ForEach spriteList()
x + 1 : y + 1
;DrawImage(SpriteID(spriteList()),x*35,y*35)
;Box(x*35,y*35,15,15,0)
Next
StopDrawing()
If MessageRequester("Speichern!","Bild speichern und schließen?",#PB_MessageRequester_YesNo)
If #PB_MessageRequester_Yes
GrabSprite(newSprite, 0,0,800,800) ; < ===== grabsprite()
If IsSprite(newSprite)
Ergebnis = SaveSprite(newSprite,GetCurrentDirectory()+"sprite.png", #PB_ImagePlugin_PNG)
;Debug Ergebnis
EndIf
EndIf
EndIf
EndIf
FlipBuffers() ;Muss ans Ende (sonst ist der Screen leer beim speichern!)
ClearScreen(RGB(0, 0, 0))
Until WaitWindowEvent() = #PB_Event_CloseWindow
Re: Sprite als tga speichern
Verfasst: 19.06.2018 19:50
von Syntacks_Error
Phatastisch! Da hatte ich wohl die Konvention mißverstanden. Problem gelöst, danke.
Re: Sprite als tga speichern
Verfasst: 19.06.2018 20:09
von Syntacks_Error
... und einiges mehr, wie ich gerade sehe
Re: Sprite als tga speichern
Verfasst: 19.06.2018 23:25
von Bisonte
Nur nebenbei : In dem obigen Fall ist
um einige Ecken langsamer als
Bei Box() wird eine komplette Fläche eingefärbt, bei FillArea() wird Pixel für Pixel geprüft, ob die
Zeichenfarbe an eine andere gestossen ist... Wenn man also ein rechteckige Fläche "ausfüllen"
will sollte man Box() nehmen.
(Sind zwar bei den heutigen Maschinen nur ein paar Nanosekündchen, aber wenn man viel davon laufend
zeichnet merkt man es selbst dort.)