Stocken des Programmes bei Schleifen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Luciano

Betreff: Stocken des Programmes bei Schleifen

BeitragSa, Apr 16, 2005 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 16, 2005 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

diGGa

GruppenKaspar

BeitragSa, Apr 16, 2005 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 17, 2005 11:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 17, 2005 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Luciano hat Folgendes geschrieben:
...hier ein verkürtztes Beispiel:


Laughing

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

BeitragSo, Apr 17, 2005 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Code-Tag benutzen ... das liest sich ja schrecklich.
 

Luciano

BeitragSo, Apr 17, 2005 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

diGGa

GruppenKaspar

BeitragSo, Apr 17, 2005 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 17, 2005 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ü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!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group