Meh. Skrevet 9. januar 2011 Del Skrevet 9. januar 2011 (endret) Hei! Jeg holder på med et enkelt program som skal telle hvor mange ganger jeg trykker på w, a, s og d mens jeg spiller et hvilket som helst spill. Tanken er at jeg både skal kunne se hvor mange ganger hver av tastene har blitt trykket ned, og prosentandel. Den funker allerede ganske bra, men jeg vet ikke hvordan jeg skal få den til å registrere tastetrykkene mens jeg er inne i spillet. Hva kan jeg gjøre for å fikse dette? #include <iostream> #include <Windows.h> #include <conio.h> using namespace std; int key; int w; double wp; int a; double ap; int s; double sp; int d; double dp; double all; int main(){ start: w = 0, a = 0, s = 0, d = 0; wp = 0, ap = 0, sp = 0, dp = 0; cout << "W (Up)" << '\t' << '\t' << w << '\t' << wp << endl; cout << "A (Left)" << '\t' << a << '\t' << ap << endl; cout << "S (Down)" << '\t' << s << '\t' << sp << endl; cout << "D (Right)" << '\t' << d << '\t' << dp << endl; while (key != 'q'){ key = _getch(); system("cls"); if(key == 'w'){ w = w + 1; } if (key == 'a'){ a = a +1; } if (key == 's'){ s = s + 1; } if (key == 'd'){ d = d + 1; } all = w + a + s + d; wp = (w / all) * 100; ap = (a / all) * 100; sp = (s / all) * 100; dp = (d / all) * 100; if (key == 'c'){ goto start; } cout << "W (Up)" << '\t' << '\t' << w << '\t' << wp << endl; cout << "A (Left)" << '\t' << a << '\t' << ap << endl; cout << "S (Down)" << '\t' << s << '\t' << sp << endl; cout << "D (Right)" << '\t' << d << '\t' << dp << endl; } return 0; } Endret 9. januar 2011 av Meh. Lenke til kommentar
Tapped Skrevet 10. januar 2011 Del Skrevet 10. januar 2011 (endret) Feilen er at du bare sjekker hvilken bokstav som blir skrevet i konsollen. Så den registrerer bare tastetrykkene når du har konsoll vinduet aktivt. For å løse dette i windows så kan du enkelt og greit bruke denne definisjonen #define KeyDown( KEY_CODE ) (GetAsyncKeyState( KEY_CODE ) & 0x8000) ? true : false Denne funker sånn at du skriver KeyDown(VK_LEFT) eller KeyDown('W'). Viktig at bokstavene er store. Svaret er sant hvis tasten er nede og falskt hvis oppe. Hvis du ikke forstår hvorfor jeg har skrevet funksjonen som GetAsyncKeyState( KEY_CODE ) & 0x8000. 0x8000 er hex tallet 8000 som i binær er 1000 0000 0000 0000, "&" dette tegnet betyr "bitwise and". GetAsyncKeyState sier at en tast er nede hvis og bare hvis den "most significant bit" av "shorten" som returneres er 1. Derfor hvis en tast er nede vil svaret blir som følger, 1000 0000 0000 0000 AND 1000 1010 0000 0000(Returen fra funksjonen) Som blir 1000 0000 0000 0000 fordi at "and" er bare sant hvis begge "bitsene". Dette var en rask innføring i binær/hex "matte". -Tapped Endret 10. januar 2011 av Tapped Lenke til kommentar
Meh. Skrevet 10. januar 2011 Forfatter Del Skrevet 10. januar 2011 (endret) Tusen takk for svar! Jeg har sett en del keyloggere som bruker GetAsyncKeyState, så jeg skjønner litt av hvordan det funker. Men jeg må allikevel innrømme at jeg ikke forsto alt 100%. Slik ser programmet ut nå: #include <iostream> #include <Windows.h> #include <conio.h> #define KeyDown( KEY_CODE ) (GetAsyncKeyState( KEY_CODE ) & 0x8000) ? true : false using namespace std; int key; int w; double wp; int a; double ap; int s; double sp; int d; double dp; double all; int main(){ system("TITLE WASDv2"); system("COLOR 0C"); start: w = 0, a = 0, s = 0, d = 0; wp = 0, ap = 0, sp = 0, dp = 0; cout << endl; cout << " W (Up)" << '\t' << w << '\t' << wp << endl; cout << " A (Left)" << '\t' << a << '\t' << ap << endl; cout << " S (Down)" << '\t' << s << '\t' << sp << endl; cout << " D (Right)" << '\t' << d << '\t' << dp << endl; while (1 != 0){ system("cls"); if(KeyDown('W') == true){ w = w + 1; } if(KeyDown('A') == true){ a = a + 1; } if(KeyDown('S') == true){ s = s + 1; } if(KeyDown('D') == true){ d = d + 1; } all = w + a + s + d; wp = (w / all) * 100; ap = (a / all) * 100; sp = (s / all) * 100; dp = (d / all) * 100; //if(KeyDown('C') == true){ // goto start; //} //if (KeyDown('Q') == true){ // goto end; //} cout << endl; cout << " W (Up)" << '\t' << w << '\t' << wp << endl; cout << " A (Left)" << '\t' << a << '\t' << ap << endl; cout << " S (Down)" << '\t' << s << '\t' << sp << endl; cout << " D (Right)" << '\t' << d << '\t' << dp << endl; } end: return 0; } Jeg har kommentert ut 'C' og 'Q' for at jeg ikke skal kunne restarte eller skru av programmet mens jeg er inne i et spill. Grunnen til at de ikke er fjernet helt er fordi jeg vil ha muligheten til å gjøre kjappe endringer. Nå ser jeg bare et lite problem. Når programmet starter og ingen av de fire tastene er trykket ned, vises det "-1.#IND" der hvor det skal være prosentandel. Nok en gang, tusen takk for svar! Endret 10. januar 2011 av Meh. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå