JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Falsche Programmreaktion?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 01.08.2003, 11:24    Titel: Falsche Programmreaktion? Antworten mit Zitat

Hi,

ich schreib mir gerade eine kleine Inputengine für Windowsprogramme. Dafür habe ich ein Windowsfenster erzeugt und DirectInput initialisiert.
Aber das Programm macht überhaupt nicht, was ich will(und nicht mal das logisch).
In einer Klasse wird das alles Initialisiert und verwaltet. In dieser Klasse gibt es dann eine Aktualisierungsfunktion, die prüft, welche Tasten gedrückt sind. KB_A, KB_B, etc... sind ähnlich den VK_s oder DIK_s mit enum erzeugte Typen:
Code:
 bool Taste[256];

if (FAILED(cDITastatur->GetDeviceState(sizeof(Taste),(LPVOID)&Taste)))
{
   cDITastatur->Acquire();
   return;
}

/********************************************************************
[[[ Status aktualisieren ]]]
*********************************************************************/
//Wenn die Taste A gedrückt ist
if(Taste[DIK_A])
{
   //Status auf true setzen
   cPressed[KB_A]=true;
}
//[...]

In der Paintingfunktion steht dann folgendes:
Code:
if(Inputengine.GetPressed(KB_A))
{
   TextOut(DevCon,0,0,"A",1);
}
//[...]

Jetzt habe ich folgende Probleme:

  1. Wenn eine der Tasten gedrückt wurde, kann man keine einzige Ausgabe auf dem Bildschirm sehen.
  2. Ausgabe funktioniert ohne die if-Anweisung:
    Code:
    if(Inputengine.GetPressed(KB_A))

  3. Will ich überprüfen, ob TextOut überhaupt ausgeführt wird und schreibe in diesem Fall etwas in die Logdatei, so steht zwar etwas in der Datei, aber es erfolgt keine Ausgabe:
    Code:
    if(Inputengine.GetPressed(KB_A))
    {
       LogEintrag("If-anweisung wurde ausgeführt\n") ;
       TextOut(DevCon,0,0,"A",1);
    }

  4. Das nächste Problem: Nun will ich die Paintfunktion nicht mehr über den Windowsmassagehandler mit WM_PAINT aufrufen, sondern gezielt mit Framebremse in der Hauptnachrichtenschleife. Wenn ich aber nun den „WM_PAINT-case“ entferne, funktioniert nicht einmal eine Ausgabe ohne if-Anweisung. Komischerweise wird definitiv die Paintfunktion aufgerufen(Mit Logfile getestet):
    Code:
     HDC DevCon;
    DevCon=GetDC(hHauptfenster);
    PAINTSTRUCT ps;
    BeginPaint(hHauptfenster,&ps);
    Painting(DevCon);
    EndPaint(hHauptfenster,&ps);
    ReleaseDC(hHauptfenster,DevCon);

    In der Painting-funktion stehen dann die TextOut-Aufrufe.
  5. Wenn ich nun wieder den WM_PAINT-case einbinde, damit die Ausgabe wieder funktioniert, versuche ich mal, absichtlich den Status der ‚A’ Taste zu manipulieren. Dazu schreibe ich in der Memberfunktion:
    Code:
     cPressed[KB_A]=true;

    Die gewünschte Ausgabe kommt nun ausschließlich, wenn ich die Memberfunktion in der Paintingfunktion vor den if-Aweisungen ausführe. Rufe ich die Memberfunktion und die Paintingfunktion voneinander getrennt auf, ist wieder keine Ausgabe zu sehen.


Das mysteriöse an der ganzen Sache ist, dass obwohl der Code ausgeführt wird und als Beweis die Logdatei gefüllt wird, keine Ausgabe zu sehen ist.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 02.08.2003, 12:57    Titel: Antworten mit Zitat

Weiß denn niemand, was da los sein könnte?

PS: Könntet ihr mal bitte diese Anwendung testen?

Dort steht ein kleiner Text, um zu testen, ob die TextOut()-Funktion überhaupt funktioniert.

Ganz oben sollten eigentlich in alphabetischer Reihenfolge die gedrückten Buchstaben stehen.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 02.08.2003, 14:27    Titel: Antworten mit Zitat

Poste mal den ganzen Source, den nur mit der Anwendung die laut dir eh nicht funktioniert können wir nichts feststellen.
Kann nur solange sagen, gehe mal im Debug Modus drüber...

oder poste mal den Abschnitt, wo du den "Status der A-Taste absichtlich manipuliert hast".

also den ganzen Bereich und dann nochmal so, wie du es in echt haben willst, weil du von irgendwelchen Aufrufen gesprochen hast, mit Memberfunktion etc...aber was für eine Memberfunktion? Von der INPUT_CLASS von der GRAPHIC_CLASS. Hab gestern für ein Vokabelprogramm, was ich gerade noch so nebenbei aus SPass progge so ne Input-klasse geschrieben, aber ich hatte nicht solche Probleme...
Zeig einfach mal deinen Source, ich glaub dann können wir dir helfen! Very Happy
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 02.08.2003, 20:11    Titel: Antworten mit Zitat

Im Debugmodus geht das nicht, da ich DirectInput benutze. Dann erhält das Programm nämlich nicht mehr den Eingabefokus.
Hier is mal der relevante Code:
Code:
 enum TASTE{KB_A,
         //restliche Buchstaben
         KB_Z,
         KB_Y} ;

