[C++] Keyboard toest ingedrukt?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Hallo iedereen,

Ik ben voor zelf eens begonnen met een simpele 2d game maken in c++. Maar ik loop tegen een probleem op. Ik wil op een bepaald moment kijken welke toesten er dan allemaal zijn ingedrukt.

Eerst heb ik gekeken naar allegro, naar de key array. Maar het nadeel hierbij is dat je de hele allegro library moet starten (en ook de grafische interface).

Zijn er nog andere mogelijkheden om de huidige ingedrukte toesten op te vragen?

(Want hoe doen ze dan in games eigenlijk, de echte (grote) games?)

edit:

Misschien wel handig om te vertellen, maar het gaat om een linux applicatie (dus g++ als compiler)

[ Voor 10% gewijzigd door vdvleon op 14-07-2009 23:15 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat heb je zelf al allemaal geprobeerd en wat lukte daar niet mee?

Ik vind met google een hele hoop links die nuttig kunnen zijn [google=get keyboard state linux]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Ik heb met getch gewerkt etc. (een work-a-round dmv. non blocking (niet op enter wachten) versie van getchar). Maar dit deed toch niet echt wat ik wil. Bijv. bij een pijl-toets krijg je een sequence van 3 tekens binnen, terwijl dat er eigenlijk gewoon 1 zou moeten zijn. Dus daarom zoek ik momenteel nog even verder.

Maar bedankt voor de link. Ik kwam niet echt op de juiste zoek termen voor google ;)

[ Voor 33% gewijzigd door vdvleon op 14-07-2009 23:31 ]


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Ik heb het ooit gedaan met SDL daar noemde het een 'keyboardEvent'. SDL is ook weer een volledige multimedia lib die dacht ik met openGL werkt. Ik weet niet in hoeverre dit voor jouw kan werken, maar je kan er in elk geval eens naar kijken en ideeën/zoektermen opdoen.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:02
Een versie van kbhit die ik ooit ergens vandaan heb geripped:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int _kbhit()
{
    static bool initialized = false;

    if( !initialized )
    {
        // Use termios to turn off line buffering
        termios term;
        tcgetattr( 0, &term );
        term.c_lflag &= ~ICANON;
        tcsetattr( 0, TCSANOW, &term );
        setbuf( stdin, NULL );
        initialized = true;
    }

    int bytesWaiting;
    ioctl( 0, FIONREAD, &bytesWaiting );
    return bytesWaiting;
}

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

vdvleon schreef op dinsdag 14 juli 2009 @ 23:30:
Bijv. bij een pijl-toets krijg je een sequence van 3 tekens binnen, terwijl dat er eigenlijk gewoon 1 zou moeten zijn.
Waarom zou dat 1 moeten zijn denk je? Het zijn extended keycodes. Die moet je dus gewoon kunnen interpreteren.

Wees blij dat je een dergelijke functie hebt. Vroegâh, in het DOS tijdperk, schreef je je eigen keyboard interrupt handler waarin je poort 0x60 uitlas voor de codes :Y)

[ Voor 20% gewijzigd door .oisyn op 15-07-2009 11:43 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
@ .oisyn
Bij het maken van een game wil je gewoon kunnen kijken naar welke toets is ingedrukt en niet hoe het OS de input afhandelt.

@ kluyze
Dankje wel. Ik zou eens kijken naar SDL.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

vdvleon schreef op woensdag 15 juli 2009 @ 11:42:
@ .oisyn
Bij het maken van een game wil je gewoon kunnen kijken naar welke toets is ingedrukt en niet hoe het OS de input afhandelt.
Da's geen antwoord op de vraag. Die 3 codes staan nog steeds voor 1 toets, dus dat kun je dus gewoon interpreten :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Klopt. Maar het is gelukt met SDL library.

Gebruik het nu als volgt:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
while(_running){
    // Sleep
    msleep(50);
    
    // Get event
    while(SDL_PollEvent(&_event)){
        switch(_event.type){
            case SDL_KEYDOWN:
                _keys[_event.key.keysym.sym] = true;
            break;
            case SDL_KEYUP:
                _keys[_event.key.keysym.sym] = false;
            break;
            case SDL_QUIT:
                _running = false;
            break;
            default:
                // Ignore
            break;
        }
    }
    
    // Handler
    handler();
}

met handler():
// ...
// New position
if(_keys[SDLK_LEFT] && !_keys[SDLK_RIGHT] && !_keys[SDLK_UP] && !_keys[SDLK_DOWN]){ // Left
    if(newPos.x>0){
        newPos.x--;
    }
}else if(!_keys[SDLK_LEFT] && _keys[SDLK_RIGHT] && !_keys[SDLK_UP] && !_keys[SDLK_DOWN]){ // Right
    if(newPos.x<(_map.getSize().width-1)){
        newPos.x++;
    }
}else if(!_keys[SDLK_LEFT] && !_keys[SDLK_RIGHT] && _keys[SDLK_UP] && !_keys[SDLK_DOWN]){ // Up
    if(newPos.y>0){
        newPos.y--;
    }
}else if(!_keys[SDLK_LEFT] && !_keys[SDLK_RIGHT] && !_keys[SDLK_UP] && _keys[SDLK_DOWN]){ // Down
    if(newPos.y<(_map.getSize().height-1)){
        newPos.y++;
    }
}
// ...


Maar je kunt er natuurlijk nog veel meer mee doen.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:02
Je bezwaar was dat je de allegro lib moest linken, nu link je naar de sdl lib. Wat is het verschil?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat Allegro een nogal bloated gaming library is terwijl SDL alleen maar wat in en output afhandelt ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Bij allegro moet je persee bij de main functie al dingen initializeren etc.
En ik vind SDL veel duidelijker en makkelijker. Ik vind allegro gewoon geen gebruikersvriendelijke library en ik vind SDL een stuk beter.
Pagina: 1