|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 01.08.2003, 11:24 Titel: Falsche Programmreaktion? |
|
|
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:
- Wenn eine der Tasten gedrückt wurde, kann man keine einzige Ausgabe auf dem Bildschirm sehen.
- Ausgabe funktioniert ohne die if-Anweisung:
Code: | if(Inputengine.GetPressed(KB_A)) |
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);
} |
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.
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 02.08.2003, 12:57 Titel: |
|
|
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 |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 02.08.2003, 14:27 Titel: |
|
|
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! _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 02.08.2003, 20:11 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
|
|
|
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
|