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

Code: Alles auswählen

FillArea(0,0,-1,$FFCC66)
um einige Ecken langsamer als

Code: Alles auswählen

Box(0, 0, OutPutWidth(), OutPutHeight(), $FFCC66)
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.)