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.