Seite 1 von 1

Blinkendes Sprite in Thread?

Verfasst: 08.06.2025 12:24
von Delle
Hallo,

ich möchte ein Sprite aller 1 Sekunde blinkend dargestellt haben (on/off).

Kann man das eigentlich auch elegant in einen Thread packen mit 1000 ms Delay?

Aber Flipbuffers findet da ja nicht statt...

Wäre schon cool, wenn man unabhängig vom Repeat/Forever da da nicht extra reinpacken muss, sondern nur einmal darin bei Bedarf den Thread aufruft und bei Bedarf wieder killt.

Danke! :)

Re: Blinkendes Sprite in Thread?

Verfasst: 08.06.2025 12:30
von DarkDragon
ElapsedMilliseconds() ist dein Freund und je nach dem wie hoch der Unterschied zu einer gewissen Startzeit ist zeigst du das eine Bild oder das andere. Aber Threads sind nicht für sowas gedacht.

Re: Blinkendes Sprite in Thread?

Verfasst: 08.06.2025 13:28
von Delle
Hm, ist natürlich ungünstig. Bei normalen Desktop-Anwendungen lager ich eben einfach was in Prozeduren oder Threads aus, damit sie den weiteren Programmablauf nicht "aufhalten" und es übersichtlich bleibt.

Ich möchte gerne flexible Erklär-Slideshows in PB machen, sprich PB läd eine Textdatei mit nacheinander abfolgenden Befehlen ein und führt diese aus.

Die Textdatei sieht dann etwa so aus:

Code: Alles auswählen

; zeige die 3 Charaktere als Sprite an; Positionen X / Y

Show(0,"Lehrer","images/lehrer.png",100,100);
Show(1,"Schüler Max","images/schueler_max.png",200,100);
Show(2,"Schülerin Mia","images/schuelerin_mia.png",300,100);

; 3 Sekunden Pause
Warte(3)

; spiele sound ab, warte bis audio beendet und fahre dann erst fort
Sound(0,"Willkommen","audio/willkommen.wav", "warten")

; bewege Lehrer aus dem Bildschirm raus, Richtung: rechts, Geschwindigkeit: schnell
Move(0,"Lehrer","rechts","schnell")

;usw.
Also zeilenweise abarbeiten und die simplen Befehle für PB uminterpretieren.

Die drei Personen im Beispiel sollen natürlich stehen bleiben, solange sie entweder rausbewegt, ausgeblendet oder einfach entfernt werden. Die müssen dann vermutlich in eine Liste/Array mit aktiven Charakteren, oder? Oder einfach IsSprite abfragen?

Bzw. könnte man diese auch einfach mit einer andere Variante (hier "lachend" direkt austauschen mit z.B.

Code: Alles auswählen

Show(2,"Schülerin Mia","images/schuelerin_mia_lachend.png",300,100);


oder?

Unterm Strich soll also PB alles handeln, die Schüler dann selbst flexibel mittels Texdatei und ihren Fotos/Audios agieren können...

Re: Blinkendes Sprite in Thread?

Verfasst: 08.06.2025 13:43
von STARGÅTE
Du kannst auch in der Repeat/Forever ganz normal Prozedure und Funktionen aufrufen die dann z.B. ein Sprite anzeigen (oder eben nicht anzeigen, also blinkend).
Das ganze mit Threads zu realisieren, wird bei einer seriellen Darstellungsmechanik, wie es die Sprite-Bibliothek ist, nicht klappen.

Bei Sprite und Screens wird immer linear das Schema: ClearScreen, DisplaySprite, ..., DisplaySprite, FlipBuffer abgearbeitet.
Welches Sprite also über welchem anderen liegt, hängt von der Position des Aufrufes von DisplaySprite ab.
Es gibt keine z-Koordinate, somit würden mehrere Threads die parallel DisplaySprite aufrufen, in einer völlig willkürliche Darstellungstiefe das Sprite anzeigen. So wäre mal das eine mal das andere oben, oder gar gar nicht sichtbar, weil es genau vor ClearScreen() aufgerufen wird.

Re: Blinkendes Sprite in Thread?

Verfasst: 08.06.2025 14:20
von Delle
Die Prozedure hält mir aber auch wieder den Ablauf auf, wenn ich es sinngemäß so lösen wollen würde:

Code: Alles auswählen

Procedure Blinker()

DisplaySprite(...
Delay (250)

EndProc...
ElapsedMilliseconds() wurde ja schon vorgeschlagen, wie wendet man das an?

Wenn die abgelaufene Zeit <250 ms ist z.B, dann zeige das Sprite an, wenn größer als 250 dann nicht, bei 500 wieder ElapsedMilliseconds() neu aufrufen?

Wegen Z-Index hab ich mir auch schon Gedanken gemacht, in dem Sinne setzt ja der User dann die Reihenfolge selbst...

Re: Blinkendes Sprite in Thread?

Verfasst: 08.06.2025 14:27
von STARGÅTE

Code: Alles auswählen

Procedure Blinker()

If ElapsedMilliseconds() % 500 < 250 ; Durch die Periode (500 ms) teilen und fragen, ob es kleiner als 250 ms ist
	DisplaySprite(...
EndIf

EndProcedure

Re: Blinkendes Sprite in Thread?

Verfasst: 08.06.2025 14:59
von Delle
Geilomat! Wollte es anscheinend komplizierter machen als es ist ;)

Ich werkel mal weiter...