Ich habe da noch mal ein paar Fragen über Sprites.
Wenn ich einen transparenten Sprite über einen anderen Sprite lege, dann ist der Sprite nicht mehr transparent. Wenn ich diesen dann noch bewegen lassen, dann zieht der obere, nicht mehr transparente Spite auch noch einen Schwanz hinter sich. Auf den Screen, ohne hinter-gelegten Sprite selber kappt alles - also mit der Transparenz und Bewegung.
ClearScreen(RGB(0,0,0))
DisplaySprite(2,0,0)
DisplayTransparentSprite(3,spx,440)
Ich denke da fehlt wieder mal ein Befehl oder was mache ich da falsch?
das nächste ist, wie ändere ich die Sprite Priorität, also ein in Vordergrund liegender Sprite in den Hintergrund legen?
Ein paar Sprite-Fragen
-
- Beiträge: 103
- Registriert: 25.08.2013 18:04
- Computerausstattung: alles mögliche^^
- Wohnort: Schöppenstedt
- Kontaktdaten:
Re: Ein paar Sprite-Fragen
Ich frage mich immer, was du da machst? Hier mal ein Beispiel was ohne Probleme funktioniert:northstarex hat geschrieben:Wenn ich einen transparenten Sprite über einen anderen Sprite lege, dann ist der Sprite nicht mehr transparent. Wenn ich diesen dann noch bewegen lassen, dann zieht der obere, nicht mehr transparente Spite auch noch einen Schwanz hinter sich. Auf den Screen, ohne hinter-gelegten Sprite selber kappt alles - also mit der Transparenz und Bewegung.
Code: Alles auswählen
Enumeration
#Window
#Sprite1
#Sprite2
#Sprite3
EndEnumeration
InitSprite()
OpenWindow(#Window, 0, 0, 960, 540, "Graphics", #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window))
CreateSprite(#Sprite1, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite1))
Box(0, 0, 128, 128, $FF00FF)
Circle(64, 64, 64, $00FF00)
StopDrawing()
EndIf
CreateSprite(#Sprite2, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite2))
Box(0, 0, 128, 128, $FF00FF)
Circle(64, 64, 64, $0000FF)
StopDrawing()
EndIf
CreateSprite(#Sprite3, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite3))
Box(0, 0, 128, 128, $FF00FF)
Circle(64, 64, 64, $FF0000)
StopDrawing()
EndIf
TransparentSpriteColor(#Sprite1, $FF00FF)
TransparentSpriteColor(#Sprite2, $FF00FF)
TransparentSpriteColor(#Sprite3, $FF00FF)
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_None
Break
Case #PB_Event_CloseWindow
Break 2
EndSelect
ForEver
ClearScreen($000000)
DisplayTransparentSprite(#Sprite1, Cos(ElapsedMilliseconds()*0.001)*100+200, 100)
DisplayTransparentSprite(#Sprite2, Sin(ElapsedMilliseconds()*0.001)*100+200, 150)
DisplayTransparentSprite(#Sprite3, -Cos(ElapsedMilliseconds()*0.001)*100+200, 200)
FlipBuffers()
ForEver
End
Die "Priorität" wie du sie nennst, gibt es in PureBasic nicht, die Zeichenreihenfolge ist exakt die Reihenfolge der Aufrufe von DisplaySprite / DisplayTransparentSpritenorthstarex hat geschrieben:das nächste ist, wie ändere ich die Sprite Priorität, also ein in Vordergrund liegender Sprite in den Hintergrund legen?
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 103
- Registriert: 25.08.2013 18:04
- Computerausstattung: alles mögliche^^
- Wohnort: Schöppenstedt
- Kontaktdaten:
Re: Ein paar Sprite-Fragen
Ich frage mich auch mittlerweile was ich hier mache
Nur zum Verständnis: Ich will für mich nur ein Tool zusammenschrauben, damit ich mal ohne große Neueinarbeitung unterschiedliche Routinen zu Hand habe. Alles andere hat soweit wunderbar geklappt, nur beim Thema Sprite bin ich hängengeblieben - was ich eigentlich dachte, dass dieses ganz easy ist.
Hier nun dein Script, mit einigen Änderungen von mir. Diese habe ich mit ";---------------" markiert.
Da wirst du sehen das es nun nicht mehr geht mit der Transparenz und Schmier-freien Bewegung.
Grabsprite benutze ich deswegen, weil sich der Hintergrund z.b. durch Texte ändert. Kann mir noch vorstellen, dass der erzeugte Sprite von Grabsprite zu groß ist. Aber ich habe alles es erst mal so gelassen. Bin gespannt.
Nur zum Verständnis: Ich will für mich nur ein Tool zusammenschrauben, damit ich mal ohne große Neueinarbeitung unterschiedliche Routinen zu Hand habe. Alles andere hat soweit wunderbar geklappt, nur beim Thema Sprite bin ich hängengeblieben - was ich eigentlich dachte, dass dieses ganz easy ist.
Hier nun dein Script, mit einigen Änderungen von mir. Diese habe ich mit ";---------------" markiert.
Da wirst du sehen das es nun nicht mehr geht mit der Transparenz und Schmier-freien Bewegung.
Code: Alles auswählen
Enumeration
#Window
#Sprite1
#Sprite2
#Sprite3
#Sprite4
EndEnumeration
InitSprite()
UseJPEGImageDecoder() ;<----------------------
LoadImage(2,"pac2.jpg") ;<---------------------- geht irgend ein jpg mit 960x540px
OpenWindow(#Window, 0, 0, 960, 540, "Graphics", #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window))
StartDrawing(ScreenOutput()) ;<----------------------
DrawImage(ImageID(2),0,0) ;<----------------------
StopDrawing() ;<----------------------
CreateSprite(#Sprite1, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite1))
Box(0, 0, 128, 128, $FF00FF)
Circle(64, 64, 64, $00FF00)
StopDrawing()
EndIf
CreateSprite(#Sprite2, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite2))
Box(0, 0, 128, 128, $FF00FF)
Circle(64, 64, 64, $0000FF)
StopDrawing()
EndIf
CreateSprite(#Sprite3, 128, 128, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#Sprite3))
Box(0, 0, 128, 128, $FF00FF)
Circle(64, 64, 64, $FF0000)
StopDrawing()
EndIf
TransparentSpriteColor(#Sprite1, $FF00FF)
TransparentSpriteColor(#Sprite2, $FF00FF)
TransparentSpriteColor(#Sprite3, $FF00FF)
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_None
Break
Case #PB_Event_CloseWindow
Break 2
EndSelect
ForEver
GrabSprite(#Sprite4, 0,0,960, 540) ;<------------------------- oder gibt es was anderes um einen kompl. Screenshot zu erstellen?
ClearScreen($000000)
DisplaySprite(#Sprite4,0,0) ;<-------------------------
DisplayTransparentSprite(#Sprite1, Cos(ElapsedMilliseconds()*0.001)*100+200, 100)
DisplayTransparentSprite(#Sprite2, Sin(ElapsedMilliseconds()*0.001)*100+200, 150)
DisplayTransparentSprite(#Sprite3, -Cos(ElapsedMilliseconds()*0.001)*100+200, 200)
FlipBuffers()
ForEver
End
Grabsprite benutze ich deswegen, weil sich der Hintergrund z.b. durch Texte ändert. Kann mir noch vorstellen, dass der erzeugte Sprite von Grabsprite zu groß ist. Aber ich habe alles es erst mal so gelassen. Bin gespannt.
Zuletzt geändert von northstarex am 09.02.2021 14:51, insgesamt 1-mal geändert.
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Ein paar Sprite-Fragen
Wieso lädst du pac2.jpg als Image und malst es dann nur einmal auf den Screen? Wenn es nur einmal gezeichnet wird, dann wird es ja auch nie wieder aufgefrischt, nachdem du etwas neues darüber gezeichnet hast. Du solltest pac2.jpg als Sprite laden und ebenfalls immer wieder vor allen anderen Sprites zeichnen.
Außerdem ist das hier überflüssig:
Du speicherst das aktuelle Bild, löscht den Bildschirm, und schreibst es dann wieder. Dann kannst du die drei Zeilen ja gleich ganz weg lassen.
Außerdem ist das hier überflüssig:
Code: Alles auswählen
GrabSprite(#Sprite4, 0,0,960, 540) ;<------------------------- oder gibt es was anderes um einen kompl. Screenshot zu erstellen?
ClearScreen($000000)
DisplaySprite(#Sprite4,0,0) ;<-------------------------
-
- Beiträge: 103
- Registriert: 25.08.2013 18:04
- Computerausstattung: alles mögliche^^
- Wohnort: Schöppenstedt
- Kontaktdaten:
Re: Ein paar Sprite-Fragen
wie ich schon schrieb. im eigentlichen Programm verändert sich der Hintergrund immer wieder mal. Das ist erst mal egal wie der Hintergrund aufgebaut wird. Das Prg hier dient nur als Beispiel. Aber das ändert ja an dem Sprite Darstellungsproblem nichts.
- HeX0R
- Beiträge: 2959
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 - Kontaktdaten:
Re: Ein paar Sprite-Fragen
überleg doch mal:
Schleifestart
1 Du kopierst den ganzen Screen
2 löschst den ganzen Screen
3 Schreibst den vorher kopierten Screen zurück (ergo: Du bist im selben Zustand wie bei Schritt 1, daher völlig sinnlos)
4 malst drei Sprites auf den Screen
5 springst zum Schleifenstart, was passiert nun?
1 Du kopierst den ganzen Screen INKLUSIVE der drei vorher aufgemalten Sprites!
Also mit jeder weiteren Schleife siehst Du mehr von Deinen Sprites, die dann wie "Schlieren" dargestellt werden.
Schleifestart
1 Du kopierst den ganzen Screen
2 löschst den ganzen Screen
3 Schreibst den vorher kopierten Screen zurück (ergo: Du bist im selben Zustand wie bei Schritt 1, daher völlig sinnlos)
4 malst drei Sprites auf den Screen
5 springst zum Schleifenstart, was passiert nun?
1 Du kopierst den ganzen Screen INKLUSIVE der drei vorher aufgemalten Sprites!
Also mit jeder weiteren Schleife siehst Du mehr von Deinen Sprites, die dann wie "Schlieren" dargestellt werden.
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}
-
- Beiträge: 103
- Registriert: 25.08.2013 18:04
- Computerausstattung: alles mögliche^^
- Wohnort: Schöppenstedt
- Kontaktdaten:
Re: Ein paar Sprite-Fragen
aaarrrrrrrrrr... das grabben muss vor dem Repeart.... ja klar.
manchmal wird man schon blind bei den einfachsten Abläufen.
Danke dir
manchmal wird man schon blind bei den einfachsten Abläufen.
Danke dir