Stocken des Programmes bei Schleifen
Übersicht

LucianoBetreff: Stocken des Programmes bei Schleifen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!!!
Also Ich habe ein Problem bei meinem Spiel: Wenn der Spieler 1 z.B. die rechte Pfeiltaste drückt, so wird seine Höhenvariable erhöht und er wird neu gezeichnet. Wenn sich aber Spieler 2 gleichzeitig beamt und mit einem animierten "In Luft auflösen" verschwindet, so bleibt Spieler 1 so lange einfach regungslos, bis der Spieler 2 undsichtbar und die repeat schleife beendet ist (diejenige beim Beamenaufruf) Was mache ich falsch, wie läuft das programm weiter, ich benutze auch nicht delay, sondern Millisecs... Danke für diee Hilfe Der Gesamte Code: AppTitle "Ars" Graphics 1300,800 SetBuffer BackBuffer() ;Variblen Lebens1 = 500 Lebens2 = 500 W1 = 100 W2 = 1100 S1 = 725 S2 = 725 GeschwindigkeitS1 = 8 ;Bilder laden Hinter = LoadImage("Grafiken\Hintergrund.jpg") Sp1 = LoadImage("Grafiken\Spieler1.bmp") Sp2 = LoadImage("Grafiken\Spieler2.bmp") RechteFaustSp2 = LoadAnimImage("Grafiken\RechteFaust.bmp", 50,37, 0,7) RechteFaustSp1 = LoadAnimImage("Grafiken\RechteFaust.bmp", 50,37, 0,7) LinkeFaustSp2 = LoadAnimImage("Grafiken\LinkeFaust.bmp", 50,37, 0,7) LinkeFaustSp1 = LoadAnimImage("Grafiken\LinkeFaust.bmp", 50,37, 0,7) Welle = LoadAnimImage("Grafiken\Welle.bmp", 93,150, 0,11) ;Transparenz MaskImage Sp1, 0,0,0 MaskImage Sp2, 0,0,0 MaskImage RechteFaustSp2, 0,0,0 MaskImage RechteFaustSp1, 0,0,0 MaskImage LinkeFaustSp2, 0,0,0 MaskImage LinkeFaustSp1, 0,0,0 MaskImage Welle, 0,0,0 ;Programmstart Repeat Cls Gosub Zeichnen ;Bewegungen Spieler1 If KeyDown(205) Then ;Rechts RichtungSp1$ = "R" If ZeitS1 + 20 < MilliSecs() Then W1 = W1 + GeschwindigkeitS1 ZeitS1 = MilliSecs() EndIf EndIf If KeyDown(203) Then ;Links RichtungSp1$ = "L" If ZeitS1 + 20 < MilliSecs() Then W1 = W1 - GeschwindigkeitS1 ZeitS1 = MilliSecs() End If EndIf If KeyDown(208) Then ;Oben If ZeitS1 + 20 < MilliSecs() Then S1 = S1 + GeschwindigkeitS1 ZeitS1 = MilliSecs() End If EndIf If KeyDown(200) Then ;Unten If ZeitS1 + 20 < MilliSecs() Then S1 = S1 - GeschwindigkeitS1 ZeitS1 = MilliSecs() End If End If ;Bewegungen Spieler2 If KeyDown(33) Then ;Rechts RichtungSp2$ = "R" If ZeitS2 + 20 < MilliSecs() Then W2 = W2 + 8 ZeitS2 = MilliSecs() End If EndIf If KeyDown(31) Then ;Links RichtungSp2$ = "L" If ZeitS2 + 20 < MilliSecs() Then W2 = W2 - 8 ZeitS2 = MilliSecs() End If EndIf If KeyDown(32) Then ;Oben If ZeitS2 + 20 < MilliSecs() Then S2 = S2 + 8 ZeitS2 = MilliSecs() End If EndIf If KeyDown(18) Then ;Unten If ZeitS2 + 20 < MilliSecs() Then S2 = S2 - 8 ZeitS2 = MilliSecs() End If EndIf ;Schlag Spieler2 If KeyHit(30) Then Select RichtungSp2$ Case "R" Repeat ;Rechts If FausttimerSp2 + 25 < MilliSecs() Then FaustframeSp2 = FaustframeSp2 + 1 DrawImage RechteFaustSp2, W2 + 20,S2, FaustframeSp2 Flip Cls Gosub Zeichnen FausttimerSp2 = MilliSecs() End If Until FaustframeSp2 > 5 FaustframeSp2 = 0 Case "L" Repeat ;Links If FausttimerSp2 + 25 < MilliSecs() Then FaustframeSp2 = FaustframeSp2 + 1 DrawImage LinkeFaustSp2, W2 - 27,S2, FaustframeSp2 Flip Cls Gosub Zeichnen FausttimerSp2 = MilliSecs() EndIf Until FaustframeSp2 > 5 FaustframeSp2 = 0 End Select EndIf ;Schlag Spieler1 If KeyHit(157) Then Select RichtungSp1$ Case "R" Repeat ;Rechts If FausttimerSp1 + 25 < MilliSecs() Then FaustframeSp1 = FaustframeSp1 + 1 DrawImage RechteFaustSp1, W1 + 20,S1, FaustframeSp1 Flip Cls Gosub Zeichnen FausttimerSp1 = MilliSecs() End If Until FaustframeSp1 > 5 FaustframeSp1 = 0 Case "L" Repeat ;Links If FausttimerSp1 + 25 < MilliSecs() Then FaustframeSp1 = FaustframeSp1 + 1 DrawImage LinkeFaustSp1, W1 - 27,S1, FaustframeSp1 Flip Cls Gosub Zeichnen FausttimerSp1 = MilliSecs() EndIf Until FaustframeSp1 > 5 FaustframeSp1 = 0 End Select EndIf ;Beamen Spieler2 If KeyDown(16) = 1 And Beamenframe = 0 Then Gosub Beamenausloeser End If If KeyDown(16) = 0 And Beamenframe > 0 Then Gosub Beamenabloeser EndIf ;Welle Spieler2 If KeyDown(17) Then Repeat If Wellenzaehlstart + 100 < MilliSecs() Then DrawImage Welle, W2+Wellenabstand,S2-53, Wellenframe Wellenframe = Wellenframe + 1 Flip Wellenzaehlstart = MilliSecs() Wellenabstand = Wellenabstand + 75 EndIf Until Wellenframe = 10 Wellenframe = 0 Wellenabstand = 0 EndIf ;Rennen Spieler 1 If KeyHit(200) Then GeschwindigkeitS1 = 8 If MilliSecs() - Rennenzeit1 <= 300 Then GeschwindigkeitS1 = 15 End If Rennenzeit1 = MilliSecs() EndIf If KeyHit(203) Then GeschwindigkeitS1 = 8 If MilliSecs() - Rennenzeit2 <= 300 Then GeschwindigkeitS1 = 15 End If Rennenzeit2 = MilliSecs() EndIf If KeyHit(208) Then GeschwindigkeitS1 = 8 If MilliSecs() - Rennenzeit3 <= 300 Then GeschwindigkeitS1 = 15 End If Rennenzeit3 = MilliSecs() EndIf If KeyHit(205) Then GeschwindigkeitS1 = 8 If MilliSecs() - Rennenzeit4 <= 300 Then GeschwindigkeitS1 = 15 End If Rennenzeit4 = MilliSecs() EndIf ;Flippen Flip ;Programmende Until KeyHit(1) End .Zeichnen ;Bilder zeichnen DrawImage Hinter, 0,0 DrawImage Sp1, W1,S1 If Beamenframe = 0 Then DrawImage Sp2, W2,S2 EndIf ;Texte im Spieldschirm Color 0,0,0 Text 20,20, "Spieler1:" Text 920,20, "Spieler2:" Text 20,40, "Lebensenergie:" Text 920,40, "Lebensenergie:" Text 20,60, "Manaenerige:" Text 920,60, "Manaenergie:" Text 1100,780, "Esc zum Beenden drücken" ;Sonstige Grafiken Color 255,0,0 Line 150,45, 350,45 Line 1050,45, 1250,45 Color 0,0,255 Line 150,65, 350,65 Line 1050,65, 1250,65 Return .Beamenausloeser Sp2 = LoadAnimImage("Grafiken\Beamen.bmp", 40,40, 0,7) Repeat If Beamenzaehlstart + 50 < MilliSecs() Then Beamenframe = Beamenframe + 1 Flip Cls Gosub Beamen Beamenzaehlstart = MilliSecs() End If Until Beamenframe = 6 Return .Beamenabloeser Beamenframe = 0 Sp2 = LoadAnimImage("Grafiken\Beamenzurück.bmp", 40,40, 0,7) Repeat If Beamenzaehlstart + 50 < MilliSecs() Then Beamenframe = Beamenframe + 1 Flip Cls Gosub Beamen Beamenzaehlstart = MilliSecs() End If Until Beamenframe = 6 Sp2 = LoadImage("Grafiken\Spieler2.bmp") Beamenframe = 0 Return .Beamen ;Bilder zeichnen DrawImage Hinter, 0,0 DrawImage Sp1, W1,S1 DrawImage Sp2, W2,S2, Beamenframe ;Texte im Spieldschirm Color 0,0,0 Text 20,20, "Spieler1:" Text 920,20, "Spieler2:" Text 20,40, "Lebensenergie:" Text 920,40, "Lebensenergie:" Text 20,60, "Manaenerige:" Text 920,60, "Manaenergie:" Text 1100,780, "Esc zum Beenden drücken" ;Sonstige Grafiken Color 255,0,0 Line 150,45, 350,45 Line 1050,45, 1250,45 Color 0,0,255 Line 150,65, 350,65 Line 1050,65, 1250,65 Return |
||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mal davon ab, das wir es ja nicht ausprobieren könnne (nur über umwege) weil wir die Grafiken nicht haben - findest du nicht auch, dass das ein bisschen übertrieben ist? Sich in einen derart langen code reinzuversetzten ist sehr schwer. Kannst du nicht die Stelle posten, in der du den Fehler vermutest? | ||
![]() |
diGGaGruppenKaspar |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab da mehrere schleifen ineinander gesehen... da wird der fehler liegn. nur eine einzige hauptschleife machen und darin alles abwickeln | ||
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und glaubte im Licht der Straßenlampe Den Geist unseres jahrhunderts auf der Straße zu sehen Der uns sagte, daß wir alle am Rande des Abgrunds stehen. - Al Steward Athlon 64 3000+ / Radeon 9600 / 1024mb ddram |
Luciano |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, ich habe wohl wirklich ein bisschen übertrieben, tut mir leid, ich habe hier ein verkürtztes Beispiel:
Mein Problem ist, dass wenn Spieler2 sich gerade nach Bewegt, egal in welche Richtung und Spieler 1 sich dann wegbeamt, so bleibt Spieler 2 in der Zeit, wo die animierten Bilder für das Beamen ablaufen, einfach stehen und bewegt sich erst nachher wieder, wie kann ich das verhindern? ____________________________________________________________ Graphics 1300,800 SetBuffer BackBuffer() ____________________________________________________________ ;Programmstart Repeat Cls Gosub Zeichnen (ein Unterprogramm, das alle Bilder mit den aktuellen Koordinaten zeichnet...) ____________________________________________________________ ;Bewegungen Spieler2 (Hier werden die Koordinaten von Spieler2 verändert und später beim Unterprogramm "Zeichnen" auf den Bildschirm gebracht) If KeyDown(33) Then (W2/S2 = Waagrechte/Senkrechte Koordinate) If ZeitS2 + 20 < MilliSecs() Then W2 = W2 + 8 ZeitS2 = MilliSecs() End If EndIf If KeyDown(31) Then ;Links If ZeitS2 + 20 < MilliSecs() Then W2 = W2 - 8 ZeitS2 = MilliSecs() End If EndIf If KeyDown(32) Then ;Oben If ZeitS2 + 20 < MilliSecs() Then S2 = S2 + 8 ZeitS2 = MilliSecs() End If EndIf If KeyDown(18) Then ;Unten If ZeitS2 + 20 < MilliSecs() Then S2 = S2 - 8 ZeitS2 = MilliSecs() End If EndIf _____________________________________________________________ ;Beamen (Hier frage ich ab, ob Spieler 1 die Taste Q gedrückt hat und somit unsichtbar wird und bleibt, bis er sie loslässt...) If KeyDown(16) = 1 And Beamenframe = 0 Then Gosub Beamenausloeser End If If KeyDown(16) = 0 And Beamenframe > 0 Then Gosub Beamenabloeser EndIf _____________________________________________________________ ;Flippen Flip ;Programmende Until KeyHit(1) End _____________________________________________________________ ;Unterprogramme .Zeichnen ;Bilder zeichnen DrawImage Sp2, W2,S2 If Beamenframe = 0 Then DrawImage Sp1, W1,S1 EndIf Return _____________________________________________________________ .Beamenausloeser Sp2 = LoadAnimImage("Grafiken\Beamen.bmp", 40,40, 0,7) Repeat If Beamenzaehlstart + 50 < MilliSecs() Then Beamenframe = Beamenframe + 1 Flip Cls Gosub Beamen Beamenzaehlstart = MilliSecs() End If Until Beamenframe = 6 Return .Beamenabloeser Beamenframe = 0 Sp2 = LoadAnimImage("Grafiken\Beamenzurück.bmp", 40,40, 0,7) Repeat If Beamenzaehlstart + 50 < MilliSecs() Then Beamenframe = Beamenframe + 1 Flip Cls Gosub Beamen Beamenzaehlstart = MilliSecs() End If Until Beamenframe = 6 Sp2 = LoadImage("Grafiken\Spieler2.bmp") Beamenframe = 0 Return _____________________________________________________________ .Beamen ;Bilder zeichnen DrawImage Sp2, W2,S2 DrawImage Sp1, W1,S1, Beamenframe Return |
||
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Luciano hat Folgendes geschrieben: ...hier ein verkürtztes Beispiel:
![]() Du darfst nicht verschiedene Schleifen abwechselnd durchlaufen lassen, du musst alles in eine Schleife packen. Ansonsten hält dein Hauptprogramm an, die Animation wird abgespielt und erst dann läuft dein Hauptprogramm weiter. Und was mir noch gerade beim "Drüberscrollen" aufgefallen ist: Lade deine Bilder EINMAL vor der Hauptschleife, nicht jedes mal, wenn die Animation abgespielt wird... |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
gamble |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code-Tag benutzen ... das liest sich ja schrecklich. | ||
Luciano |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie ist das genau gemeint, alles in eine Schleife packen. Wie kann ich dann die Animation abspielen, also zum Beispiel beim Beamen? Wie könnte man das Programm verändern? | ||
![]() |
diGGaGruppenKaspar |
![]() Antworten mit Zitat ![]() |
---|---|---|
repeat
drawimage img,x,y,frame frame + 1 if frame = lastframe then frame = 1 until is pseudo |
||
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und glaubte im Licht der Straßenlampe Den Geist unseres jahrhunderts auf der Straße zu sehen Der uns sagte, daß wir alle am Rande des Abgrunds stehen. - Al Steward Athlon 64 3000+ / Radeon 9600 / 1024mb ddram |
![]() |
stfighter01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
überleg dir genau wie der computer arbeitet
immer einen befehl nach dem anderen. versuch dein programm im geist durchzulaufen, dann solltest du selbst auf den fehler kommen. hilf dir mit zählvariablen um zu unterscheiden wer was wann macht. mfg stfighter |
||
Denken hilft! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group