Sprite als tga speichern

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Re: Sprite als tga speichern

Beitrag 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
Wer braucht schon Unicode? PB5.24LTS
Benutzeravatar
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

Beitrag 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.
weil einfach einfach einfach ist ... mach' ich es anders
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Sprite als tga speichern

Beitrag 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.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Sprite als tga speichern

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

no Keyboard, press any key
no mouse, you need a cat
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Sprite als tga speichern

Beitrag von Syntacks_Error »

Phatastisch! Da hatte ich wohl die Konvention mißverstanden. Problem gelöst, danke.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Sprite als tga speichern

Beitrag von Syntacks_Error »

... und einiges mehr, wie ich gerade sehe :-)
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Sprite als tga speichern

Beitrag 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.)
PureBasic 6.04 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​​
Antworten