Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
JkerryZ JLI Master Trainee
Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 06.09.2005, 22:44 Titel: Bei Knopfdruck Bild anzeigen und ausblenden |
|
|
Hallo,
ich will ein Bild einblenden wenn man eine Taste drückt und ausblenden wenn sie erneut gedrückt wird... Nur funktionieren tut es nicht
CPP: | if(TasteGedrückt z.B. 'A')
{
bild_zeigen = true;
}
if(TasteGedrückt z.B. 'A' && bild_zeigen == true)
{
bild_zeigen = false;
}
if(bild_zeigen == true)
{
// Das Bild anzeigen.
}
if(bild_zeigen == false)
{
// Das Bild nicht zeigen.
}
|
soweit, so gut. Nur funktionieren tut es nicht!
Was kann ich tun? Was mache ich falsch?
Gruß JkerryZ |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 06.09.2005, 22:52 Titel: |
|
|
Spiel doch mal durch was passiert wenn du A drückst:
- bild_anzeigen wird auf true gesetzt in der ersten if-abfrage
- bild_anzeigen wird auf false gesetzt in der nächsten
Lösung:
nicht IF sondern ELSE IF benutzen
Wenn du allerdings in der zweiten if-abfrage nicht 'A' als zu prüfende Taste verwendet hat, dann liegt der Fehler wohl woanders. _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
|
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 06.09.2005, 22:57 Titel: |
|
|
Weis nicht obs funktionier hab nur mal schnell drüber gelesen aber ein versuch ist doch wert.
CPP: | if(TasteGedrückt z.B. 'A' && (bild_zeigen == true))
{
bild_zeigen = false;
}
else if(TasteGedrückt z.B. 'A')
{
bild_zeigen = true;
}
if(bild_zeigen == true)
{
// Das Bild anzeigen.
}
if(bild_zeigen == false)
{
// Das Bild nicht zeigen.
}
|
_________________ Theorie ist, wenn man alles weiss und nichts funktioniert.
Praxis ist, wenn alles funktioniert und keiner weiss warum. |
|
Nach oben |
|
|
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 06.09.2005, 22:59 Titel: |
|
|
sry war mal wieder zu spät _________________ Theorie ist, wenn man alles weiss und nichts funktioniert.
Praxis ist, wenn alles funktioniert und keiner weiss warum. |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 06.09.2005, 23:04 Titel: |
|
|
Florian hat Folgendes geschrieben: | sry war mal wieder zu spät |
_________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 07.09.2005, 05:54 Titel: |
|
|
CPP: | if(TasteGedrückt && Zwischendurch losgelassen)
{
bild_zeigen = !bild_zeigen;
}
if(bild_zeigen)
{
...
}
else
{
...
}
|
|
|
Nach oben |
|
|
JkerryZ JLI Master Trainee
Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 07.09.2005, 15:34 Titel: |
|
|
Vielen Dank an alle!!
Es funktioniert soweit alles...
Nur, wenn man den Finger einen Moment länger auf der Taste lässt, flimmert das Bild, weil es andauernd ein- und ausgeblendet wird.
Kann ich da irgendwie eine "Bremse" einbauen? |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 07.09.2005, 15:37 Titel: |
|
|
wie Christian schon in seinem PseudoCode angedeutet hat, musst du überprüfen, ob die Taste zwischendurch losgelassen wurde. |
|
Nach oben |
|
|
JkerryZ JLI Master Trainee
Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 09.09.2005, 21:31 Titel: |
|
|
Hmmm... also ich weiss nur das ich testen kann ob die Taste losgelassen wurde, indem ich schreibe:
Ob die Taste gedrückt ist und zwischendurch mal losgelassen wurde wüsste ich nur so zu überprüfen:
CPP: | if(KEY_UP('A'))
{
hilfe_1 = true;
}
if(KEY_DOWN('A') && hilfe_1 == true)
{
bild_zeigen = !bild_zeigen;
}
////////////////////////////////////////////////////////
if(bild_zeigen)
{
...
}
else
{
...
hilfe_1 = false;
} |
Das kann ja aber auch irgendwie nicht sein...
Denn so muss man ja die Taste erstmal losgelassen haben, bevor man sie drücken kann um das Bild anzuzeigen |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 09.09.2005, 22:43 Titel: |
|
|
Du kannst es zum Beispiel folgendermaßen realisieren:
CPP: | // Flags für die Steuerung
BYTE bControlState;
// Flags für die Steuerung
enum EControlStateFlags
{
csfPressed = 1,
csfReleased = 2
};
|
Hier wird eine Varibale vom Typ Byte deklariert, in der die Zustände einer Taste gespeichert werden. Diese Zustände werden bitweise gespeichert.
Das csfPressed-Flag sieht binär so aus: 00000001
Das csfReleases-Flag sieht dagegen so aus: 00000010
Wie man sieht, kann man in einem Byte bis zu 8 Zustände speichern.
Für unsere Zwecke reichen natürlich erstmal 2.
Der Code zum überprüfen der Taste sieht dann so aus:
CPP: | if(bKeys[DIK_A] & 0x80)
{
// csfPressed-Flag setzen
bControlState |= csfPressed;
}
else
{
// csfReleased-Flag setzen
bControlState |= csfReleased;
// csfPressed-Flag löschen
bControlState &= ~csfPressed;
}
if((bControlState & (csfPressed|csfReleased)) == (csfPressed|csfReleased))
{
/*
... Aktion ausführen ...
*/
// csfReleased-Flag löschen
bControlState &= ~csfReleased;
}
|
Das ist jetzt ein Feuerwerk von logischen Operatoren. Eine gute Gelegenheit das Wissen darüber nochmal aufzufrischen.
Am besten initialisierst du bControlState beim Programmstart mit 0. |
|
Nach oben |
|
|
JkerryZ JLI Master Trainee
Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 11.09.2005, 22:40 Titel: |
|
|
Also irgendwie krich ich das nicht gebacken
Wenn ich das mit KIs Möglichkeit mache, und nur da wo steht "Aktion ausführen" mein "bild_anzeigen = true" reinsetze kann ich das Bild anzeigen, aber nicht mehr ausblenden, was ja eigentlich auch klar ist weil es ja nirgendwo ausgeblendet wird ...
wenn ich aber an einer anderen Stelle z.B. was einsetze um es wieder auf false zu setzen, wird das Bild nur gezeigt, wenn man die Taste auch gedrückt hält...
Ich zeig euch einfach mal was ich jetzt gemacht habe.
Liegt das vlt. daran, dass ich die Tastenabfrage ohne DX mache?
CPP: | if(GetAsyncKeyState('A') & 0x8000)
{
// csfPressed-Flag setzen
bControlState |= csfPressed;
}
else
{
// csfReleased-Flag setzen
bControlState |= csfReleased;
bild_zeigen = false;
// csfPressed-Flag löschen
bControlState &= ~csfPressed;
}
if((bControlState & (csfPressed|csfReleased)) == (csfPressed|csfReleased))
{
// Aktion ausführen:
bild_zeigen = true;
// csfReleased-Flag löschen
bControlState &= ~csfReleased;
}
if(bild_zeigen == true)
{
bild_pos_x = 600;
}
else
{
bild_pos_x = 900;
} |
|
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 12.09.2005, 19:53 Titel: |
|
|
Folgendes sollte funktionieren:
CPP: | if(GetAsyncKeyState('A') & 0x8000)
{
// csfPressed-Flag setzen
bControlState |= csfPressed;
}
else
{
// csfReleased-Flag setzen
bControlState |= csfReleased;
// csfPressed-Flag löschen
bControlState &= ~csfPressed;
}
if((bControlState & (csfPressed|csfReleased)) == (csfPressed|csfReleased))
{
// Aktion ausführen bild_zeigen = (not)bild_zeigen
bild_zeigen = !bild_zeigen;
// csfReleased-Flag löschen
bControlState &= ~csfReleased;
}
if(bild_zeigen == true)
{
bild_pos_x = 600;
}
else
{
bild_pos_x = 900;
} |
Wenn das Bild gerade angezeigt wird (bild_anzeigen = true) und man eine Taste drückt, wird bild_anzeigen auf false gesetzt und somit, das Bild wieder ausgeblendet.
Im 2. Fall, wenn bild_anzeigen = false ist, wird das bild eingeblendet (bild_anzeign auf true gesetzt). |
|
Nach oben |
|
|
JkerryZ JLI Master Trainee
Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 12.09.2005, 20:26 Titel: |
|
|
Juhu, es geht jetzt alles ohne Probleme
Vielen Dank, KI! |
|
Nach oben |
|
|
|