repead schleife im hintergrund ??
Übersicht

PCfreakBetreff: repead schleife im hintergrund ?? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo ich habe mich mal an einem programm für jemanden versucht und habe folgendes problem:
ich möchte in einer repeatschleife eine repeatschleife erstellen, wobei die 2. repeatschleife im hintergrund läuft, damit die 1. repeatschleife sich immerweider wiederholen kann. hier mal der Code: Code: [AUSKLAPPEN] Print ""
Color 255, 000, 000 Print " TIPP: Du kannst das Spiel jederzeit mit" Print " Der Taste -Esc- beenden !" Color 255, 255, 255 Print "" Print "" Print " Hallo und Willkommen im Spiel -Keyhunter-" Print "" Print " Wenn du die Anleitung lesen willst, gebe A ein!" Print " Wenn du das Spiel beenden möchtest, gebe E ein!" Print " Wenn du das Spiel starten möchtest, gebe S ein!" Print "" startwahl$ = Input (" Wählen sie: ") Select startwahl$ Case "A" Cls Locate 0,0 Print "" Print " Du steuerst das Blaue Viereck mit den" Print " Pfeiltasten Print "" Print "" Print " Pass auf Rote gegenstände auf, diese" Print " darfst du NICHT berühren!" Print "" Print "" Print " Dei Ziel ist es, mit dem Blauen" Print " Viereck das Gelbe feld zu erreichen." Print "" Print "" Print " Zum Starten des Spiels eine beliebige" Print " Taste drücken ! WaitKey Case "E" End Case "S" End Select Function endinsek () Locate 100,100 Print "Leider Verloren! Programm beendet sich in:" Delay (1000) Locate 100,110 Print "5," Delay (1000) Locate 100,110 Print " 4," Delay (1000) Locate 100,110 Print " 3," Delay (1000) Locate 100,110 Print " 2," Delay (1000) Locate 100,110 Print " 1," Delay (1000) Locate 100,110 Print " 0" End End Function Graphics 1024,768,0,1 SetBuffer BackBuffer() viereck = LoadImage("C:\--- ecke.bmp") hindernis1 = LoadImage("C:\--- Hindernis1.bmp") hindernis3 = LoadImage("C:\--- dashindernis.bmp") ziel = LoadImage("C:\--- finish.bmp") verloren = LoadImage("C:\--- looser.bmp") xk = 50 yk = 100 Repeat Cls MaskImage viereck, 255, 255, 255 MaskImage hindernis1, 255, 255, 255 MaskImage ziel, 255, 255, 255 DrawImage viereck,xk,yk DrawImage ziel,400,400 Repeat x2=150 y2=260 x2=x2+1 DrawImage hindernis1,150,260 Until d=300 If KeyDown(203) Then xk=xk-2 If KeyDown(205) Then xk=xk+2 If KeyDown(208) Then yk=yk+2 If KeyDown(200) Then yk=yk-2 If ImagesCollide(viereck, xk, yk, ramen, hindernis1, 150, 260, ramen) Then endinsek End If If KeyDown(1) Then End End If Flip Until ImagesCollide(viereck,xk, yk, ramen, ziel, 400, 400, ramen) Ich möchte sozusagen ein objekt bewegen lassen (das hindernis) aber wenn es sich bewegt, kann ich das viereck nicht mehr steuern, da die 2. repeatschleife läuft ! hat jemand eine lösung für mich ? Mit freundlichen Grüßen, PCfreak |
||
Kentnisse: QB, BB, HTML, |
- Zuletzt bearbeitet von PCfreak am Fr, Jun 11, 2010 15:38, insgesamt einmal bearbeitet
![]() |
Starwar |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo und Willkommen.
Um dir zu helfen musst du uns vorher helfen ![]() Benutzte Codeboxen [ code]unmd [ /code] ohne Leerzeichen und rücke deinen Code ein. Wozu ist die 2. Repeatschleife? Denkst du man könnte diese Parallel ausführen? Wenn ja muss ich dich entrtäuschen: Das Programm läuft rein linear. Am besten beschäftigst du dich näher mit Robs Tutorial und Midimasters Ablauf-Tut MFG EDIT: Delay ist böse, das hält das gesamte Programm an und belastet den Prozessor zu 100%. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
hier hilft dir Kapitel III aus meinem Ablauf-Tutorial:
https://www.blitzforum.de/foru...hp?t=33584 und vielleicht Kapitel III aus mein Timer-Tutorial: https://www.blitzforum.de/foru...hp?t=34436 dort wird dir erklärt, wie Dinge scheinbar parallell laufen können. Das Hindernis wird also nicht in einer eigenen Repeat/Until-Schleife behandelt, sondern läuft in der Hauptschleife mit. Ist ein bestimmter Zustand erreicht wird es einfach zurückgesetzt. BlitzBasic: [AUSKLAPPEN] Repeat läuft es dir zu schnell oder zu langsam kannst du statt D=D+1 auch .... D=D+5 ..oder D#=D#+0.2 ...schreiben. Oder eben mit Timern arbeiten. Experimentiere aber zunächst mit dieser einfachen Lösung herum. Du hast außerdem zwei Logikfehler in deiner Hindernis-Bewegung. Soll das Hindernis sich bewegen, muss die Koordinate X2 auch im Draw-Befehl auftauchen. Zweites Problem die Abbruchbedingung richtet sich bei dir nach der Variablen D. Die wird aber in der inneren Repeat-Schleife gar nicht verändert, also wird 300 nie erreicht. Beide Probleme zusammengefasst ergibt sich, dass du das Hindernis mit D bewegen solltest und dieses D auch um 1 erhöht wird und mit diesem D auch die Abbruchbedingung überprüft wird. |
||
- Zuletzt bearbeitet von Midimaster am Fr, Jun 11, 2010 15:41, insgesamt 2-mal bearbeitet
PCfreak |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Starwar hat Folgendes geschrieben: EDIT: Delay ist böse, das hält das gesamte Programm an und belastet den Prozessor zu 100%. aber wie lasse ich die narichten denn dann im sekundentackt nacheinander ablaufen ? @midimaster danke =) mal ausprobieren |
||
Kentnisse: QB, BB, HTML, |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Starwar
DELAY ist nicht böse! Es belastet den Prozessor nicht! Im Gegenteil: Es gibt Performance zurück ans System. Beweis: BlitzBasic: [AUSKLAPPEN] Repeat braucht (allerdings unter B3D) unter 5% Performance. Beweise mir bitte das Gegenteil mit deinem Windows Task-Manager! Ich bin mal gespannt, wann sich dieser Hoax mal endgültig in Luft auflöst. Es ist eher im Gegenteil so, dass dies: BlitzBasic: [AUSKLAPPEN] Repeat ...fast schon den kompletten Rechner lahmlegt! [EDIT] hier hat Starwar recht: PCFreak macht es hier nicht richtig. Delay sollte nur im msec-Bereich eingesetzt werden: In der Testphase der Programme bleibt der Rechner bedienbar und er kann wenigsten das Programm killen, wenn es sich aufhängt. |
||
- Zuletzt bearbeitet von Midimaster am Fr, Jun 11, 2010 16:06, insgesamt einmal bearbeitet
PCfreak |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ach eine frage habe ich noch, äh eher 2:
1. wie mache ich dann aus dem skript eine FREILAUFENDE exe datei? 2. wie lasse ich dann das hindernis wieder zurücklaufen wieder vor wieder zurück also hin und her ? hier ist es so heiß also bei mir zu haus dass ich einen denkfehler habe ![]() EDIT ::::: ein problem ist aufgetreten: wenn der "block" sich bewegt und er momentan nicht an der stelle ist, wo ich mit dem viereck langehen möchte, und ich da langgehe, dass in der nähe des blocks es auch als "verloren" gilt, wieso das ? |
||
Kentnisse: QB, BB, HTML, |
- Zuletzt bearbeitet von PCfreak am Fr, Jun 11, 2010 15:55, insgesamt einmal bearbeitet
![]() |
Starwar |
![]() Antworten mit Zitat ![]() |
---|---|---|
[OFFTOPIC
@Mindimaster: Stimmt, in den neuen Versionen lastet Delay nicht zu 100% aus. Trotzdem legt Delay das PRogramm lahm. Es antwortet selbst Windows nicht mehr. Und dafür sind 5*1000ms Pause, die nur kurz unterbrochen wird viel zu viel. [/OFFTOPIC] 1. Vollversion kaufen. Program - Create Executeable. Dabei auf relative Pfadangaben zu Dateien achten. (Mehr dazu in der Forensuche rechts) 2. guck ich mir später an. MFG Noch ein Edit: Statt Delay lieber einen CreateTimer(60), Waittimer und ein Flip 0 |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Nachrichten im Sekundentakt sind nun zu 100% Timer-Tutorial:
Sie werden ebenfalls in einer Repeat/Until-Schleife gesteuert: BlitzBasic: [AUSKLAPPEN] Zeit%=MilliSecs() Mit etwas Geschick könntest Du sogar die Menü-Abfrage da auch reinintegrieren. Und ganz gute Programmieren kriegen sogar Texte, Menüs und das spätere Spiel alles in die eine gleiche Repeat/Until-Schleife. Du kannst aber zunächst mit 3 Repeat/Until-Schleifen nacheinander arbeiten: BlitzBasic: [AUSKLAPPEN] ; 1.Schleife: Vortexte Eine Richtungsteuerung kriegst du mit einer neuen Variablen Richtung% hin: BlitzBasic: [AUSKLAPPEN] D=D+Richtung . Sie ist BlitzBasic: [AUSKLAPPEN] Richtung=+1
solange es nach rechts gehen soll, und... BlitzBasic: [AUSKLAPPEN] Richtung=-1
wenn es nach links gehen soll. Nun lies mal ruhig die Tutorials, sie werden dir guttun! |
||
PCfreak |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich stehe total auf dem schlach hier mal mein code für das 3. level (alle anderen levels klappen):
Code: [AUSKLAPPEN] Repeat
Cls DrawImage viereck,xk,yk DrawImage hindernis4,hx,hy DrawImage ziel,400,400 If KeyDown(203) Then xk=xk-2 If KeyDown(205) Then xk=xk+2 If KeyDown(208) Then yk=yk+2 If KeyDown(200) Then yk=yk-2 If ImagesCollide(viereck, xk, yk, ramen, hindernis4, 150, 190, ramen) Then endinsek End If If KeyDown(1) Then End End If Flip Until KeyDown(1) so ich möchte jetzt das "hindernis4" bewegen .... bitte sage mir den code dann kann ich alles andere daraus entnehmen was ich dann brauche =) EDIT:::: HA ich habs: ich lasse es n icht hin und her, sondern durch den bildschirm laufen also wenn der block aus dem bildschirm rauzs ist, setze ich ihn links etwas vor dem bildschirm wieder ein genial was ? ![]() ![]() EDIT 2: wie mache ich das andere fenster also nicht das grafikfenster größer ? |
||
Kentnisse: QB, BB, HTML, |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
vergiss das zweite fenster und mach alles in dem Grafikfenster
statt print "Hallo" Text 100,100,"Hallo" |
||
PCfreak |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah vielen dank =)
ein paar fragen habe ich noch (tut mir leid :-/) : 1. Immer wenn ich das spiel dann starte und spiele, hängt es leicht also in regelmäßigen Abständen so alle 10 Sekunden kann ich was dagegen tun ? 2. das mit dem hin und her eines objektes habe ich noch nicht verstanden 3. ich möchte es so machen, dass wenn die spielfigur ein objekt erreicht, z.b. sich eine wand bewegt. das bekomme ich zwar hin, aber immer wen die spielfigur das objekt verlässt also nicht mehr berührt hört die bewegung auf weil die bedingung ja nicht mehr erfüllt ist. wie kann ich eine bewegung dauerhaft schalten, obwohl das objekt nur kurz berührt WURDE? gibt es da so einen befehl wie BlitzBasic: [AUSKLAPPEN] was ImagesCollide(viereck,xk, yk, ramen, ziel, xh, xh, ramen) Then ....... ? |
||
Kentnisse: QB, BB, HTML, |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
10 Sekunden Hänger
Um zu dem Hänger was zu sagen, müßte man den aktuellen code sehen.... Aktion weiterlaufen Um eine Aktion weiterlaufen zu lassen, nachdem sie einmal ausgelöt wurde, verwendest Du sogenannte Flags. Das sind ganz normale Variablen, die 0 sind, solange der Auslöser noch nicht stattgefunden hat, und die 1 werden, sobald die Kollision erfolgt ist. Die Bewegung der Wand wird also nicht mehr von der Kollision, sondern von dem Falg abhängig gemacht. Jetzt kann die Kollision getrost aufhören, das Flag wird ja 1 bleiben und daher die Bewegung nicht mehr aufhören: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Hin und her Dazu musst du die Variable X am Ende eben wieder kleiner werden lassen. Auch dazu dient ein Flag! Das Flag hat zunächst den Wert 1 und das wird zu X dazugezählt. Erreicht nun X den linken Rand, dann wird das Flag zu -1 und ab sofort wird was von X abgezogen: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 |
||
PCfreak |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oa viele vielen dank =)
ich habe schon mal mit so einer art gearbeitet (damals mein 1. prog mit Qbasic) aber hatte nie gewust das man das flag nennt =) danke und entschuldige für die störung =) Mit freundlichen Grüßen, PCfreak EDIT:: achja der code ähm hier villeicht kannst du das problem finden: BlitzBasic: [AUSKLAPPEN] Function endinsek () EDIT 2 :: Hier mal der ganze script zum downloaden ABER: bildercodes müssen nachgetragen also wenn du das alles in einem ordner speicherst, musst du auch im script den bilderpfad nachtragen: http://www.mydownloads.wg.vu/e.../Spiel.rar |
||
Kentnisse: QB, BB, HTML, |
PCfreak |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wie mache ich im grafikfenster eine eingabe, die locatet also wie text 1,1, "blah" ist ? | ||
Kentnisse: QB, BB, HTML, |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit einer eigenen Inputroutine. Das ist im Prinzip nicht schwer. Wenn es Dich zum jetzigen Zeitpunkt noch überfordert (ist keine Schande) kannst Du im Codearchiv auch fertige finden. Zum selberbasteln brauchst Du:
getkey ![]() chr ![]() und je nachdem wie weit Du sie ausbauen willst noch diverse Stringfunktionen, siehe https://www.blitzforum.de/help/?subcat=21 |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Texteingabe
auch hierzu findest Du in Kapitel IV meines Timer-Tutorial eine fertige Lösung. https://www.blitzforum.de/foru...555#364555 Dort gibt es einen Abschnitt "Ein Texteingabe-Feld, während das Spiel weiterläuft ", der genau die von dir gesuchte Lösung ist. Die String-Eingabe INPUT wird dabei durch die Zeichenengabe GETKEY() ersetzt. GETKEY() erwartet immer nur ein Zeichen vom User. Daraus setzt du dann den eigentlichen String zusammen und bringst ihn Stück für Stück mittels TEXT auf den Bildschirm. logischer Ablauf (Pseudocode): Code: [AUSKLAPPEN] Repeat
Zeichen=GETKEY() Wort=Wort+ Zeichen Text Wort Until Zeichen=RETURN Das Ende der Eingabe ist gekommen, wenn der Spieler die RETURN-Taste gedrückt hat. In dem oben genannten Beispiel wird das Ganze so in eine Funktion gepackt, dass du es später in jedes beliebige Programm einbauen kannst. Die ganze Funktion ist für einen Anfänger nicht so superleicht zu verstehen, weil da doch noch einige Spezialdinge wie z.B. ein blinkender Cursor oder eine Möglichkeit der Fehlerkorrektur enthalten sind, aber lehrreich ist es allemal. Dein Code deinen Code kannst du stark verkürzen, wenn du das Tutorial "Programm-Ablauf" einmal durchlesen würdest. Dort wird dir erklärt, wie man mehrere Level nicht immer wieder neu schreiben muss. https://www.blitzforum.de/foru...716#355716 Ich rate dir dringend, den Code dahingehend umzubauen, sonst blickst du nach einiger Zeit nicht mehr durch. Die Lösung immer wiederkehrender sehr ähnlicher Code-Teile sind "Funktionen". Mit Ihrer Hilfe beschreibst du den Teil des Programms, der immer wiederkehrt. Und durch Verändern von Variablen steuerst du dann, dass in der Funktion nicht immer das gleiche passiert. Ich geh das mal anhand deines Codes mit dir durch: Kern deiner Level sind diese Zeilen: BlitzBasic: [AUSKLAPPEN] Repeat Schritt 1 Die schreibst Du in eine Funktion am Ende deines Codes und dort wo der ganze Code stand schreibst du nur noch den Aufruf dieser Funktion. Wir nennen die Fuktion mal Spielrunde(): BlitzBasic: [AUSKLAPPEN] .... Schritt 2 Nun kommt vor den Funktionsaufruf ein Bereich, wo man abhängig vom Level bestimmte Werte setzen kann: BlitzBasic: [AUSKLAPPEN] .... Dort werden wir später sie Unterschiede der Levels eintragen. Schritt 3 Nun vergleichst Du, welche Zeilen eigentlich in Level 2 anders sind. Ich sehe da z.b.: BlitzBasic: [AUSKLAPPEN] DrawImage ziel,440,100 Daher wird jetzt in der Funktion die X-Koordinate des Ziels nicht mehr als Wert sondern als Variable geschrieben... BlitzBasic: [AUSKLAPPEN] DrawImage ziel,ZielX,100(Da die 440 auch bei dem Until auftaucht, änderst du sie auch dort auf ZielX um.) ...und ihr Wert wird vorher gesetzt: BlitzBasic: [AUSKLAPPEN]
Auch die Hindernisse sind andere. Also kommt auch hier in den Vor-Block: BlitzBasic: [AUSKLAPPEN]
und in der Funktion änderst du: BlitzBasic: [AUSKLAPPEN]
Im 3.Level hattest du, wie ich sehe, so etwas auch schon angedacht! Dort hast du dem Hindernis keine festen Koordinaten mehr gegeben, sondern sie hX und hY genannt. Gut gemacht! Jetzt musst du es nur auch im Level 1 und 2 so anwenden: BlitzBasic: [AUSKLAPPEN] .... So arbeitest Du jetzt den gesamten Code aller Levels auf Unterschiede durch und schreibst die besser in den Vor-Block. Ganz wichtig! Da die Variablen jetzt im Hauptprogramm und in der Funktion zur Verfügung stehen sollen, müssen sie alle GLOBAL definiert werden. also kommen ganz an den Anfang deines Codes diese Zeilen: BlitzBasic: [AUSKLAPPEN] Global ZielX%, hX%, hY%, locHindernis% und darunter auch noch alle anderen Variablen, die Du in der Funktion verwendest. |
||
PCfreak |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke =) das mit dem 3. level, wo ich diese hx, hy koordinaten gesetzt habe, das war eig. dazu gedacht das objekt zu bewegen. da ich es vergessen habe umzuändern habe ich ja schon einen vorteil geschaffen =)
ich bedanke mich für diese hilfe und werde das forum weiterempfehlen ![]() Mit freundlichen Grüßen, PCfreak |
||
Kentnisse: QB, BB, HTML, |
PCfreak |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi entschuldigt dass ich ein letztes mal störe aber ich habe mich gefragt, kann ich kommazahlen zu ganzten zahlen wandeln ?
ich habe folgenden code: BlitzBasic: [AUSKLAPPEN] Repeat diese Kommazahl die raus kommt, mlchte ich auf eine ganze zahl kürzen; wie ? |
||
Kentnisse: QB, BB, HTML, |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] Repeat Siehe auch: Floor ![]() ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group