Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Problem mit Variable

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 25.04.2011, 10:26    Titel: Problem mit Variable Antworten mit Zitat

Hey

Hier ein kurzer SourceCode-Auszug:
Code:
If Buttonpressed(201)=201 Then nebel.sw=4
If Buttonpressed(200)=200 Then nebel.sw=2
If nebel.sw=2 Then
   player1.money-=200
   nebel.sw=3
ElseIf nebel.sw=3 Then
   nebel.who="Player"
End If

Es geht darum, dass wenn ein Button gedrückt wird, dass sich die Variable "player1.money" einmal um 200 verringert, allerdings verringert sie sich kontinuierlich um 200 pro Schleifendurchlauf, obwohl dies ja nur dann der Fall seien sollte, wenn "nebel.sw" auf 2 steht. "nebel.sw" ändert sich allerdings auf 3, was man in dem Codeauszug gut erkennen kann. Das stetige verringern von "player1.money" lässt sich auch nur verhindern, sobald man auf einen anderen Button drückt. verwundert

Weiß jemand, wie ich es richtig anstellt, sodass player1.money sich nur einmal um 200 verringert?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 25.04.2011, 10:42    Titel: Re: Problem mit Variable Antworten mit Zitat

Okay, es geht um einen Mausbutton oder so etwas in der Art? Bedenke wie schnell ein Einzelner Schleifendurchgang sein kann und wie lange im vergleich dazu der buttton gedrückt wird. Kannst du sogar mit einem Simplen Code nachprüfen, aber darum geht es ja hier nicht.

Also, der Button wird gedrückt und bleibt einige Millisekunden gedrückt, in der Zeit wird deine Variable reduziert. Ergo musst du bei Knopfdruck warten, bis der Knopf nicht mehr gedrückt ist, bevor du in der schleife weiter gehst:

Code:
If Buttonpressed(200)=200 Then nebel.sw=2
If nebel.sw=2 Then
   player1.money-=200
   nebel.sw=3
ElseIf nebel.sw=3 Then
   nebel.who="Player"
End If
'Wenn Knopf noch gedrückt...
While(buttonpressed(201) = 201 or buttonpressed(200) = 200)
   'Warten:
   sleep 1,1
   'Hier dann noch der code der buttonpressed() neu füllt:
   <placeholder>
wend


Ich hoffe das ist verständlich lächeln
_________________
Milch ftw grinsen


Zuletzt bearbeitet von MilkFreeze am 25.04.2011, 11:14, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 25.04.2011, 10:46    Titel: Antworten mit Zitat

Erstmal danke zwinkern

Schon verständlich, bis auf folgendes:
Code:
'Hier dann noch der code der buttonpressed() neu füllt:

Was meinst du damit?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 25.04.2011, 10:57    Titel: Antworten mit Zitat

Nachfolgend Beispiel anhand von GETMOUSE.
Ich lass die Kommentare mal gleich und pass das ganze nur auf getmouse an:

Code:
screen 12

dim as integer x,y, v_button
dim i as integer

do
   getmouse (x,y,, v_button)
   if (v_button <> 0) then
      print "Klick!"
   end if
   
   'Wenn Knopf noch gedrückt...
   While(v_button)
      'Warten:
      sleep 1,1
      'Hier dann noch der code der buttonpressed() neu füllt:
      getmouse (x,y,, v_button)
   wend
loop until inkey = "q"


Damit du prüfen kannst ob v_button sich ändert oder nicht, musst du natürlich eventuell neue Werte wieder in v_button füllen. Der Code ist übrigens ausführbar und funktioniert. Lass den mal mit der unteren schleife laufen und einmal ohne lächeln
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 25.04.2011, 11:05    Titel: Antworten mit Zitat

Ich hab es jetzt so gemacht:
Code:
If Buttonpressed(201)=201 Then nebel.sw=4
If Buttonpressed(200)=200 Then nebel.sw=2
If nebel.sw=2 Then
   player1.money-=200
   nebel.sw=3
ElseIf nebel.sw=3 Then
   nebel.who="Player"
End If
While Buttonpressed(200)=200
   Sleep 1,1
   Getmouse mousex,mousey,,buttons
Wend

Allerdings hängt sich das Programm sofort nach dem Klick auf den Button auf, da die While-Schleife ja nie endet. verwundert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 25.04.2011, 11:13    Titel: Antworten mit Zitat

Ich glaub du hast mich gerade missverstanden.

Du musst ja irgendwo buttonpressed() werte zuweisen, je nach dem welcher button gedrückt wurde. Diesen code musst du auch in die Whileschleife schreiben, damit die Schleife verlassen wird, sobald der Button nicht mehr gedrückt ist. ich hab nur GETMOUSE als Beispiel genommen, weil das sehr anschaulich ist.

Oder ist Buttonpressed() eine Funktion? Dann geht das auch so:
Code:

'...
While (Buttonpressed(200)=200 or Buttonpressed(201)=201 )
   Sleep 1,1
Wend


Oder sollte es zumindest. Ich kenn ja nicht deinen kompletten Quelltext.
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 25.04.2011, 11:14    Titel: Antworten mit Zitat

Wird denn, wenn Buttonpressed(201)<>201, dieses nebel.sw auch wieder auf <>2 gesetzt? Auf mich wirkt das so, als ob die Taste gedrückt wird, nebel.sw den Wert 2 bekommt und dieser Wert dann auf Dauer so bleibt (bis dann mal Buttonpressed(200)=200 eintritt).

edit: ah, tschuldigung, falsch gelesen.
Ja, du musst eine Schleife reinbauen, die nichts weiter macht als auf das Loslassen des Buttons zu warten.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.


Zuletzt bearbeitet von nemored am 25.04.2011, 11:19, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 25.04.2011, 11:19    Titel: Antworten mit Zitat

@nemored
nebel.sw wird ja direkt auf 3 gesetzt, schau:
Code:
If nebel.sw=2 Then
   player1.money-=200
   nebel.sw=3


@MilkFreeze
ButtonPressed ist die Funktion, mit der geprüft wird, ob der jeweilige Button gedrückt wurde(in dem Fall Button 200).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 25.04.2011, 11:22    Titel: Antworten mit Zitat

Ja, habe es vorhin überlesen lächeln
Das von MilkFreeze vorgeschlagene
Code:
While (Buttonpressed(200)=200 or Buttonpressed(201)=201 )
   Sleep 1, 1
Wend

sollte an sich funktionieren (wobei hier ein SLEEP 1 denselben Effekt hat). Einzubauen nach der Button-Abfrage und Wertänderung.

mal zusammen:
Code:
If Buttonpressed(201)=201 Then nebel.sw=4
If Buttonpressed(200)=200 Then nebel.sw=2
If nebel.sw=2 Then
   player1.money-=200
   nebel.sw=3
   While Buttonpressed(200)=200
      Sleep 1
   Wend
ElseIf nebel.sw=3 Then
   nebel.who="Player"
End If


edit: jetzt habe ich doch noch eine Frage ... gibt Buttonpressed(200) zurück, ob die Taste gedrückt wurde oder gerade gedrückt wird? Im ersten Fall muss man das doch noch anders machen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 25.04.2011, 11:36    Titel: Antworten mit Zitat

Buttonpressed() gibt zurück, ob der jeweilige Button gedrückt wird.
Allerdings kann das so nicht mit der While-Schleife funktionieren, da die Hauptschleife dadurch unterbrochen wird und Buttonpressed immer auf 200 steht. verwundert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 25.04.2011, 11:40    Titel: Antworten mit Zitat

Anderer Vorschlag; die Änderung steht in der zweiten Zeile:
Code:
If Buttonpressed(201)=201 Then nebel.sw=4
If Buttonpressed(200)=200 And nebel.sw <> 3 Then nebel.sw=2
If nebel.sw=2 Then
   player1.money-=200
   nebel.sw=3
ElseIf nebel.sw=3 Then
   nebel.who="Player"
End If

Allerdings musst du dann nebel.sw irgendwann wieder den Status =3 wegnehmen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 25.04.2011, 11:44    Titel: Antworten mit Zitat

Oh das klappt danke lächeln

Aber wieso soll ich ihm den Status 3 wieder abnehmen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 25.04.2011, 12:10    Titel: Antworten mit Zitat

Weil du ansonsten nie wieder einen Effekt bei diesem Tastendruck hast. Außer das ist so geplant.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 25.04.2011, 12:15    Titel: Antworten mit Zitat

Ja, das war auch so geplant. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz