eine sprite in ein sprite packen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

eine sprite in ein sprite packen

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

moin...

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

...oder wie meinst du das?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag 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  

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

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag von sechsrad »

jup, das wars.
wäre ich nie drauf gekommen.

danke.

mfg
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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.
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
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag 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]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten