Blinkendes Sprite in Thread?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Blinkendes Sprite in Thread?

Beitrag 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! :)
PB 6.21 | Win 11
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Blinkendes Sprite in Thread?

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Blinkendes Sprite in Thread?

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

Re: Blinkendes Sprite in Thread?

Beitrag 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.
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
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Blinkendes Sprite in Thread?

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

Re: Blinkendes Sprite in Thread?

Beitrag 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
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
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Re: Blinkendes Sprite in Thread?

Beitrag von Delle »

Geilomat! Wollte es anscheinend komplizierter machen als es ist ;)

Ich werkel mal weiter...
PB 6.21 | Win 11
Antworten