|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 09.06.2007, 14:41 Titel: char an string anhängen + tipppause |
|
|
Huhu =)
Ich habe wohl ein Grundlagenproblem, allerdings habe ich auch nach *auf uhr guck* ca. 57min googln nix gefunden o.O
Also es geht darum, das ich eine DirectInput-Klasse geschreiben hab, die nach einem Tastendruck auf A ein 'a' liefert, und nach dem Drücken von Shift und A ein 'A', jeweils als char-Typ.
Nun muss ich diesen Buchstaben für mein EIngabefeld an den schon bereits eingegebenen Text anhängen, der in einem String gespeichert ist (string strTextFeld;).
per strTextFeld += ...; habe ich es versucht, allerdings passiert da garnichts (zumindest nichts sichtbares ).
Nun ein anderer Versuch von mir, der "fast" funktioniert:
CPP: | spTextFeld.Draw();
char temp[100];
int i = 0;
while(strTextFeld[i] != '\0')
{
temp[i] = strTextFeld[i];
i++;
}
temp[i] = Tastatur.GetInput();
strTextFeld = temp;
Direct3D.DrawText(strTextFeld.c_str(), SCR_WIDTH/2-95, SCR_HEIGHT/2-10, D3DCOLOR_XRGB(0,0,0)); |
Hier ist folgedes Problem: Drücke ich j, wird nicht nur ein j angehangen, sondern auch noch kryptisches zeugs o.O
Ich wette auch, dass es eine einfachere Möglichkeit gibt, auf die ich gerade irgendwie nicht komme ^^ _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt
Zuletzt bearbeitet von Asto am 09.06.2007, 17:06, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 09.06.2007, 15:28 Titel: |
|
|
also, eigentlich sollte es bei std::strings mit + oder += super funktionieren.
CPP: | #include <iostream>
#include <string>
using namespace std;
int main()
{
string Text="hallo du ";
Text+=" Pups";
char c='!';
Text+=c;
cout << Text;
return 0;
}
|
Klappt bei mir wunderbar. ("hallo du Pups!" kommt da dann) _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 09.06.2007, 17:05 Titel: |
|
|
Hmm, danke. Irgendwie funktioniert folgendes nun:
CPP: | spTextFeld.Draw();
if(TextFeld_activated)
{
char cTemp;
cTemp = Tastatur.GetInput();
if(cTemp != NULL)
strTextFeld += Tastatur.GetInput();
}
Direct3D.DrawText(strTextFeld.c_str(), SCR_WIDTH/2-95, SCR_HEIGHT/2-10, D3DCOLOR_XRGB(0,0,0)); |
Ich hatte vorher nicht dran gedacht, das ich bei jedem frame etwas zum string hinzufüge (wenn kein buchstabe gedrückt, return 0).
Vermutlich is 0 als char n leereichen oder so!? Naja keine Ahnung, aber vermutlich funktionierte das mit den tasten, war nur schon aus meinem bildschirmbereich!?
Trotzdem vielen Dank Nun gehts
Nun noch eine Frage (hab Thementitel editiert :X ):
Wie bekomme ich eine Pause hin, das bei einem Druck auf A nicht gleich aaaaaa im Feld steht? ich muss die Taste ja quasi kurz sperren / bzw. alle tasten.
Wie gehe ich da am besten vor?
Anbei evt. noch die Methode, die das Drücken der tasten und zurückgeben der char-werte bearbeitet
CPP: | char CDirectInput::getKeyboardInput(void)
{
char Keys_all[2][26] = {
{ 'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z'
},
{ 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z'
}
};
int lower_or_upper;
// alle Tasten der Tastatur
bool bKeyboard[256];
if(FAILED(m_lpDIDevice->GetDeviceState(sizeof(bKeyboard),(LPVOID)&bKeyboard)))
{
// die Tastatur wurde zwischenzeitlich
// durch eine andere Anwendung genutzt
// Kontrolle wiederholen
m_lpDIDevice->Acquire();
return 0;
}
// bestimmen welche Taste gedrückt wurde
char Key;
if(bKeyboard[DIK_LSHIFT] || bKeyboard[DIK_RSHIFT])
lower_or_upper = 1;
else
lower_or_upper = 0;
if(bKeyboard[DIK_A])
Key = Keys_all[lower_or_upper][0];
else if(bKeyboard[DIK_B])
Key = Keys_all[lower_or_upper][1];
else if(bKeyboard[DIK_C])
Key = Keys_all[lower_or_upper][2];
else if(bKeyboard[DIK_D])
Key = Keys_all[lower_or_upper][3];
else if(bKeyboard[DIK_E])
Key = Keys_all[lower_or_upper][4];
else if(bKeyboard[DIK_F])
Key = Keys_all[lower_or_upper][5];
else if(bKeyboard[DIK_G])
Key = Keys_all[lower_or_upper][6];
else if(bKeyboard[DIK_H])
Key = Keys_all[lower_or_upper][7];
else if(bKeyboard[DIK_I])
Key = Keys_all[lower_or_upper][8];
else if(bKeyboard[DIK_J])
Key = Keys_all[lower_or_upper][9];
else if(bKeyboard[DIK_K])
Key = Keys_all[lower_or_upper][10];
else if(bKeyboard[DIK_L])
Key = Keys_all[lower_or_upper][11];
else if(bKeyboard[DIK_M])
Key = Keys_all[lower_or_upper][12];
else if(bKeyboard[DIK_N])
Key = Keys_all[lower_or_upper][13];
else if(bKeyboard[DIK_O])
Key = Keys_all[lower_or_upper][14];
else if(bKeyboard[DIK_P])
Key = Keys_all[lower_or_upper][15];
else if(bKeyboard[DIK_Q])
Key = Keys_all[lower_or_upper][16];
else if(bKeyboard[DIK_R])
Key = Keys_all[lower_or_upper][17];
else if(bKeyboard[DIK_S])
Key = Keys_all[lower_or_upper][18];
else if(bKeyboard[DIK_T])
Key = Keys_all[lower_or_upper][19];
else if(bKeyboard[DIK_U])
Key = Keys_all[lower_or_upper][20];
else if(bKeyboard[DIK_V])
Key = Keys_all[lower_or_upper][21];
else if(bKeyboard[DIK_W])
Key = Keys_all[lower_or_upper][22];
else if(bKeyboard[DIK_X])
Key = Keys_all[lower_or_upper][23];
else if(bKeyboard[DIK_Y])
Key = Keys_all[lower_or_upper][25]; // GERMAN: Z
else if(bKeyboard[DIK_Z])
Key = Keys_all[lower_or_upper][24]; // GERMAN: Y
else
return 0;
return Key;
} |
geht das eigentlich einfacher? *gg*
kommt mir so unüblich lang vor...
die idee war ja, anstelle der indizes [0][4] z.b. [0][DIK_A] zu nutzen, aber ich finde nirgends die möglichkeit den index-wert selber festzulegen, so wie bei php _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
|
Nach oben |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 09.06.2007, 17:24 Titel: |
|
|
@David, hmm danke - sehr nützliche funktionen
Nur sollte man bei mir nur Buchstaben eingeben können (vergaß ich zu erwähnen) _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt
Zuletzt bearbeitet von Asto am 09.06.2007, 17:24, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.06.2007, 17:24 Titel: |
|
|
Die DIK_* enum Werte sind leider keine VK_* Werte das funktioniert so wie in den Links beschrieben nicht, allein schon deswegen weil die Werte ziemlich seltsam geordnet wurden:
CPP: | #define DIK_ESCAPE 0x01
#define DIK_1 0x02
#define DIK_2 0x03
#define DIK_3 0x04
#define DIK_4 0x05
#define DIK_5 0x06
#define DIK_6 0x07
#define DIK_7 0x08
#define DIK_8 0x09
#define DIK_9 0x0A
#define DIK_0 0x0B
#define DIK_MINUS 0x0C /* - on main keyboard */
#define DIK_EQUALS 0x0D
#define DIK_BACK 0x0E /* backspace */
#define DIK_TAB 0x0F
#define DIK_Q 0x10
#define DIK_W 0x11
#define DIK_E 0x12
#define DIK_R 0x13
#define DIK_T 0x14
#define DIK_Y 0x15
#define DIK_U 0x16
#define DIK_I 0x17
#define DIK_O 0x18
#define DIK_P 0x19 |
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 09.06.2007, 17:26 Titel: |
|
|
ah Fallen du bringst mich aber auf eine Idee
man kann ja die 0x02 Werte in Integer umrechnen, dann legt man an der Indexposition den passenden wert (hier z.b. 1).
müsste gehen oder? ^^
EDIT: grmpf, wird nur n bissl groß das array -> verschwenderisch, ich brauche ja nur wenige zeichen und hätte leerräume _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 09.06.2007, 17:29 Titel: |
|
|
Oh, stimmt... DirectInput!
Was für Zeichen brauchst du denn? |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.06.2007, 17:35 Titel: |
|
|
Hab das hier im gamedev.net gefunden:
http://www.gamedev.net/reference/articles/article842.asp
evtl hilft es. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 09.06.2007, 17:38 Titel: |
|
|
Fallen hat Folgendes geschrieben: | Die DIK_* enum Werte sind leider keine VK_* Werte das funktioniert so wie in den Links beschrieben nicht, allein schon deswegen weil die Werte ziemlich seltsam geordnet wurden: |
So seltsam ist das gar nicht. Die worden so geordnet wie sie auf der Tastatur vorkommen. Aber wäre meiner meinung nach besser gewesen die werte nach dem Alphabet zu vergeben, dann könnte man sowas ganz leicht machen.
Code: | bool Keys[256];
std::string str;
for(int i = DIK_A; i <= DIK_Z; ++i)
{
if(Keys[i])
str += static_cast<char>(i+35);
} |
Nur als Beispiel.
Aber so kommst du wahrscheinlich nicht drumherum es so zu machen wie du gesagt hast. Oder du machst es so:
irgendwo in einem Header
CPP: | unsigned long Keys[] = {DIK_A, DIK_B, DIK_C, ..., DIK_Z}; |
Und dann in der Funktion:
CPP: | std::string str;
unsigned int lower_or_upper = 97;
if(bKeyboard[DIK_LSHIFT] || bKeyboard[DIK_RSHIFT])
{
lower_or_upper = 65;
}
for(int i = 0; i < 26; ++i)
{
if(bKeyboard[Keys[i]])
{
str += static_cast<char>(i+lower_or_upper);
}
} |
edit: Da gibts wohl wieder ein Fehler mit dem syntax highlighting _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Zuletzt bearbeitet von 51m0n am 09.06.2007, 17:56, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 09.06.2007, 17:39 Titel: |
|
|
David: nur a-z und A-Z
Fallen: Hmm wenn ich das richtig verstehe, dann ist das auch nur für die VK_ -Ereignisse
Simon: Hmm wäre ne Idee, nachdem ich das nachvollzogen hab XD werde ich es mal probieren, aber ich merk schon, das Hauptproblem is verloren gegangen *g*:
Wie bekomme ich eine Pause hin, das bei einem Druck auf A nicht gleich aaaaaa im Feld steht? ich muss die Taste ja quasi kurz sperren / bzw. alle tasten.
Wie gehe ich da am besten vor? _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 09.06.2007, 17:48 Titel: |
|
|
Leg doch eine Variable in der du die zeit speicherst wann das letzte mal eine taste gedrückt wurde. Dann überprüfst du immer wie viel zeit seit dem letzten Tastendruck vergangen ist und wenn die Zeitspanne zu kurz war wertest du den Tastendruck einfach nicht.
So in etwa:
Das ist z.B. eine Membervariable
CPP: | unsigned long LastKeyPressed |
Und dann wieder in der Funktion:
CPP: | CurTime = timeGetTime();
if(CurTime - LastKeyPressed < 100)
{
// noch nicht genug zeit vergangen
}
else
{
// es ist genug zeit seit dem letzten tastendruck vergangen
// werte die tasten aus und
// aktualisiere die variable "LastKeyPressed" (wichtig!)
LastKeyPressed = CurTime;
}
|
Anstatt kannst timeGetTime kannst du natürlich auch deine eigene Funktion verwenden z.B. mit dem QueryPerformanceCounter. Und die 100 ist die Zeitspanne die vergehen soll bis Tasten wieder "aktiviert" sind. _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 09.06.2007, 18:36 Titel: |
|
|
Vielen Dank Simon =)
Ich versuchte es per Frames zu steuern, aber das war etwas kompliziert bzw PC-abhängig ^ ^
und deine kurze variante der methode funktioniert auch perfekt *freu*
Danke
Aber da ich das Keys[] Array in einer Klasse benutze, habe ich folgendes Problem:
In der Header-Datei deklariere ich unter private: die variable unsigned long Keys[26];
Wenn ich da schon die Werte zuweisen will, bekomme ich n parseerror o.O
Ok. Dann eben dort Werte zuweisen: CDirectInput::CDirectInput(void)
Hier habe ich das Problem, das
CPP: | Keys = { DIK_A, DIK_B, DIK_C, DIK_D, DIK_E, DIK_F, DIK_G, DIK_H, DIK_I, DIK_J,
DIK_K, DIK_L, DIK_M, DIK_N, DIK_O, DIK_P, DIK_Q, DIK_R, DIK_S, DIK_T,
DIK_U, DIK_V, DIK_W, DIK_X, DIK_Z, DIK_Y}; // Deutsche Tastatur: DIK_Y und DIK_Z getauscht |
Auch Fehlermeldungen erzeugt.
Kann ich das Array dann nur so mit Werten belegen?:
CPP: | CDirectInput::CDirectInput(void)
{
m_CurrentDevice = 0;
m_lpDI = NULL;
m_lpDIDevice = NULL;
unsigned long TEMPKeys[26] = { DIK_A, DIK_B, DIK_C, DIK_D, DIK_E, DIK_F, DIK_G, DIK_H, DIK_I, DIK_J,
DIK_K, DIK_L, DIK_M, DIK_N, DIK_O, DIK_P, DIK_Q, DIK_R, DIK_S, DIK_T,
DIK_U, DIK_V, DIK_W, DIK_X, DIK_Z, DIK_Y}; // Deutsche Tastatur: DIK_Y und DIK_Z getauscht
for(int i = 0; i < 26; i++)
Keys[i] = TEMPKeys[i];
} |
Kostet so ja mehr zeit, da ich das noch umpacken muss damit es in der Klasse "global" ist.
Naja bin halt noch n CPP Anfänger, aber irgendwie bekomme ich es nciht anders hin. Ist das die einzige Möglichkeit? _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 09.06.2007, 18:41 Titel: |
|
|
Wenn du den Array als static deklarierst müsste es eigentlich gehen.
Außerdem würde ich den Array als const deklarieren . _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.06.2007, 18:49 Titel: |
|
|
GreatFlo hat Folgendes geschrieben: |
Fallen: Hmm wenn ich das richtig verstehe, dann ist das auch nur für die VK_ -Ereignisse
|
Eigentlich geht es im die DirectInput Keyidentifier, also die DIK_ Dinge, die Funktion dort sollte den Code eigentlich korrekt umwandeln können, hast du es denn mal ausprobiert?
Damit wäre dann Davids Links ganz gut gewesen _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
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
|