Verwendung von FlushKeys

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Sereyanne

Betreff: Verwendung von FlushKeys

BeitragMi, März 26, 2008 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
könnte mir denn mal jemand die genaue Verwendung von FlushKeys erklären? Wo schreibe ich das wann hin?
Ich wollte ein Pausenmenü erstellen, und es ist ja doof wenn ich ein Item auswähle und den Knopf fürs Menü drücke, passiert erst mal nix, aber wenn ich aus den Items wieder raus bin ist das ganze Menü weg.
Code: [AUSKLAPPEN]
If KeyHit(OK) ; ist global deklariert
   If ay=11 Then    ; Position des Auswahlpfeiles
      ;FlushKeys???
      Repeat
      Cls
      Text 170,170, "Gesammelte Items"   ; es sollen die items angezeigt werden
                          ;Items
      ;FlushKeys???
      Flip 0
      Until KeyHit(OK) ; damit man aus den Items wieder raus kommt
   EndIf

Noch schlimmer isses beim Speichern, wenn ich den falschen Knopf drücke komm ich aus dem Pausenmenü überhaupt nicht mehr raus!
Habt ihr ein paar grundlegende Tipps für mich?
Danke im Voraus!

The_Nici

BeitragMi, März 26, 2008 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
FlushKeys nach
Code: [AUSKLAPPEN]

If ay=11 Then
...
EndIf
;Hier

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, März 26, 2008 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Flushkeys löscht den Tastaturpuffer und zwar so als wenn du keine gedrückt hätteset

In deinem Beispiel wartest du auf eine spezielle Taste und solange die nichtgedrückt wird kommst du aus der Schleife nicht raus.
Aber alle Tasten die zwischenzeitlich gedrückt worden können immer noch abgerufen werden, was dann dazu führt das beim abfragen der Keys in der nächsten Schleife zu Problemen führt.
Flushkeys benutzt man immer bevor man ein neues Menue aufruft um Falscheingaben zu verhindern.

Also in deinem Fall nach der Schleife (Until KeyHit(OK))
[BB2D | BB3D | BB+]

Sereyanne

BeitragDo, März 27, 2008 9:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Herzlichen Dank. Das wäre geklärt. Ich glaube mein Problem liegt gar nicht in dem Flushkeys. Ich komme nur aus dem Menü nicht mehr raus. Kann ich von der Hauptschleife zur Funktion springen und innerhalb der Funktion zu einer anderen Funktion? Wenn die zweite Funktion dann beendet ist, wohin springt der Compiler dann?

The_Nici

BeitragDo, März 27, 2008 9:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Dort wo du die 1. Funktion ausgeführt hast.

Sereyanne

BeitragDo, März 27, 2008 11:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ich hab blöd gefragt. Zur Veranschaulichung:
Code: [AUSKLAPPEN]
Repeat
;Hauptschleife
(...)
If KeyHit(menu) Then Menu()
(...)
Flip
Forever
End

Function Menu()
(...)
; Abfrage der Möglichkeiten
If pos_y=17 Then beenden()
ClsColor 29,88,15
FlushKeys
End Function

Function beenden()
If pos_y=15 Then menu()
End Function

Wenn ich nun von der Function Menu() in Function beenden() wechsle und dann die If Bedingung erfülle, wohin springt das Prog dann? An den Anfang der Function Menu() oder dorthin in die Function von wo aus die andere gestartet wurde?

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, März 27, 2008 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
das Programm macht genau nach der aufgerufenen Function weiter.

Also egal ob die If in der Funktion beenden erfüllt ist oder nicht , kommst du automatisch wieder ins Menue,
nur das bei erfüffung der If mehere functionen noch aktiv
[BB2D | BB3D | BB+]

Sereyanne

