JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=660335edb7bbd755c54250cc69988301Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Bei Knopfdruck Bild anzeigen und ausblenden

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 06.09.2005, 22:44    Titel: Bei Knopfdruck Bild anzeigen und ausblenden Antworten mit Zitat

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 Sad
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 06.09.2005, 22:52    Titel: Antworten mit Zitat

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 Razz

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Florian
Super JLI'ler


Alter: 36
Anmeldedatum: 20.06.2003
Beiträge: 302

Medaillen: Keine

BeitragVerfasst am: 06.09.2005, 22:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Florian
Super JLI'ler


Alter: 36
Anmeldedatum: 20.06.2003
Beiträge: 302

Medaillen: Keine

BeitragVerfasst am: 06.09.2005, 22:59    Titel: Antworten mit Zitat

sry war mal wieder zu spät Smile
_________________
Theorie ist, wenn man alles weiss und nichts funktioniert.
Praxis ist, wenn alles funktioniert und keiner weiss warum.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 06.09.2005, 23:04    Titel: Antworten mit Zitat

Florian hat Folgendes geschrieben:
sry war mal wieder zu spät Smile



_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 07.09.2005, 05:54    Titel: Antworten mit Zitat

CPP:
if(TasteGedrückt && Zwischendurch losgelassen)
{
   bild_zeigen = !bild_zeigen;
}

if(bild_zeigen)
{
   ...
}
else
{
   ...
}


Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 07.09.2005, 15:34    Titel: Antworten mit Zitat

Vielen Dank an alle!! Very Happy

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 07.09.2005, 15:37    Titel: Antworten mit Zitat

wie Christian schon in seinem PseudoCode angedeutet hat, musst du überprüfen, ob die Taste zwischendurch losgelassen wurde.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 09.09.2005, 21:31    Titel: Antworten mit Zitat

Hmmm... also ich weiss nur das ich testen kann ob die Taste losgelassen wurde, indem ich schreibe:
CPP:
if(KEY_UP('A'))


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 Laughing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 09.09.2005, 22:43    Titel: Antworten mit Zitat

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. Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 11.09.2005, 22:40    Titel: Antworten mit Zitat

Also irgendwie krich ich das nicht gebacken Crying or Very sad

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 ... Laughing

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 12.09.2005, 19:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 12.09.2005, 20:26    Titel: Antworten mit Zitat

Juhu, es geht jetzt alles ohne Probleme Very Happy

Vielen Dank, KI!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
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.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum