Seite 1 von 5

eine sprite in ein sprite packen

Verfasst: 20.07.2008 09:36
von sechsrad
hallo, ich habe ein sprites, welches ein auto darstellt ohne räder.

jetzt möchte ich 2tes sprites, welches nur ein teil der fläche einnimmt da reinkopieren. kriege das nicht hin.

oder geht das nicht?
wird das erste spritebild total überschrieben?

mfg

Verfasst: 20.07.2008 09:42
von Kaeru Gaman
moin...

du benutzt UseBuffer(ErstesSprite)?
du musst DisplayTransparentSprite(ZweitesSprite) benutzen.

...oder wie meinst du das?

Verfasst: 20.07.2008 10:04
von sechsrad
hier ein einfaches beispiel, welches nicht funktioniert.
ich möchte das zweite sprite mit im ersten sprite sehen, weil ich es ja dort reingekopiert habe. da das zweite sprite kleiner ist, müsste man doch jetzt beide flächen sehen.

mfg

Code: Alles auswählen

Global breite1.f ,hoehe1.f,breite2.f ,hoehe2.f
  
  InitSprite()
  InitSprite3D()
  
  OpenWindow(0,0,0,800,600,"sprites!",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

  OpenWindowedScreen(WindowID(0),5,5,500,500,0,0,0)
 
  
  CreateSprite(0,500,500,#PB_Sprite_Texture) ; grundfläche gelb
  CreateSprite3D(0,0)
  StartDrawing(SpriteOutput(0))
    Box(0,0,500,500,RGB(255,255,0))
  StopDrawing()  
  
  breite1=80
  hoehe1=80
  CreateSprite(1,breite1,hoehe1,#PB_Sprite_Texture) ; erstes sprite 80x80
  CreateSprite3D(1, 1)
  StartDrawing(SpriteOutput(1))
    Box(0,0,breite1,hoehe1,RGB(255,0,0))
  StopDrawing()
  
  breite2=40
  hoehe2=40
  CreateSprite(2,breite2,hoehe2,#PB_Sprite_Texture) ; zweites sprite 40x40
  CreateSprite3D(2, 2)
  StartDrawing(SpriteOutput(2))
    Box(0,0,breite1,hoehe1,RGB(0,255,0))
  StopDrawing()
  
  TransparentSpriteColor(0, RGB(255, 0, 255)) 
  TransparentSpriteColor(1, RGB(255, 0, 255)) 
  TransparentSpriteColor(2, RGB(255, 0, 255)) 
  
  CopySprite (2,1) ; zweites sprite in das erste
   
  Repeat
  
    Event.l = WindowEvent()    
     
    DisplaySprite(0, 0,0) 
    DisplaySprite(1, 50,50)  ; jetzt möchte ich das zweite mit im ersten sprite zusammen sehen
   
      
    FlipBuffers()
      
    Until Event = #PB_Event_CloseWindow   

End  


Verfasst: 20.07.2008 10:37
von Kaeru Gaman
ja, ne, Denkfehler.
ich geb zu, die Hilfe ist ungenau formuliert.

ergänze mal diese drei zeilen in deinem code:

Code: Alles auswählen

  CopySprite (2,1) ; zweites sprite in das erste

  breite3 = SpriteWidth  (1)
  hoehe3  = SpriteHeight (1)
  Debug "Das neue Sprite ist " + Str(breite3) + "pix breit und " + Str(hoehe3) + "pix hoch."
   
  Repeat

Verfasst: 20.07.2008 11:08
von Kaeru Gaman
so, hab dir mal ein Beispiel gezimmert...

Code: Alles auswählen

  InitSprite()
  InitSprite3D()
 
  OpenWindow(0,0,0,800,600,"sprites!",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

  OpenWindowedScreen(WindowID(0),5,5,500,500,0,0,0)
 
  TransparentSpriteColor( #PB_Default, RGB(255, 0, 255))  ; vorab für alle folgenden

  CreateSprite(0,500,500,#PB_Sprite_Texture) ; grundfläche gelb
  CreateSprite3D(0,0)
  StartDrawing(SpriteOutput(0))
    Box(0,0,500,500,RGB(224,192,0))
  StopDrawing() 
 
  breite1=160
  hoehe1=160
  CreateSprite(1,breite1,hoehe1,#PB_Sprite_Texture) ; erstes sprite 160x160
  CreateSprite3D(1, 1)
  StartDrawing(SpriteOutput(1))
    Box(0,0,breite1,hoehe1,RGB(255,0,255))  ; Fläche transparent
    For n=20 To 1 Step -1
      Circle( 80, 80, 4*n, RGB(0, 255-8*n, 0))
    Next
  StopDrawing()
 
  breite2=40
  hoehe2=40
  CreateSprite(2,breite2,hoehe2,#PB_Sprite_Texture) ; zweites sprite 40x40
  CreateSprite3D(2, 2)
  StartDrawing(SpriteOutput(2))
    Box(0,0,breite1,hoehe1,RGB(255,0,255))  ; Fläche transparent
    For n=20 To 1 Step -1
      Circle( 20, 20, n, RGB(0, 0, 255-8*n))
    Next
  StopDrawing()

;*** zweites sprite in das erste

  UseBuffer(1)    ; Sprite #1 als Ausgabebuffer benutzen
  
  DisplayTransparentSprite(2, 80, 20)  ; Sprite #2 hinein darstellen
  
  UseBuffer(#PB_Default)  ; Ausgabe wieder auf Screenbuffer

   
  Repeat
 
    Event.l = WindowEvent()   
     
    DisplaySprite(0, 0,0)
    DisplayTransparentSprite(1, 50,50)  ; voilá
   
     
    FlipBuffers()
     
    Until Event = #PB_Event_CloseWindow   

End 

Verfasst: 20.07.2008 15:45
von sechsrad
jup, das wars.
wäre ich nie drauf gekommen.

danke.

mfg

Verfasst: 20.07.2008 20:11
von sechsrad
warum rotiert dieses sprite nicht : RotateSprite3D(leerspr1,winkel,0), wenn ich dies dann wieder damit darstellen möchte: DisplayTransparentSprite(leerspr1, 150,50)

ich habe ein weissen untergrund, darin habe ich ein recheckiges sprite gepackt mit usebuffer und möchte nun das hauptsprite(weisse sprite) drehen. es dreht nicht.

Code: Alles auswählen

Global winkel.f,winkeld.f
  Global leerspr1.l=0
  Global hintergrund1.l=1
  Global chassic1.l=2
  Global leerspr1_bh.w

  InitSprite()
  InitSprite3D()
 
  OpenWindow(0,0,0,800,600,"sprites!",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

  OpenWindowedScreen(WindowID(0),5,5,500,500,0,0,0)
 
  TransparentSpriteColor( #PB_Default, RGB(255, 0, 255))  

  CreateSprite(hintergrund1,500,500,#PB_Sprite_Texture) 
  CreateSprite3D(hintergrund1,hintergrund1)
  StartDrawing(SpriteOutput(hintergrund1))
    Box(0,0,500,500,RGB(224,192,0))
  StopDrawing()
 
  leerspr1_bh=120
  CreateSprite(leerspr1,leerspr1_bh,leerspr1_bh,#PB_Sprite_Texture) 
  CreateSprite3D(leerspr1, leerspr1)
  StartDrawing(SpriteOutput(leerspr1))
    Box(0,0,leerspr1_bh,leerspr1_bh,RGB(255,255,255))  
  StopDrawing() 
    
  CreateSprite(chassic1,50,80,#PB_Sprite_Texture) 
  CreateSprite3D(chassic1, chassic1)
  StartDrawing(SpriteOutput(chassic1))
    Box(0,0,50,80,RGB(255,0,0))  
  StopDrawing() 
  
  UseBuffer(leerspr1)   
  DisplayTransparentSprite(chassic1, 35,20) 
  UseBuffer(#PB_Default)  
  
  Repeat
 
    Event.l = WindowEvent()  
    
    If GetAsyncKeyState_(#VK_RIGHT)     
      winkel=winkel+1
      RotateSprite3D(leerspr1,winkel,0)
      Debug winkel    
    ElseIf GetAsyncKeyState_(#VK_LEFT)
      winkel=winkel-1
      RotateSprite3D(leerspr1,winkel,0)
      Debug winkel
    EndIf  

     
    DisplaySprite(hintergrund1, 0,0)

    DisplayTransparentSprite(leerspr1, 150,50)
    
    FlipBuffers()
     
    Until Event = #PB_Event_CloseWindow   

End

Verfasst: 20.07.2008 20:17
von STARGÅTE
weil DisplayTransparentSprite(leerspr1, 150,50) für 2D ist

für 3D (RotateSprite3D) dann bitte DisplaySprite3D(leerspr1, 150,50) verwenden, transparenz ist da automatisch.

Verfasst: 20.07.2008 21:05
von sechsrad
jetzt wollte ich in dem sprite "leerspr1" , das gedrehte sprite "chassic1" mit
usebuffer reinbringen. klappt nicht.

das leerspr1 wird aber dargestellt , aber ohne innenleben.

bitte um hilfe.

mfg

Code: Alles auswählen

Global winkel.f,winkeld.f
  Global leerspr1.l=0
  Global hintergrund1.l=1
  Global chassic1.l=2
  Global leerspr1_bh.w

  InitSprite()
  InitSprite3D()
 
  OpenWindow(0,0,0,800,600,"sprites!",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)

  OpenWindowedScreen(WindowID(0),5,5,500,500,0,0,0)
 
  TransparentSpriteColor( #PB_Default, RGB(255, 0, 255))  

  CreateSprite(hintergrund1,500,500,#PB_Sprite_Texture) 
  CreateSprite3D(hintergrund1,hintergrund1)
  StartDrawing(SpriteOutput(hintergrund1))
    Box(0,0,500,500,RGB(224,192,0))
  StopDrawing()
 
  leerspr1_bh=120
  CreateSprite(leerspr1,leerspr1_bh,leerspr1_bh,#PB_Sprite_Texture) 
  CreateSprite3D(leerspr1, leerspr1)
  StartDrawing(SpriteOutput(leerspr1))
    Box(0,0,leerspr1_bh,leerspr1_bh,RGB(255,255,255))  
  StopDrawing() 
    
  CreateSprite(chassic1,50,80,#PB_Sprite_Texture) 
  CreateSprite3D(chassic1, chassic1)
  StartDrawing(SpriteOutput(chassic1))
    Box(0,0,50,80,RGB(255,0,0))  
  StopDrawing() 
  
 
  Repeat
 
    Event.l = WindowEvent()  
    
    If GetAsyncKeyState_(#VK_RIGHT)     
      winkel=winkel+1
      RotateSprite3D(chassic1,winkel,0) 
      UseBuffer(leerspr1) 
      Start3D()   
      DisplaySprite3D(chassic1, 35,20) 
      Stop3D()
      UseBuffer(#PB_Default)  
    ElseIf GetAsyncKeyState_(#VK_LEFT)
      winkel=winkel-1
      RotateSprite3D(chassic1,winkel,0) 
      UseBuffer(leerspr1)  
      Start3D()  
      DisplaySprite3D(chassic1, 35,20) 
      Stop3D()
      UseBuffer(#PB_Default)  
    EndIf  
    
    DisplaySprite(hintergrund1, 0,0)
    Start3D()
    DisplaySprite3D(leerspr1, 150,50)
    Stop3D()
    
    FlipBuffers()
     
    Until Event = #PB_Event_CloseWindow   

End
[/quote]

Verfasst: 20.07.2008 21:40
von Kaeru Gaman
probier mal ob es funktioniert, wenn du das RotateSprite3D dierekt vorm DisplaySprite3D ausführst,
also wenn der selbe buffer aktiv ist im selbem Start3D/Stop3D-Block.
(irgendwie wundert mich, dass es das nicht anmeckert)

irgendwas war da aber auch noch, mit 3D operationen und alternativen buffern,
ich meine mich zu erinnern dass man nicht alle kombinationen benutzen kann,
bin aber nicht mehr sicher.