Code:

class CLASSinputengine
{
public:
   CLASSinputengine();
   ~CLASSinputengine();
   bool Init(HINSTANCE HInstanz,HWND HHauptfenster);
   void ModusOn(void);
   void ModusOff(void);
   void Keyboard(void);
   bool GetPressed(TASTE Index);
   void SetText(void);
private:
   LPDIRECTINPUT8 cDIObjektzeiger;
   LPDIRECTINPUTDEVICE8 cDITastatur;

   
   char* cText;
   bool cModus;
   bool cPressed[256];
};

Code:
 /********************************************************************
Initialisiert DirectInput
Parameter:
         HINSTANCE HInstanz:      Instanz des Fensters
         HWND HHauptfenster:      Handle des Hauptfensters
Rückgabewert:
         ----------
*********************************************************************/
bool CLASSinputengine::Init(HINSTANCE HInstanz,HWND HHauptfenster)
{
   if (FAILED(DirectInput8Create(HInstanz,DIRECTINPUT_VERSION,IID_IDirectInput8,(LPVOID*)&cDIObjektzeiger,0)))
   {
      Error("Fehler beim Anlegen des DirectInput-Geräts");
   }

   if (FAILED(cDIObjektzeiger->CreateDevice(GUID_SysKeyboard,&cDITastatur,0)))
   {
      Error("Fehler beim Erzeugen des Tastatur-Device");
   }

   if (FAILED(cDITastatur->SetDataFormat(&c_dfDIKeyboard)))
   {
      Error("Fehler beim Setzen des Datenformats");
   }

   if (FAILED(cDITastatur->SetCooperativeLevel(HHauptfenster,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
   {
      Error("Fehler beim Festlegen der Kooperationsebene");
   }

   cDITastatur->Acquire();
   return true;
}

Code:
 /********************************************************************
Aktualisiert Status der Tasten
Parameter:
         ----------
Rückgabewert:
         ----------
*********************************************************************/
void CLASSinputengine::Keyboard(void)
{
   /********************************************************************
   [[[ cPressed-feld mit false initialisieren ]]]
   *********************************************************************/
   for(int count=0; count<256; count++)
   {
      cPressed[count]=false;
   }

   //Wenn der Schreibmodus eingeschaltet ist
   if(cModus==true)
   {
      /********************************************************************
      [[[ DirectInput bereit machen ]]]
      *********************************************************************/
      bool Taste[256];

      if (FAILED(cDITastatur->GetDeviceState(sizeof(Taste),(LPVOID)&Taste)))
      {
         cDITastatur->Acquire();
         //return;
      }
      /********************************************************************
      ********************************************************************
      [[[ MANIPULATIONSSTELLE ]]]
      ********************************************************************
      *********************************************************************/
            
      /********************************************************************
      [[[ Stati aktualisieren ]]]
      *********************************************************************/
      //Wenn die Taste A gedrückt ist
      if(Taste[DIK_A])
      {
         //Status auf true setzen
         cPressed[KB_A]=true;
      }

      //
      //Hier kommen die anderen Buchstaben
      //

      //Wenn die Taste Z gedrückt ist
      if(Taste[DIK_Z])
      {
         //Status auf true setzen
         cPressed[KB_Z]=true;
      }
   }
}

Code:
 /********************************************************************
Gibt den Status einer Taste zurück
Parameter:
         TASTE Index:      Index der Taste
Rückgabewert:
         bool:            Status der Taste
*********************************************************************/
bool CLASSinputengine::GetPressed(TASTE Index)
{
   return cPressed[Index];
}

Code:
CLASSinputengine Inputengine;

Code:
//Hauptnachrichtenschleife
Zeichnen(hHauptfenster);

Code:
void Zeichnen(HWND hHauptfenster)
{
   HDC DevCon;
   DevCon=GetDC(hHauptfenster);
   PAINTSTRUCT ps;
   BeginPaint(hHauptfenster,&ps);
   Painting(DevCon);
   EndPaint(hHauptfenster,&ps);
   ReleaseDC(hHauptfenster,DevCon);
}

Code:
 void Painting(HDC DevCon)
{
   Inputengine.Keyboard();

   int xposition=0;
   
   TextOut(DevCon,xposition,50,"Test für das Funktionieren der TextOut()-Funktion",49);
   if(Inputengine.GetPressed(KB_A))
   {
      /**************************
      [[[  Diese Stelle wird bei gedrückter A-Taste mit oder ohne Manipulation
ausgeführt(geprüft durch Eintrag in Logdatei)  ]]]
**************************/
      TextOut(DevCon,xposition,5,"A",1);
      xposition+=10;
   }
   //Restliche Tasten
   if(Inputengine.GetPressed(KB_Z))
   {
      TextOut(DevCon,xposition,5,"Z",1);
      xposition+=10;
   }
}

Mit Manipulation ist jetzt gemeint, an der MANIPULATIONSSTELLE(s. CLASSinputengine::Keyboard^^) folgenden Code einzufügen:
Code:
cPressed[KB_A]=true;

Nur wenn dieser Code eingefügt wird oder die folgende if-Anweisung(in der Painting()-Funktion) entfernt wird, wird das „A“ auf den Bildschirm gezeichnet.
Code:
if(Inputengine.GetPressed(KB_A))

_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 08.08.2003, 11:52    Titel: Antworten mit Zitat

Weiß denn niemand, wo der Fehler liegen kann? Sad
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik 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