Dauernde Bewegung
Hm ... vonTurnundTaxis hat doch eigentlich genau geschrieben, wo was hin kommt ... Poste am besten noch mal deinen jetztigen Code mit abc = 1 ... und zur Hilfe ...
vor dem Code schreibst du [code] und hinter dem Code schreibst du [/code] in deinen Post rein ... danke
MFG PMV
vor dem Code schreibst du [code] und hinter dem Code schreibst du [/code] in deinen Post rein ... danke
MFG PMV
Zuletzt geändert von PMV am 03.01.2005 14:45, insgesamt 1-mal geändert.
Also momentaner Code lautet:
Code: Alles auswählen
If InitSprite()=0
EndIf
If InitKeyboard()=0
EndIf
If InitSprite3D()=0
EndIf
If InitMouse()=0
EndIf
If OpenScreen(640, 480, 16, "Mein Spiel")=0
EndIf
If LoadSprite(0, "Panzer1.bmp" ,0)=0
EndIf
If LoadSprite(1, "Panzer2.bmp" ,0)=0
EndIf
If LoadSprite(2, "Panzer1.bmp" ,0)=0
EndIf
If LoadSprite(3, "Panzer2.bmp" ,0)=0
EndIf
If LoadSprite(4, "Panzer3.bmp" ,0)=0
EndIf
If LoadSprite(4, "Explosion.bmp" ,0)=0
EndIf
TransparentSpriteColor(0, 255, 0, 128)
TransparentSpriteColor(1, 255, 0, 128)
TransparentSpriteColor(2, 255, 0, 128)
TransparentSpriteColor(3, 255, 0, 128)
TransparentSpriteColor(4, 255, 0, 128)
TransparentSpriteColor(5, 255, 0, 128)
Repeat
If abc = 1
IsScreenActive()
ClearScreen(0,0,0)
DisplayTransparentSprite(AniFrame, x, y)
FlipBuffers()
Delay(200)
AniFrame + 1
If AniFrame => 6 : AniFrame = 0 : EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
x-1
EndIf
If KeyboardPushed(#PB_Key_Right)
abc = 1
EndIf
If Keyboardleased(#PB_Key_Right)
abc = 0
EndIf
If KeyboardPushed(#PB_Key_F5)
x+13
EndIf
If KeyboardPushed(#PB_Key_F6)
x-3
EndIf
EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
So, ich hab es jetzt ein mal vor gemacht und mit kommentiert ...
Ich hoffe, daraus kannst du nen bischen selber lernen
Ich hab auch die Fehlerüberprüfung rein gemacht, gegen die du dich anscheinend so verbissen wehrst *gg*, aber mit ist einfach besser
Ach ja ... ich hab wegen faulheit einfach mal nco2ks Fehlerroution kopiert, die er im anderen Thread gepostet hatte, das dies so wie so die normale methode ist ... bevor sich wer beschwert
Ach ja ... nu zu deinen Fehlern:
hier überlädst du ja das vorheriege Animationssprite, ich glaub nicht, das das so gewollt ist
Zwar kein Fehler, aber es ist vorteilhafter, das in einer schleife zu machen, spart unteranderem Zeit, da nicht so viel zu tippen ist.
Da hier was mehr auf einmal ist, mach ich kommentare rein, welche dann unten erläutert werden.
1. Alles steht in einer IF-Abfrage, und da abc = 0 ist, kann so niemals die Zeile
erreicht werden, um abc auf 1 zu setzten. Zudem ist ExamineKeyboard() auch in dieser If-Abfrage, da dies nicht erreicht wird, kann die Tastatur nicht abgefragt werden und somit ist das ganze eine Unendlichschleife.
2. IsScreenActive() wird garnicht überprüft, da dieser befehl aber nur zur überprüfung da ist, ist er so überflüssig
3. Das Delay(200) hat ich dir ja so angeboten, für dich als Anfänger vermutlich das einfachste, aber Delay() ist selber nur zur Programmpause da, schau dir mal genauer an, wie ich das dir jetzt vorgemacht hab, so sollteste das immer machen. Delay(1) wird normal dann verwendet, um z.B. bei Anwendungen nicht die volle CPU Auslastung zu verschwenden.
4. Keyboardleased(#PB_Key_Right) existiert so nicht. Proceduren, die keiner haben kann, müssen immer mit gepostet werden, damit der Code lauffähig ist. Da ich jetzt aber mal vermute, das du von uns diese Befehl haben wolltest, seh ich mal drüber hinweg
. Oder meinst du vielleicht den PB-Befehl KeyboardReleased(#PB_Key_Right)? O_o
MFG PMV
Code: Alles auswählen
;definieren der Spielkonstanten
#Title = "Mein Spiel" ;Name des Spiels
;Screengröße und Farbtiefe
#Width = 640
#Height = 480
#Depth = 16
#TimeToNextFrame = 200 ;Zeit in ms bis zum nächsten Animationsframe
;initialisieren und öffnen des Screens
If InitSprite() = #False Or InitSprite3D() = #False
MessageRequester(#Title, "Could not initialize DirectX 7 or higher!", #MB_OK | #MB_ICONERROR)
End
ElseIf InitSound() = #False
MessageRequester(#Title, "Could not initialize DirectX compatible Sound Card!", #MB_OK | #MB_ICONERROR)
End
ElseIf InitKeyboard() = #False
MessageRequester(#Title, "Could not initialize Keyboard!", #MB_OK | #MB_ICONERROR)
End
ElseIf InitMouse() = #False
MessageRequester(#Title, "Could not initialize Mouse!", #MB_OK | #MB_ICONERROR)
End
ElseIf OpenScreen(#Width, #Height, #Depth, #Title) = #False
MessageRequester(#Title, "Could not open Screen at "+Str(#Width)+"x"+Str(#Height)+"x"+Str(#Depth)+"!", #MB_OK | #MB_ICONERROR)
End
EndIf
;laden der Sprites
If LoadSprite(0, "Panzer1.bmp" ,0)=0
MessageRequester(#Title, "Could not load sprite 'Panzer1.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(1, "Panzer2.bmp" ,0)=0
MessageRequester(#Title, "Could not load sprite 'Panzer2.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(2, "Panzer1.bmp" ,0)=0
MessageRequester(#Title, "Could not load sprite 'Panzer1.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(3, "Panzer2.bmp" ,0)=0
MessageRequester(#Title, "Could not load sprite 'Panzer2.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(4, "Panzer3.bmp" ,0)=0
MessageRequester(#Title, "Could not load sprite 'Panzer3.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(5, "Explosion.bmp" ,0)=0
MessageRequester(#Title, "Could not load sprite 'Explosion.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
;setzten der transparenten Farbe
For Num = 0 To 5
TransparentSpriteColor(Num, 255, 0, 128)
Next
;TransparentSpriteColor(0, 255, 0, 128)
;TransparentSpriteColor(1, 255, 0, 128)
;TransparentSpriteColor(2, 255, 0, 128)
;TransparentSpriteColor(3, 255, 0, 128)
;TransparentSpriteColor(4, 255, 0, 128)
;TransparentSpriteColor(5, 255, 0, 128)
;Hauptschleife
Repeat
;Tastatur überprüfen
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left) ;Pfeiltaste links, Panzer langsam nach links bewegen
X-1
EndIf
If KeyboardPushed(#PB_Key_Right) ;Peiltaste rechts, Panzer animieren
MakeAni = #True
Else ;Pfeiltaste nicht gedrückt, Panzer nicht animieren
MakeAni = #False
EndIf
If KeyboardPushed(#PB_Key_F5) ;Taste F5, Panzer ganz schnell nach rechts bewegen
X+13
EndIf
If KeyboardPushed(#PB_Key_F6) ;Taste F6, Panzer schnell nach links bewegen
X-3
EndIf
If IsScreenActive() ;wenn der Screen aktive ist
ClearScreen(0, 0, 0)
If MakeAni = #True ;wenn die Animation getätigt werden soll
;ist die Startzeit + die Animationszeit kleiner, als die aktuelle Zeit
If Timer + #TimeToNextFrame <= ElapsedMilliseconds()
AniFrame + 1 ;setzte Animationsframe auf die nächste Animationsstufe
Timer = ElapsedMilliseconds() ;setzte Startzeit auf die aktuelle Zeit
EndIf
;wenn Animationsframe höher ist, als die existierenden Animationsframes,
;setzte den aktuellen Animationsframe auf das 1 Frame der Animation
If AniFrame => 6 : AniFrame = 0 : EndIf
Else
;wenn es keine Animation zur Zeit gibt, dann halte die Startzeit = der aktuellen Zeit
Timer = ElapsedMilliseconds()
EndIf
DisplayTransparentSprite(AniFrame, X, Y)
FlipBuffers()
EndIf
Until KeyboardPushed(#PB_Key_Escape) Ich hab auch die Fehlerüberprüfung rein gemacht, gegen die du dich anscheinend so verbissen wehrst *gg*, aber mit ist einfach besser
Ach ja ... ich hab wegen faulheit einfach mal nco2ks Fehlerroution kopiert, die er im anderen Thread gepostet hatte, das dies so wie so die normale methode ist ... bevor sich wer beschwert
Ach ja ... nu zu deinen Fehlern:
Code: Alles auswählen
If LoadSprite(3, "Panzer2.bmp" ,0)=0
EndIf
If LoadSprite(4, "Panzer3.bmp" ,0)=0
EndIf
If LoadSprite(4, "Explosion.bmp" ,0)=0
EndIf Code: Alles auswählen
TransparentSpriteColor(0, 255, 0, 128)
TransparentSpriteColor(1, 255, 0, 128)
TransparentSpriteColor(2, 255, 0, 128)
TransparentSpriteColor(3, 255, 0, 128)
TransparentSpriteColor(4, 255, 0, 128)
TransparentSpriteColor(5, 255, 0, 128)Da hier was mehr auf einmal ist, mach ich kommentare rein, welche dann unten erläutert werden.
Code: Alles auswählen
Repeat
If abc = 1 ;Punkt 1.
IsScreenActive() ;Punkt 2.
ClearScreen(0,0,0)
DisplayTransparentSprite(AniFrame, x, y)
FlipBuffers()
Delay(200) ;Punkt 3.
AniFrame + 1
If AniFrame => 6 : AniFrame = 0 : EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
x-1
EndIf
If KeyboardPushed(#PB_Key_Right)
abc = 1
EndIf
If Keyboardleased(#PB_Key_Right) ;Punkt 4.
abc = 0
EndIf
If KeyboardPushed(#PB_Key_F5)
x+13
EndIf
If KeyboardPushed(#PB_Key_F6)
x-3
EndIf
EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
Code: Alles auswählen
If KeyboardPushed(#PB_Key_Right)
abc = 1
EndIf2. IsScreenActive() wird garnicht überprüft, da dieser befehl aber nur zur überprüfung da ist, ist er so überflüssig
3. Das Delay(200) hat ich dir ja so angeboten, für dich als Anfänger vermutlich das einfachste, aber Delay() ist selber nur zur Programmpause da, schau dir mal genauer an, wie ich das dir jetzt vorgemacht hab, so sollteste das immer machen. Delay(1) wird normal dann verwendet, um z.B. bei Anwendungen nicht die volle CPU Auslastung zu verschwenden.
4. Keyboardleased(#PB_Key_Right) existiert so nicht. Proceduren, die keiner haben kann, müssen immer mit gepostet werden, damit der Code lauffähig ist. Da ich jetzt aber mal vermute, das du von uns diese Befehl haben wolltest, seh ich mal drüber hinweg
MFG PMV
Also...danke für deine Mühe, aber irgendwie hab ich da Probleme mit. Ich musste einiges ändern, aber es kommen immernoch Fehler.
Code lautet:
Code lautet:
Code: Alles auswählen
If OpenScreen(640, 480, 16, "Mein Spiel")=0
EndIf
#TimeToNextFrame = 200
If InitSprite() = #False Or InitSprite3D() = #False
MessageRequester("Fehler", "Could Not initialize DirectX 7 Or higher!", #MB_OK |#MB_ICONERROR)
End
ElseIf InitSound() = #False
MessageRequester("Fehler", "Could Not initialize DirectX compatible Sound Card!", #MB_OK | #MB_ICONERROR)
End
ElseIf InitKeyboard() = #False
MessageRequester("Fehler", "Could Not initialize Keyboard!", #MB_OK | #MB_ICONERROR)
End
ElseIf InitMouse() = #False
MessageRequester("Fehler", "Could Not initialize Mouse!", #MB_OK | #MB_ICONERROR)
End
EndIf
If OpenScreen(640, 480, 16, "Mein Spiel") = #False
MessageRequester("Fehler", "Could Not open Screen at "+Str(640)+"x"+Str(480)+"x"+Str(16)+"!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(0, "Panzer1.bmp" ,0)=0
MessageRequester("Fehler", "Could Not load sprite 'Panzer1.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(1, "Panzer2.bmp" ,0)=0
MessageRequester("Fehler", "Could not load sprite 'Panzer2.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(2, "Panzer1.bmp" ,0)=0
MessageRequester("Fehler", "Could not load sprite 'Panzer1.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(3, "Panzer2.bmp" ,0)=0
MessageRequester("Fehler", "Could not load sprite 'Panzer1.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(4, "Panzer3.bmp" ,0)=0
MessageRequester("Fehler", "Could not load sprite 'Panzer3.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(4, "Explosion.bmp" ,0)=0
MessageRequester("Fehler", "Could not load sprite 'Explosion.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
For Num = 0 To 5
TransparentSpriteColor(Num, 255, 0, 128)
Next
TransparentSpriteColor(0, 255, 0, 128)
TransparentSpriteColor(1, 255, 0, 128)
TransparentSpriteColor(2, 255, 0, 128)
TransparentSpriteColor(3, 255, 0, 128)
TransparentSpriteColor(4, 255, 0, 128)
TransparentSpriteColor(5, 255, 0, 128)
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
x-1
EndIf
If KeyboardPushed(#PB_Key_Right)
MakeAni = #True
EndIf
End
MakeAni = #False
End
If KeyboardPushed(#PB_Key_F5)
x+13
End
If KeyboardPushed(#PB_Key_F6)
x-3
End
If IsScreenActive()
ClearScreen(0,0,0)
If MakeAni = #True
If Timer + #TimeToNextFrame
AniFrame + 1
EndIf
If AniFrame => 6 : AniFrame = 0 : EndIf
Else
EndIf
DisplayTransparentSprite(AniFrame, x, y)
FlipBuffers()
EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
Also öhm ...
ich kann da nur staunen
sorry
wieder keine Fehlerabfrage
, aber is eh egal ... lol
... zudem ist ja hier noch nicht InitSprite() aufgerufen worden, wie soll dann bitte das funktionieren? O_o
^^mir fällt so grad auf das du den Screen zwei mal öffnest -_-
denn nach den initialisierungen kommt das:
^^also kannst eins von beiden (vorzugsweise das erste) löschen.
Das würd ich allerdings mal gern erklärt haben ... das hab ich doch extra geändert ... wofür lädst du "Panzer3.bmp" wenn du dafür dannach eh "Explosion.bmp" lädst?
Durch das zweite LoadSprite(4, [...]) wird das davor geladene 4 Sprite überladen und ist somit wieder weg.
lol -_-
^^das Zeichen ";" (also das Simikolon) ist dazu da, im Code Kommentare schreiben zu können, alternative wird es dazu benutzt, um zur Zeit nicht benötigten Code aus zu Kommentieren, damit dieser nicht ausgeführt (compiliert) wird. Ich hab das extra nur auskommentiert, weil ich ja nicht weis, was du möchtest ... so wollt ich dir lediglich zeigen, das eine Schleife wesentlich einfacher ist.
wird ein Simikolon vom Compiler gelesen, so wird der Text, welcher sich dahinter befindet ignoriert, das heißt befindet sich ein Simikolon direkt am Anfang einer Zeile wird die ganze Zeile ignoriert.
Wie lang hat es eigentlich gedauert, bis du sämtliche Kommentare wieder müselig gelöscht hattest?
Und zum eigentlichen, also dadurch, das du die Simikolons raus genommen hast, definierst du nun die transparente Farbe doppelt, entweder nimm die Schleife raus, oder die 5 TransparentSpriteColor() unter der Schleife.
Außerdem lädst du oben ja nur die Sprites 0 - 4, das heißt TransparentSpriteColor(5, 255, 0, 128) ist überflüssig.
Bzw die Schleife darüber müsste lauten:
so, und weiter ... das abenteuerlichste -_-
Nachdem ich den in jaPBe (alternativer Editor zu dem Standarteditor, den du anscheinent benutzt) eingefügt hatte, war sofortklar, was da falsch ist.
Da fehlen einige "EndIf". So kann das nicht klappen -_-
Ich hab erlich gesagt auch keine ahnung, warum du die "EndIf"s raus genommen hast -_-
Nun ja ... vielleicht erklärst mal was du vor hattest
Und such mal im Forum nach jaPBe
... die neuste Version sollst dir runterladen und installieren ... das ist viel besser als der standart Editor den du benutzt.
So ...
MFG PMV
Code: Alles auswählen
If OpenScreen(640, 480, 16, "Mein Spiel")=0
EndIf ... zudem ist ja hier noch nicht InitSprite() aufgerufen worden, wie soll dann bitte das funktionieren? O_o
^^mir fällt so grad auf das du den Screen zwei mal öffnest -_-
denn nach den initialisierungen kommt das:
Code: Alles auswählen
If OpenScreen(640, 480, 16, "Mein Spiel") = #False
MessageRequester("Fehler", "Could Not open Screen at "+Str(640)+"x"+Str(480)+"x"+Str(16)+"!", #MB_OK | #MB_ICONERROR)
End
EndIf Code: Alles auswählen
If LoadSprite(4, "Panzer3.bmp" ,0)=0
MessageRequester("Fehler", "Could not load sprite 'Panzer3.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIf
If LoadSprite(4, "Explosion.bmp" ,0)=0
MessageRequester("Fehler", "Could not load sprite 'Explosion.bmp'!", #MB_OK | #MB_ICONERROR)
End
EndIfDurch das zweite LoadSprite(4, [...]) wird das davor geladene 4 Sprite überladen und ist somit wieder weg.
Code: Alles auswählen
For Num = 0 To 5
TransparentSpriteColor(Num, 255, 0, 128)
Next
TransparentSpriteColor(0, 255, 0, 128)
TransparentSpriteColor(1, 255, 0, 128)
TransparentSpriteColor(2, 255, 0, 128)
TransparentSpriteColor(3, 255, 0, 128)
TransparentSpriteColor(4, 255, 0, 128)
TransparentSpriteColor(5, 255, 0, 128)^^das Zeichen ";" (also das Simikolon) ist dazu da, im Code Kommentare schreiben zu können, alternative wird es dazu benutzt, um zur Zeit nicht benötigten Code aus zu Kommentieren, damit dieser nicht ausgeführt (compiliert) wird. Ich hab das extra nur auskommentiert, weil ich ja nicht weis, was du möchtest ... so wollt ich dir lediglich zeigen, das eine Schleife wesentlich einfacher ist.
wird ein Simikolon vom Compiler gelesen, so wird der Text, welcher sich dahinter befindet ignoriert, das heißt befindet sich ein Simikolon direkt am Anfang einer Zeile wird die ganze Zeile ignoriert.
Wie lang hat es eigentlich gedauert, bis du sämtliche Kommentare wieder müselig gelöscht hattest?
Und zum eigentlichen, also dadurch, das du die Simikolons raus genommen hast, definierst du nun die transparente Farbe doppelt, entweder nimm die Schleife raus, oder die 5 TransparentSpriteColor() unter der Schleife.
Außerdem lädst du oben ja nur die Sprites 0 - 4, das heißt TransparentSpriteColor(5, 255, 0, 128) ist überflüssig.
Bzw die Schleife darüber müsste lauten:
Code: Alles auswählen
For Num = 0 To 5
TransparentSpriteColor(Num, 255, 0, 128)
NextCode: Alles auswählen
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
x-1
EndIf
If KeyboardPushed(#PB_Key_Right)
MakeAni = #True
EndIf
End
MakeAni = #False
End
If KeyboardPushed(#PB_Key_F5)
x+13
End
If KeyboardPushed(#PB_Key_F6)
x-3
End
If IsScreenActive()
ClearScreen(0,0,0)
If MakeAni = #True
If Timer + #TimeToNextFrame
AniFrame + 1
EndIf
If AniFrame => 6 : AniFrame = 0 : EndIf
Else
EndIf
DisplayTransparentSprite(AniFrame, x, y)
FlipBuffers()
EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
Da fehlen einige "EndIf". So kann das nicht klappen -_-
Ich hab erlich gesagt auch keine ahnung, warum du die "EndIf"s raus genommen hast -_-
Nun ja ... vielleicht erklärst mal was du vor hattest
Und such mal im Forum nach jaPBe
So ...
MFG PMV
Aaaaalso: Das OpenScreen hab ich eingesetzt, weil das mit dem #Screen oder wie auch immer nicht geklappt hat. Unten die EndIf hab ich gelöscht, weil der Debugger "Another End Condition operand is expected here" angezeigt hab. Sowieso lag jede Veränderung am Debugger.
Und noch was: Die Frage, wie lange ich gebraucht habe um die Komentare zu löschen ist überflüssig, denn ich habe den Code nicht faul kopiert sondern mir die Mühe gemacht alles abzuschreiben, damit ich mit das beim Schreiben schon mal etwas anschauen kann.
Oh Mann, das ist echt schwer (Obwohl das von vorne herein klar war
), ich glaube, ich bleibe bei meinen Videos
.
Und noch was: Die Frage, wie lange ich gebraucht habe um die Komentare zu löschen ist überflüssig, denn ich habe den Code nicht faul kopiert sondern mir die Mühe gemacht alles abzuschreiben, damit ich mit das beim Schreiben schon mal etwas anschauen kann.
Oh Mann, das ist echt schwer (Obwohl das von vorne herein klar war