BeitragDo, März 27, 2008 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Question Question Question Question Question Question Question
kannst du mir das bitte nochmal genauer erklären^^

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, März 27, 2008 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist nicht der ideale Weg für für ein Menue da es zu sogenannten Spagetticode führt
damit meine ich eine Function die die gleiche Function startet aus der sie aufgerufen wurde
Code: [AUSKLAPPEN]
Repeat
;Hauptschleife
    (...)
    ;verwende bitte nicht gleiche Namen "menu!" für Functionen und Variablen
    ;da sind Probleme vorprogrammiert
    If KeyHit(menu) Then Menu() ; hier ist klar Menue wird aufgerufen
    ;ist die Function menue beendent dann geht es direkt hier weiter
    (...)
    Flip
Forever
End
Function Menu()
(...);
; Abfrage der Möglichkeiten
    If pos_y=17 Then beenden() ;Beenden wird aufgerufen
    ClsColor 29,88,15
    FlushKeys
    ; wenn hier angekommen gehts endweder in
    ; die Hauptschleife wenn Menu dort aufgerufen wurde
    ; oder nach beenden wenn es durch die if da aufgerufen worden ist
End Function

Function beenden()
    If pos_y=15 Then menu()
    ;wenn die pos_y=15 nicht das menu aufgeruft beendet die Funktion und geht trotzdem ins menue direkt nach dem Aufruf
    ;also beendet das Spiel nicht
End Function

Besser ist es das zentral aus der Hauptschleife zu steuern.
[BB2D | BB3D | BB+]

Sereyanne

BeitragDo, März 27, 2008 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Besser ist es das zentral aus der Hauptschleife zu steuern.

aus der hauptschleife??? was soll ich denn da noch alles reinpacken???? *umfall*

Herzlichen Dank für deine ausführliche Erklärung. Jetzt kann ich wenigstens nachvollziehen wo das Prog hinhüpft und warum ich nicht mehr aus dem Menü rauskomme.
Stell dir das mal vor: du gehst ins menü, sagst beenden, sagst nein lieber doch nicht beenden. jetzt bist du wieder im menü. du willst aus dem menü raus, drückst die taste, und kriegst wieder vorgesetzt: willst du wirklich beenden?
toller bug.
der jetzt behoben ist denn dank deiner erklärung habe ich eine sprungmarke eingebaut.
Danke!!! Very Happy
 

Dreamora

BeitragDo, März 27, 2008 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles
Sagt ja niemand das es auch effektiv da stehen muss, dafür gibts ja funktionen die man aufrufen kann.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Sereyanne

BeitragDo, März 27, 2008 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Alles
Sagt ja niemand das es auch effektiv da stehen muss, dafür gibts ja funktionen die man aufrufen kann.


jaja ich hatte ja auch z.B. meinen bewegungscode inner funktion ausgelagert. weiß auch nich warum das nich mehr ging, jedenfalls hab ich solange gebastelt bis ich die figur wieder steuern konnte und siehe da, auf einmal war der bewegungscode in der hauptschleife statt in der funktion....

Artemis

BeitragDo, März 27, 2008 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt dann wahrscheinlich daran, dass du Variablen in der Funktion veränderst, die nur lokal in der Funktion existieren bzw. nicht global sind.

Beispiel bei dem die variablen x und y immer 100 bleiben.
Code: [AUSKLAPPEN]

x = 100
y = 100

repeat
    bewegen()
until keyhit(1)

function bewegen()
   if (keydown(12)) then x = x + 10
   if (keydown(13)) then x = x - 10
   if (keydown(14)) then y = y + 10
   if (keydown(15)) then y = y - 10
end function



Du musst dann entweder mit Globalen arbeiten oder das ganze mit types lösen.

Sereyanne

BeitragFr, März 28, 2008 8:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Das liegt dann wahrscheinlich daran, dass du Variablen in der Funktion veränderst, die nur lokal in der Funktion existieren bzw. nicht global sind.

hmmm das könnte allerdings sein dass ich das übersehen hab Embarassed
jaja ich verlier so langsam den überblick bei so langen codes ^^^
danke dass du mich darauf aufmerksam gemacht hast!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group