Programm beendet immer sofort

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Klip

Betreff: Programm beendet immer sofort

BeitragMo, Nov 22, 2004 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

um es vorweg zu sagen, ich bin absolut neu hier und dementsprechend unerfahren. Suchen hat mir bisher noch keine Antwort auf meine Frage gebracht, sollte sie auch noch zu doof sein.

Code: [AUSKLAPPEN]

Graphics bla, bla

If KeyDown(lala)
lala
EndIf         ; und so weiter


Dies ist allerdings schon mein kompletter Code, natürlich mit weiteren If-Abfragen, die alle Pfeiltasten "kontrollieren".

Es geht darum, etwas zu steuern, von mir aus einen Punkt oder eine Linie. Mein Problem liegt darin, dass ich nicht fähig bin, das Programm am Laufen zu erhalten. Natürlich kommt nach der If-Abfrage bei mir nichts mehr, demnach wird das Programm sofort beendet und die Steuerung eines Objekts wird unmöglich.

Wie löse ich dieses Problem?
 

Dreamora

BeitragMo, Nov 22, 2004 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe unten nen ganz einfachen beispielcode angefügt.
Im FAQ Bereich hat es ein sehr ausführliches Tutorial, das alles sehr gut erklärt.


Code: [AUSKLAPPEN]

graphics

while not keyhit(1)


; tue was auch immer das programm tun soll

wend

end
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

wunderkind

BeitragMo, Nov 22, 2004 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Zeig mal den kompletten Code. Vermutlich ist tatsächlich noch eine gedrückte Taste zum Zeitpunkt deiner Abfrage nicht abgefragt worden und meldet sich an der Stelle (s.o.) zu Wort.

Klip

BeitragMo, Nov 22, 2004 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Hilfe, Dreamora.

Hab mir gedacht, dass die Lösung nur einem Deppen nicht einfallen kann.

EDIT:

Neues Problem:
Code: [AUSKLAPPEN]

; Test zur Bewegung eines Objektes per Tasten.

Graphics 640, 480

While Not KeyHit(1) ; Wenn nichts gedrückt wird........

   If KeyHit(200) ; Wenn Cursortaste nach oben gedrückt
      Cls
      y=y-1
   EndIf

   If KeyHit(208) ; nach unten
        Cls
        y=y+1
   EndIf

   If KeyHit(203) ; nach links
        Cls
        x=x-1
   EndIf

   If KeyHit(205) ; nach rechts
        Cls
        x=x+1
   EndIf
   
      Plot x,y ; Punkt an die Koordianten xy zeichen

Wend ; .... falls doch:

End ; beenden.


So funktioniert die Sache wunderbar. Wenn ich dasselbe jedoch mit KeyDown probiere, verschwindet der Punkt bei jedem Versuch sofort oder macht große Sprünge.

Es geht mir weniger um eine Lösung als um eine Erklärung, warum dies nicht erkannt wird.
 

David

BeitragDi, Nov 23, 2004 8:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Weil KeyHit nur einmal "true" zurückliefert, auch wenn die Taste gedrückt bleibt. Im Gegensatz zu KeyDown.

grüße

Hubsi

BeitragDi, Nov 23, 2004 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast da auch unnötig viele Cls drin. Üblicherweise ist ein Programm so aufgebaut:Code: [AUSKLAPPEN]
Graphics breite,höhe,farbtiefe,modus
SetBuffer BackBuffer() ; Den Backbuffer initialisieren, näheres dazu siehe Onlinehilfe

; Grafiken laden

While Not KeyHit(1) ; Hauptschleife beginnen
  Cls ; den Bildschirm bereinigen
  If KeyDown(bla)... ; Tasten abfragen, Berechnungen ausführen, tralala
  Plot x,y ;                  \
  DrawImage bild,x,y ; / Grafikausgabe
  Flip ; Die Buffer tauschen, näheres siehe Onlinehilfe
Wend ; Ende Hauptschleife
End ; Die häßliche Messagebox unterdrücken :)
So gibts kein flimmern und kein fluchen und es klappt auch mit den Nachbarn Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Klip

BeitragDi, Nov 23, 2004 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht mir erst einmal darum, nur einen Punkt zu bewegen, der Buffer ist also gar nicht notwendig.

Verwende ich das Cls am Anfang der While-Schleife und dafür nicht mehr in den If-Abfragen, blinkt der Punkt, weil er ja andauern gelöscht und wieder neu angezeigt wird.
Lasse ich das Cls weg, werden die alten Punkte nicht gelöscht und ich ziehe eine Linie beim bewegen.
 

Edlothiol

BeitragDi, Nov 23, 2004 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutz Doublebuffering, vielleicht wird sich dein Problem dann auch von selbst lösen, da es die Geschwindigkeit des Programms wahrscheinlich durch VWait auf deine Bildschirmwiederholrate zurückdrehen wird. In der aktuellen Form wird dein Programm vermutlich mit ein paar tausend FPS laufen, auf jeden Fall genug, dass du nichts mehr von dem Punkt siehst, wenn du ihn auch nur kurze Zeit jedes Frame um ein Pixel bewegst.
Und das Blinken wird auch durch das DoubleBuffering verhindert.
Also: SetBuffer BackBuffer() nach das Graphics und Flip ans Ende der Schleife, fertig.

Klip

BeitragDi, Nov 23, 2004 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Das funktioniert, vielen Dank.

Für andere, die Probleme haben hier der Code:
Code: [AUSKLAPPEN]
; Spiel
; Test zur Bewegung eines Objektes per Tasten.

x=120
y=120

; ----------------------------- Grafik-Modus
Graphics 640, 480
SetBuffer BackBuffer()

Locate 20,40
Print "Mit Pfeiltasten bewegen, mit Esc abbechen."
Locate 20,55
Print "Taste drücken zum fortsetzen."
WaitKey
Cls

While Not KeyHit(1) ; Wenn Esc gedrückt wird........

Cls

   If KeyDown(200) ; Wenn Cursortaste 'nach oben' gedrückt ist
      y=y-1
   EndIf

   If KeyDown(208) ; nach unten
        y=y+1
   EndIf

   If KeyDown(203) ; nach links
        x=x-1   
   EndIf

   If KeyDown(205) ; nach rechts
        x=x+1
   EndIf

    Plot x,y

Flip
Wend ; ........ dann :
End ; beenden.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group