selbsgestalltetes "universal"-Delay

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

pile

Betreff: selbsgestalltetes "universal"-Delay

BeitragFr, März 24, 2006 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,

hab schon lange keine Fragen mehr gestellt und weil mir neulich was aufgefallen ist, frag ich einfach.
Ich hab bisher eigentlich gedacht mit meiner Methode Delays zu programmieren käme ich ganz gut. Mit diesen Delays mache ich zum Beispiel nen blinkenden Coursor und das geht so:
Ich hab ne Variable die als Zähler fungiert. Sie fängt bei Null an und wird bei jedem Schleifendurchgang um eins erhöht (Counter=Counter+1)
Als nächstes lege ich den Maximalwert fest (z.B. If Counter >=40 then Counter=0)
Und dann noch das Verhalten des Coursor. Dieser wird angezeigt wenn der Zähler zwischen Null und Zwanzig ist .
(If Counter>=0 and Counter<=21 then Coursor=True). Hoffe das konnte jetzt jeder verstehen.
Diese Methode fand ich bisher immer ganz gut, weil sie ziemlich Simpel und flexibel ist. Nun ist mir aber das Problem aufgefallen das dieser Delay auf schwächeren Rechnern viel länger dauert als auf schnelleren, bzw. allgemein auf jedem System verschieden lang ist. Daher ist es auf besonders langsamen Rechnern leider nicht möglich einiges von meinen Spielen anzuwenden.
Also meine Frage ist ob man das so wie ich es mache, ein wenig verbessert, auf jedem System laufen lassen kann? Oder gibt es bessere Alternativen die genauso einfach und flexibel sind?

Danke!
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%
 

Dreamora

BeitragFr, März 24, 2006 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es unabhängig von der Rechnergeschwindigkeit ist, gibt es zwei Möglichkeiten:

1. Du zählst den Counter mit einer FPS abhängig Variable hoch
2. Du rechnest mit Unterschieden bei Millisekunden anstatt mit einer Zählervariable
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragFr, März 24, 2006 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest noch nen Faktor bei den maximal Werten einbauen
um das einfach zu halten bzw. ohne große Änderungen an deinen
Programmen zu machen .

Alternativ die Hauptschleife zeitlich begrenzen das auf schnellen
Computern 50 Frames constant laufen und bei älteren
Compis auch noch 50 Frames erreicht werden .

Oder Effekte sparen auf langsamen PCs .

Gibt viele Möglichkeiten und die wurden hier schon xx mal besprochen .

Terror-State

BeitragSa, März 25, 2006 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn ich mal meinen senf dazu geben darf:

das problem ist mir recht gut bekannt. und wenns auch recht umständlich löste ich dieses problem über MilliSecs()

FrameAkt = ((MilliSecs()-Start) / 10)
bzw.
AktW = ((MilliSecs()-Start) / (30000/360.0))

dadurch lassen sich alle gewünschten intervalle simulieren!
mitn bissel kreatitivät kann man das wunderbar ausbaun.
Also ich benutzt das für alle "delay"-funktion.

noch n tipp von mir: Finger weg vom Delay-Befehl... Der hält nämlich das programm an -> verschwendete rechenzeit in der man doch schon mal irgendwelche berechnungen machen kann.

meines wissens nach gibt es keine effektivere lösung als die oben von mir beschriebene (eheh die leute die vll eine bessere haben füllen sich jetzt provoziert xD)
Ob friedlich oder militant, wichtig ist der Widerstand

pile

BeitragSo, März 26, 2006 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten!

@Markus2: Das klingt nach nem guten Ansatz ohne den vorhandenen Quellcode groß zu verändern. Was genau ist mit "Faktor" gemeint? Etwa eine Messung der Rechengeschwindigkeit? Wenn ja, wie kann man die Messen und wie legt man das in einer Variable ab?

@Terror-State: Was bedeutet denn "FrameAkt" und "Start"? Gut, es sind Variablen aber wie müssen die eingesetzt werden?
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Markus2

BeitragSo, März 26, 2006 14:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde eine kleine Unterfunktion machen die
irgendwas auf dem Bildschirm malt und auch was berechnet .
Und das Ergebnis ist dann Faktor 1 auf deinem PC .
Bei anderen PCs mußte das Ergebnis dann umrechnen .

Code: [AUSKLAPPEN]

Faktor#=1.0
CoursorTime=21*Faktor
(If Counter>=0 and Counter<=CoursorTime then Coursor=True)

Dante

BeitragSo, März 26, 2006 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
und nur falls du bei delay bleiben willst könnte das helfen Wink
(Hält aber auch das Programm an!!!)


Code: [AUSKLAPPEN]
aDelay(100) ;100 Frames abwarten
Print "HUHU"
bDelay(10) ;10 Sekunden abwarten
Print "HUHU"
WaitKey()
End

;Delay über FPS
Function aDelay(s_FPS)
Local fps
start = MilliSecs()
While Not fps = s_FPS
time = MilliSecs()
If MilliSecs() >= start + 1001
fps = fps + 1
EndIf
Wend
Return True
End Function

;Delay über Millisecs
Function bDelay(seks)
Local timer, timed
start = MilliSecs()
timer = seks * 1000
While Not timed = 1
time = MilliSecs()
If MilliSecs() >= start + timer
timed = 1
Return True
EndIf
Wend
End Function

pile

BeitragSo, März 26, 2006 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein den Delay-Befehl benutze ich gar nicht weil er eben das gesammte Programm anhällt.
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Terror-State

BeitragMo, März 27, 2006 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh naja ok ich erklärs dir kurz


AktW = ((MilliSecs()-Start) / (30000/360.0))

Start ist einfach die zeit seit dem programmstart in MilliSecs bzw. seit dem letzten zurücksetzen
Start = MilliSecs
Mit der Formel kann man zum beispiel sehr schön alles berechnen was mit kreis (sinus, cosinus usw.) berechnen...
so setz ich die zeile ein
Ob friedlich oder militant, wichtig ist der Widerstand

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group