Sprite als tga speichern
-
- Beiträge: 31
- Registriert: 23.06.2013 06:26
- Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.
Re: Sprite als tga speichern
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
SetSpriteOutput, oder so, damit konnte man Sprites auf Speites zeichnen. :3
Wer braucht schon Unicode? PB5.24LTS
- Imhotheb
- Beiträge: 192
- Registriert: 10.10.2014 13:14
- Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
- Wohnort: Wolfenbüttel
Re: Sprite als tga speichern
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.
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.
weil einfach einfach einfach ist ... mach' ich es anders
-
- Beiträge: 107
- Registriert: 08.03.2009 16:08
Re: Sprite als tga speichern
grabSprite() hört sich gut an, liefert bei mir aber auch nur das große blaue Hintergrundsprite ohne die kleinen Rechtecke:
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.
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
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
Hallo!
Ich habe es dir mal repariert!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:
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
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
-
- Beiträge: 107
- Registriert: 08.03.2009 16:08
Re: Sprite als tga speichern
Phatastisch! Da hatte ich wohl die Konvention mißverstanden. Problem gelöst, danke.
-
- Beiträge: 107
- Registriert: 08.03.2009 16:08
Re: Sprite als tga speichern
... und einiges mehr, wie ich gerade sehe
Re: Sprite als tga speichern
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.)
Code: Alles auswählen
FillArea(0,0,-1,$FFCC66)
Code: Alles auswählen
Box(0, 0, OutPutWidth(), OutPutHeight(), $FFCC66)
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.)
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom