usebuffer(zahl) wirkungslos?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
TZTZ
Beiträge: 3
Registriert: 03.11.2008 16:28
Kontaktdaten:

usebuffer(zahl) wirkungslos?

Beitrag von TZTZ »

Hi

ich habe folgendes problem
ich erstelle ein 2d sprite aus einer datei
das wandel ich in ein 3d sprite

das drehe ich
dann will es wieder in ein 2d sprite umwandeln

Code: Alles auswählen

UsePNGImageDecoder()
UseJPEG2000ImageDecoder()
UseJPEGImageDecoder()

Dim posx.l (200)
Dim posy.l (200)
Dim winkel.l (200)
Dim high.l (200)
Dim wide.l (200)
Dim spiegel.l (200)
x.i
y.i

posx(10)=0
posy(10)=0
winkel(10)=90
high(10)=300
wide(10)=400

posx(11)=100
posy(11)=100
winkel(11)=45
high(11)=300
wide(11)=400


If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse()=0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
  End
EndIf
;If OpenWindow(0,0,0,1024,768, "Nipkow",#PB_Window_MinimizeGadget| #PB_Window_ScreenCentered|#PB_Window_SizeGadget )
 ; OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768, 1, 1, 1)
  
 If OpenScreen(1024,768,32," ")
 ; SetActiveWindow(0)
  
  LoadSprite(11,"bau schwarz.png", #PB_Sprite_Texture);|#PB_Sprite_AlphaBlending )
  LoadSprite(12,"rund.png", #PB_Sprite_Texture|#PB_Sprite_AlphaBlending )
 LoadSprite(10,"hinterweis1.png", #PB_Sprite_Texture);|#PB_Sprite_AlphaBlending)
 LoadSprite(0,"cursor3.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
 CreateSprite(1000,1,1)
 
 If IsSprite(0)=0
   End
   EndIf
      
      
      CreateSprite3D(11, 11)
      ;CreateSprite3D(12, 12)
      CreateSprite3D(10, 10)
     ; CreateSprite3D(0, 0)
     ; Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)

      Repeat
         
     ;Debug FormatDate("%ss",Date())


    
   ClearScreen(RGB(0,50,128))
    
    ; Draw our sprite
    ;
    
    
   
    ;ReleaseMouse(0)
    ExamineMouse() 
   
    x=MouseX()
    y=MouseY()
   ; DisplaySprite(0,x,y)
    ;ReleaseMouse(1)

 If 1=1
    
   For Objekt= 1 To 200
       If IsSprite(objekt+200)
    FreeSprite(objekt+200)
  EndIf
  
      If IsSprite3D(objekt)
        size=Sqr(wide(objekt)*wide(objekt)+high(objekt)*high(objekt))
            ob=objekt+200

        Debug Str(size)+" "+Str(ob)

        CreateSprite(ob,size,size,#PB_Sprite_Texture)
     ;  Start3D()

   ZoomSprite3D(objekt,wide(objekt), high(objekt))

  
   If spiegel=0
  ; TransformSprite3D(objekt, posx(Objekt), posy(Objekt),posx(Objekt)+wide(objekt), posy(objekt), posx(Objekt)+wide(objekt), posy(Objekt)+high(objekt), posx(objekt), posy(objekt)+high(objekt))
 Else
   ;TransformSprite3D(#Sprite3D, x1, y1, [z1], x2, y2, [z2], x3, y3, [z3], x4, y4, [z4])
   
 EndIf
  RotateSprite3D(objekt, winkel(objekt), #PB_Absolute)
  ExamineMouse() 
   
    x=MouseX()
    y=MouseY()
    UseBuffer(ob)
Start3D()
   ; FlipBuffers()
   DisplaySprite3D(objekt,posx(Objekt),posy(Objekt))
   Stop3D()
  ; FlipBuffers()


   UseBuffer(-1)
  ;DisplayTransparentSprite(objekt+200,500,500)
    
    
    
    
   If MouseButton(#PB_MouseButton_Left)
     Debug objekt+200
 If SpriteCollision(0,x,y,objekt,posx(Objekt),Posy(objekt)) And aktivesobjekt=0
   aktivesobjekt=objekt
   aktivesobjektx=posx(Objekt)
   aktivesobjekty=posy(Objekt)
   aktivesobjektwide=wide(objekt)
   aktivesobjekthigh=high(objekt)
   aktivesobjektdeltax=x-aktivesobjektx
  aktivesobjektdeltay=y-aktivesobjekty
EndIf

If aktivesobjekt>0
  posx(aktivesobjekt)=x-aktivesobjektdeltax
  posy(aktivesobjekt)=y-aktivesobjektdeltay
EndIf
Else
  aktivesobjekt=0
  
EndIf

  
EndIf

Next

;Debug "AktivesObjekt:"+ Str(aktivesobjekt)+"  aktivesobjektx= "+Str( aktivesobjektx)+"  aktivesobjekty= "+Str( aktivesobjekty)+"  aktivesobjektdeltax= "+Str( aktivesobjektdeltax)+"  aktivesobjektdeltay= "+Str( aktivesobjektdeltay)+"maus x y" +Str(x)+" "+Str(y)
 DisplaySprite(0,x,y)
       
 FlipBuffers()
EndIf
Delay (5)

;Event = WaitWindowEvent()
ExamineKeyboard()
    If Event = #PB_Event_CloseWindow Or  KeyboardPushed(#PB_Key_Escape) ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1
  
  EndIf

UseBuffer(ob)
Start3D()
DisplaySprite3D(objekt,posx(Objekt),posy(Objekt))
Stop3D()
UseBuffer(-1)
das ganze rendert leider nur auf dem screen und nicht auf dem sprite wie kann das sein?

mit freundlichem gruß
Thomas

purebasic vollversion 4.60 winxp
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: usebuffer(zahl) wirkungslos?

Beitrag von Kevin »

Hi,

UseBuffer() funktioniert leider nur noch mit Subsystem DirectX7...

mfg kevin
TZTZ
Beiträge: 3
Registriert: 03.11.2008 16:28
Kontaktdaten:

Re: usebuffer(zahl) wirkungslos?

Beitrag von TZTZ »

irgendwie habe ich das befürchtet trotzdem dank für die schnelle antwort


gibt es eine alternative?
grabsprite will mir nicht so ganz gefallen da brauch ich eine bildschirmecke nur dafür
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: usebuffer(zahl) wirkungslos?

Beitrag von STARGÅTE »

  • Lade doch gleich das einmal (zB in Gimp) gedrehte Bild als Sprite 2D ein.
  • Nimm gleich Sprite3D, da diese mit Hardwareunterstützung gerendert werden und somit schneller sind.
  • Meines Wissens nach braucht GrabSprite kein FlipBuffers(), somit kannst du diese "Bildbearbeitung" einfach nach einem ClearScreen machen und auch mit einem ClearScreen() abschließen, und der Echte Bildschirm bekommt nichts davon mit.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: usebuffer(zahl) wirkungslos?

Beitrag von Kevin »

wenn du Sprites nur Spiegeln willst dann geht das auch so:

Code: Alles auswählen

Procedure MirrorSprite(SpriteID.l, Direction.l) 
  hdc = StartDrawing(SpriteOutput(SpriteID)) 
    Height = SpriteHeight(SpriteID) 
    Width = SpriteWidth(SpriteID) 
    If Direction 
      StretchBlt_(hdc, 0, Height, Width, -Height, hdc, 0, 0, Width, Height, #SRCCOPY) 
    Else 
      StretchBlt_(hdc, Width, 0, -Width, Height, hdc, 0, 0, Width, Height, #SRCCOPY) 
    EndIf 
  StopDrawing() 
EndProcedure 
aus dem Code Archiv

; German forum: http://www.purebasic.fr/german/archive/ ... highlight=
; Author: ChaOsKid (updated for PB4.00 by blbltheworm)
; Date: 23. October 2003
; OS: Windows
; Demo: No

; Mirror a sprite, use Return or Space to see the effect, Esc for quit
; Spiegeln eines Sprites, benutze Return oder Space zum Ansehen des Effekts, Esc für Abbruch

; Die Funktion StretchBlt kopiert eine Bitmap aus einem Speicher-Gerätekontext in einen
; anderen Gerätekontext, wobei die Höhe und die Breite von Quell- und Zielbereich sich
; unterscheiden können und dadurch Vergößerungen und Verkleinerungen ebenso möglich werden
; wie Verzerrungen oder Spiegelungen um die horizonale und/oder vertikale Achse. Alle
; Koordinaten- und Größenangaben werden in Pixeln angegeben.
TZTZ
Beiträge: 3
Registriert: 03.11.2008 16:28
Kontaktdaten:

Re: usebuffer(zahl) wirkungslos?

Beitrag von TZTZ »

ok nun muss es über grabsprite gehen

nun gut

ich will image drehen bewegen und bei bedarf auch spiegeln

vorher drehen ist nicht gewünscht



danke für euren schnellen antworten
Antworten