#Sprite Object not initialized bei SaveSprite()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

#Sprite Object not initialized bei SaveSprite()

Beitrag von X360 Andy »

Ich versuche wirklich seit Stunden herauszufinden wieso es bei mir nicht klappt.

Ich habe im Codearchiv , hier , in der Lounge und sogar im Englishen Forum richtig danach gesucht.
Mag sein das es vieleicht irgendwo eine Lösung gibt aber ich habe sie nicht gefunden!

Mein Problem ist , das ich beim Speichern des "Zusammen" gefügten Sprites eine Fehlermeldung bekomme ( #Sprite Object not initialized)

Hier ein Teil meines Codes.

Durch verschiedene Angaben , wie Farbe Font , Text und Grafike soll ein neues Bild erstellt werden , wo ich dann aber nur einen Teil davon speichern will (Im Code nicht angepasst)(<--Grabsprite()) und das soll dann durch SaveSprite() gespeichert werden...
InitSprite hab ich aufgerufen.

Code: Alles auswählen

    If EventGadget() = #Button_0
      text$ = GetGadgetText(#String_0)
      start = 1
    EndIf

  ClearScreen(0)

   If start = 1 And bildja = 1
   DisplaySprite(#Bild, XYZ, ZYX )
   EndIf
  
 If start = 1
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(fontid)
  texth = TextHeight(Text$) 
  textw = TextWidth(Text$)
  X2 =  ScreenX / 2 - textw/2
  Y2 = (ScreenY-130)/2 -texth
  DrawText(x2, y2, Text$, farbe) 
  StopDrawing()
  If again= 0 
  bildtimer = 1
  EndIf
 EndIf
 
 If bildtimer = 1 
   GrabSprite(#Bild2,0,0,400,400,0)
  SaveSprite(#Bild2, "**PFAD**")
   bildtimer = 0
again= 1
EndIf
Wenn ich das richtig verstanden habe , ist es ein art "Bug" von PB ?

Ich hoffe ihr könnt mir sagen wo der Fehler liegt (wenn er an mir liegt)

EDIT sehe grad das der hier gepostet Code keinen richtige sinn ergibt das er eine "Dauers5peicherung" durchführt , das ändert aber nichts das es nicht geht. Oder ?

*Verbessert
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Ich versuche wirklich seit Stunden herauszufinden wieso es bei mir nicht klappt.

hast du kein Windows Viagra?


ne scherz beiseite...

aufgrund dieses "snippets" ist es nicht möglich den Fehler zu erkennen.

schreib doch mal nen kompletten Code,
der auf laden von Ressourcen verzichtet und sie stattdessen selber zeichnet,
den man aus dem Forum in die IDE kopieren kann und starten kann,
und der dann den Fehler produziert.

... vielleicht findest du auf dem Weg dahin schon den entscheidenden Unterschied, der den Fehler ausmacht.


aber so wie das da steht...
da kann man nix zu sagen, außer dass der Fehler anscheinend nicht in diesem Abschnitt verursacht wird.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Ok... :(

einfach den 2ten Pfad durch einen eigenen Pfad ersetzten ...

Code: Alles auswählen

;********************
;Wir "Installieren" die Bilder damit wir sie später als PNG oder JPG speichern und laden können.
;********************
UsePNGImageDecoder()
UsePNGImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()


;********************
;Standart
;********************
Enumeration
  #Window_0
EndEnumeration

Enumeration
  #MenuBar_0
EndEnumeration
timer = 20
Enumeration
  #MENU_1
  #MENU_2
  #MENU_3
  #MENU_4
  #MENU_6
EndEnumeration

Enumeration
  #Button_0
  #String_0
  #Button_1
  #Text_0
  #Text_1
  #Button_2
  #TrackBar_0
  #Text_2
  #Text_3
  #Frame3D_1
  #Button_3
  #Bild
  #Bild2
  #Bild3
EndEnumeration

;********************
;Die Standart front für die Buttons
;********************
Global FontID2
FontID2 = LoadFont(2, "Copperplate Gothic Bold", 14)

;********************
;Eine Einfach Procedure für den Messagerequester
;Wo man den Text selber bestimmen kann
;********************
Procedure Ende(Text$)
  Shared Titel$
  MessageRequester(Titel$, Text$)
  End
EndProcedure
;********************
;Wir schauen ob alles installiert werden kann
;Falls nicht kommt eine Fehlermeldung
;********************
If Not (InitSprite() And InitSprite3D())
  Ende("Init Error")
EndIf
ScreenX = 800
ScreenY = 400
XZ = 0
ZX = 0
;********************
;Wir öffnen Das Fenster, sammt Menü, und erstellen die Gadgets
;********************
If OpenWindow(0, XZ, ZX, ScreenX, ScreenY, "--*--", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  
  If CreateMenu(#MenuBar_0, WindowID(#Window_0))
    MenuTitle("Menü")
    MenuItem(#MENU_1, "Neu")
    MenuItem(#MENU_2, "Laden")
    MenuItem(#MENU_3, "Speichern")
    MenuBar()
    MenuItem(#MENU_4, "about")
    MenuItem(#MENU_6, "Beenden")
  EndIf
  
  If CreateGadgetList(WindowID(#Window_0))
    ButtonGadget(#Button_0, 620, 70, 160, 30, "Create")
    SetGadgetFont(#Button_0, FontID2)
    StringGadget(#String_0, 20, 20, 250, 30, "Name")
    
    SetGadgetFont(#String_0, FontID2)
    ButtonGadget(#Button_1, 290, 20, 140, 30, "Schrift")
    SetGadgetFont(#Button_1, FontID2)
    ButtonGadget(#Button_2, 460, 20, 140, 30, "Farbe")
    SetGadgetFont(#Button_2, FontID2)
    TrackBarGadget(#TrackBar_0, 20, 80, 250, 30, 0, 10, #PB_TrackBar_Ticks)
    TextGadget(#Text_2, 30, 60, 130, 20, "Spiegeln in %")
    TextGadget(#Text_3, 160, 60, 110, 20, "Aktuell: " + Str(Trackbar*10) + "%")
    Frame3DGadget(#Frame3D_1, 10, 10, 780, 105, "")
    ButtonGadget(#Button_3, 620, 20, 160, 30, "Hintergrund")
    SetGadgetFont(#Button_3, FontID2)
    
  EndIf
EndIf

;********************
;Wir setztn die Framerate auf 50
;und setzten Start auf 0 ( damit das ganze nicht gleich angezeigt wird (Später unten bei Drawtext)
;********************
If OpenWindowedScreen(WindowID(0), XZ, ZX + 120, ScreenX, ScreenY-130, 0, 0, 0)
  SetFrameRate(50)
  start = 0
EndIf

;********************
;Hier fangt die Schleife an;
;********************
Repeat
  
  ;********************
  ;Hier wird ausgeben wo gerade sie die Trackbar befindet
  ;und mal 10 gerechnet.
  ;********************
  Trackbar = GetGadgetState(#TrackBar_0)
  SetGadgetText(#Text_3, "Aktuell: " + Str(Trackbar*10) + "%")
  
  
  ;********************
  ;Die ganzen Windowevents ....
  ;********************
  EventID = WaitWindowEvent(50)
  If EventID = #PB_Event_CloseWindow
    Quit = 1
  EndIf
  If EventID = #PB_Event_Gadget
    If EventGadget() = #Button_1
      font = FontRequester("Arial", 14, #PB_FontRequester_Effects)
      fontid = LoadFont(font, SelectedFontName(), SelectedFontSize())
      If SelectedFontSize()>100
        MessageRequester("Info", "Du hast eine größe von über 100 ausgewählt es kann sein das deine Schrifft nicht ganz auf dem Screen draufpasst")
      EndIf
      fontstart = 1
    EndIf
    
    
    ;*************
    ;Wir fragen nach einem Hintergrund bild
    ;Falls keins auswehält kommt eine Fehlermeldung und "Bildja" (was später das Bild anzeigt) bleibt auf 0
    : *************
    
    If EventGadget() = #Button_3
      Datei$ = OpenFileRequester("Hintergrund", "C:\", "Grafik Format|*.png;*.jpg;*.gif;*.bmp", 0)
      If LoadSprite(#Bild, Datei$) = 0
        MessageRequester("Fehler", "Du hast keine oder eine nicht unterstüzte Datei ausgewählt")
      Else
        bildja = 1
      EndIf
    EndIf
    ;*************
    ;***** Wir fragen nach der Farbe ....
    ;*************
    If EventGadget() = #Button_2
      Farbe = ColorRequester($FFFFFF)
    EndIf
    
    **************
    ;***** Wir kontrollieren ob eine Font ausgewählt wurde
    ;***** Und setzten Den spass auf "Start = 1"
    ;*************
    If EventGadget() = #Button_0
      If Font = 1
        text$ = GetGadgetText(#String_0)
        start = 1
      Else
        MessageRequester("Fehler", "Du hast keine Schrifftart ausgewählt")
      EndIf
    EndIf
  EndIf
  
  
  
  ClearScreen(0)
  
  ;****************
  ;******Wenn Font, Bild ausgewählt sind wir das Bild angezeigt
  ;****************
  If start = 1 And bildja = 1
    DisplaySprite(#Bild, XYZ, ZYX)
  EndIf
  
  
  ;********************
  ;Wir zeichnen mit der ausgewählten FONT auf den Screen mit der Farbe vom Requester ( Standart Schwarz )
  ;Wir berechnen den Mittelpunkt und gehen ein bisschen drüber damit es nicht genau auf der Mitte ist (Damit man es besser Spiegeln kann)
  ;Wir hören auf zu Zeichnen
  ;Wenn again auf 0 it dann setzten wir bildtimer auf 1
  ;wenn dies nicht geschiet passiert nichts , soland again nicht wieder auf 0 ist
  ;********************
  If start = 1
    StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawingFont(fontid)
      texth = TextHeight(Text$)
      textw = TextWidth(Text$)
      X2 = ScreenX/2-textw/2
      Y2 = (ScreenY-130)/2-texth
      DrawText(x2, y2, Text$, farbe2)
    StopDrawing()
    If again = 0
      bildtimer = 1
    EndIf
  EndIf
  
  ;********************
  ;Wenn Bildtimer auf 1 ist kommt der Speichervorgang.
  ;Es wird zuerst von einer Postion ein neues Bild erstellt
  ;Und dann mittels Savesprite auf die angebene Postion verändert ( Später mit einen savefilerequester zu ersetzten )
  ;Wir setzten again auf 1 damit er den Speichervorgang nur 1mal durchführt
  ;Das gleich mit dem Bildtimer...
  ;********************
  If bildtimer = 1
    GrabSprite(#Bild2, 0, 0, 400, 400, 0)
    SaveSprite(#Bild2, "C:test.bmp");Test Pfad
    
    again = 1
    bildtimer = 0
  EndIf
  
  ;********************
  ;;Ende
  ;********************
Until quit = 1

     
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Ist der Quellcode 1:1 jetzt kopiert?

Code: Alles auswählen

SaveSprite(#Bild2, "C:test.bmp");Test Pfad
Kann ja nicht funktionieren ... fehlerhafter Pfad :D
Die Fehlermeldung ist aber trotzdem seltsam.
Funktioniert GrabSprite()?

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Erst mal wuerde ich ja pruefen ob GrabSprite erfolgreich war.

In deinem Fall nicht, da du einen Bereich kopieren moechtest der
groesser als der Screen ist.

Code: Alles auswählen

screen cx = 800
screen cy = 270

sprite cx = 400
sprite cy = 400
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Nein den Pfad hab ich einfach geändert, er ist bei mir auf dem Desktop...
@edel :allright:

Dann hab ich wohl eine falsche berechnung am anfang gehabt (Er sollte den nur den halben screen kopieren)
Später hab ich dann einfach 400 auf 400 reingeschrieben...
Ich finde es zwar komisch das es jetzt geht , weil ich mir eigentlich sicher bin das ich auch andere Zahlen drin hatte ( z.b 100 auf 100 )


Naja es geht danke dafür :mrgreen:
Antworten