Frage zu Schleifen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: Frage zu Schleifen

BeitragDo, März 11, 2010 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Es wird ja oft gesagt, dass Befehle wie "Delay()" schlecht für die programmierung wären, da sie das ganze Programm "aufhalten". Wie sieht das mit Schleifen aus, ich meine die halten ja auch das Programm auf, bis eine Bedingung erfüllt wurde.
In dem Spiel was ich im Moment programmiere, brauche ich Schleifen die das Programm nicht aufhalten bis eine Bedingung erfüllt ist, sondern sie soll parallel zum Programm arbeiten, wie könnte ich das anstellen?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

BladeRunner

Moderator

BeitragDo, März 11, 2010 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst in jedem Durchlauf deiner Hauptschleife nur einen Durchgang deiner 'nebenbeischleife' und speicherst die Werte wo Du in der Schleife stehst zwischen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Midimaster

BeitragDo, März 11, 2010 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Sinn vom Delay() ist ja gerade das "aufhalten". Streng genommen geht die Kontrolle zurück an das Betriebssystem, das dann in der Zeit andere Aufgaben erledigen kann. So verbraucht z.b dieses Programm 100% Prozessorleistung und stresst die Grafikkarte, obwohl es nix neues zu Zeichnen gibt:

BlitzBasic: [AUSKLAPPEN]
Repeat
Cls
Rect 100,100,100,100
Flip 0
Until KeyHit(1)


So beruhigt sich der Rechner und zeichnet das "Bild" wenigsten nur 60x pro Sekunde:
BlitzBasic: [AUSKLAPPEN]
Repeat
Cls
Rect 100,100,100,100
Delay 15
Flip 0
Until KeyHit(1)

Anmerkung: ginge natürlich auch mit einem Timer, aber Marius94 wollte was mit "Delay" sehen!

Um nun in eigenen Programmen auf etwas zu warten, programmierst du keine Schleifen, die erst verlassen werden, wenn das Ereignis eintritt:

Nicht nachmachen:
BlitzBasic: [AUSKLAPPEN]
Repeat
Cls
Repeat
MausX=MouseX()
Text 100,100,"Bewege die Maus"
Flip 0
Until MausX()<10
Text 100,150,"Maus ist jetzt links"
Flip 0
Until KeyHit(1)

da hättest du, wie du schon selber angemerkt hast eine Schleife, die wieder die ganze Performance frisst und den Prozessor stresst.

Besser wäre es, den Zustand nur 1x kurz abzufragen und dann wieder in das Hauptpgramm zu springen. Dort reagierst du auf den Zustand:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()
MausFlag=0
Repeat
Cls
Text 100,100,"Bewege die Maus"
If MouseX()< 10 Then
MausFlag=1
Else
MausFlag=0
EndIf
If MausFlag=1 Then
Text 100,150,"Maus ist jetzt links"
EndIf
Text 100,200,"Hauptprogramm läuft rund: " + MilliSecs()
Flip 0
Delay 15
Until KeyHit(1)


Ein schöner Effekt ist, dass Du jetzt auf das Ereignis warten kannst und die Hauptschleife trotzdem ständig läuft. Als Beweis die Zeile mit dem Millisecs(). Und wegen des Delay 15 ist die Systemauslastung unter 5%
 

CO2

ehemals "SirMO"

BeitragFr, März 12, 2010 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
dankeschön für die Antworten.
Wenn ich jetzt aber machen will, dass der Tank leerer wird nach ein paar sekunden (100%, 99%, usw.) wie mache ich das? ich kann da ja nicht nur einmal kurz einen Zustand abfragen, sondern dass muss parallel zum Programm laufen, außerdem muss ja auch je nach Geschwindigkeit des Fahrzeuges der Tank schneller oder weniger schnell leerer werden.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

ozzi789

BeitragFr, März 12, 2010 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Etwas eigen Initative wäre sinnvoll, d.h Tutorials lesen und rumpröbeln.
Nimm dir nicht zu viel vor wenn du erst gerade angefangen hast.

Hier mal ein pseudo code
Code: [AUSKLAPPEN]
Global tank#=100
Global speed#=0

While Not KeyHit(1)
Cls

If KeyDown(57) And speed#<320
   speed#=speed#+1
Else
   If speed#>0
      speed#=speed#-1
   EndIf
EndIf


tspeed#=speed#/10000

tank#=tank#-tspeed#
Text 0,0,"Geschwindigkeit (erhöhen mit leertaste): "+speed#
Text 0,20,"Tankinhalt: "+tank#+"%"
Flip


Wend


Falls dus nicht verstehst, frage ruhig.
mfg ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

CO2

ehemals "SirMO"

BeitragFr, März 12, 2010 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
ok danke
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

TimBo

BeitragSo, März 14, 2010 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
dein Problem kann man auch ganz gut mit [[Millisecs()]] lösen.

Du speicherst einmal die Anfangszeit des Programmes und dann nimmst du die aktuelle Zeit.
Die Differenz ist die Zeit, die das Programm schon läuft.

100-Zeit wäre dann die Ausgabe.

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group