Gå til innhold

Registrere hvilke taster som trykkes ned mens et spill kjører.


Anbefalte innlegg

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 av Meh.
Lenke til kommentar
Videoannonse
Annonse

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 av Tapped
Lenke til kommentar

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 av Meh.
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...