Flere taster

Fra Holstebro HTX Wiki
Skift til: navigering, søgning

Problematikken der behandles på denne side er at man tit har brug for at kunne håndtere at flere taster er trykket ned på en gang, og at man skal kunne vide om en tast er trykket ned eller ej.

Det er typisk i spil det er relevant i spil, hvor man fx skal kunne bevæge en avatar, eller måske endda flere ved hjælp af keyboardet.

Eksemplet tager udgangspunkt i keyPressed() og keyReleased() på processing.org[1] og [2]

Visning af test af flere taster

Testkode

Koden er implementeret ved hjælp af to event-handlere keyPressed() og keyReleased, hvor denne version kun tager sig af normale taster, men ikke kan håndtere fx piletasterne.

Programmet arbejder med et sæt arrays for at angive hvilke taster der testes - det sker op mod key fra det array der hedder keys.

char[] keys = {'a', 's', 'd', 'f'};
boolean[] down = {false, false, false, false};
int[] pressed = {0, 0, 0, 0};
int[] up = {0, 0, 0, 0};

void setup() {
  size(300, 150);
  textSize(20);
}

void draw() {
  for (int n = 0; n < keys.length; n++) {
    if (down[n]) {
      fill(255,0,0);
    } else {
      fill(0,255,0);
    }
    rect(15 + 60 * n, 25, 50, 50);
    fill(0);
    text(keys[n], 35 + 60 * n, 20);
    text(pressed[n], 25 + 60 * n, 45);
    text(up[n], 25 + 60 * n, 70);
  }
}

void keyReleased() {
  for (int n = 0; n < keys.length; n++) {
    if (key == keys[n]) {
      down[n] = false;
      up[n]++;
    }
  }
}

void keyPressed() {
  for (int n = 0; n < keys.length; n++) {
    if (key == keys[n]) {
      down[n] = true;
      pressed[n]++;
    }
  }
}

Koden viser hvilke taster der er trykket ned (med rødt) og hvor mange gange keyPressed() og keyReleased() er kaldt for den enkelte tast

Test resultater

Som koden er angivet, så virker programmet helt som det skal (testet på HP windows PC), så alle 4 taster fungerer helt uafhængigt.

Det kan også ses at selvom en tast holdes nede, og der kommer mange keyPressed(), så påvirker det ikke funktionen af de andre taster.

Koden ligger i denne ZIP-fil som key_test.

Det kan også gå galt

Hvis man udvider antallet af taster, ved at rette data i koden til:

char[] keys = {'a', 's', 'd', 'f', 'w', 'e', 'r', 't'};
boolean[] down = {false, false, false, false, false, false, false, false};
int[] pressed = {0, 0, 0, 0, 0, 0, 0, 0};
int[] up = {0, 0, 0, 0, 0, 0, 0, 0};

Så vil man kunne se problemer.

Man skal også udvidde bredden af programmet for at det kan være der.

Koden ligger i denne ZIP-fil som key_test2.

Test resultat ved flere taster

Testen på en HP Windows PC viser at specielt tasten 'w' kan give problemer. Det viser sig at den vil blokere for andre taster, når man prøver at have 3 taster samtidigt. Det tilsvarende kan ske med 'e' tasten.

Så vidt testen viser, så kan der altid håndteres to taster samtidigt, men når 3 taster som ligger sammen i både rækker og kolonner af taster, så giver det problemer - det ser umiddelbart ud til at mange taster på samme række fint kan håndteres (testet med 8 taster på samme række).

Problemet ligger ganske givet i den måde keyboardet er opbygget på rent elektrisk, så det aflæses i rækker og kolonner, der gør at det simpelthen kan give elektrisk konflikt mellem tasterne. Dette bekræftes på https://superuser.com/questions/1445219/why-can-my-keyboard-only-digest-6-keypresses-at-a-time men også, at det faktisk er forskelligt fra keyboard til keyboard, så den elektriske opbygning bestemmer hvor mange taster der kan registreres samtidigt.

Hvis man ønsker at designe et program med mulighed for mange samtidige taster, så kan dette program anvendes til at teste hvilke taster der kan bruges samtidigt.

Begrænsninger ved programmet

Som programmet er lavet testes kun på små bogstaver, skriver med store karakterer som 'A' og 'S' (fx ved caps lock), så reagerer programmet ikke.

En anden begrænsning er at man ikke kan teste med specialtaster (piletaster, shift, alt og ctrl samt funktionstaster) - hvis man ønsker det, så skal programmet redesignes.

Referencer

  1. keyPressed() på Processing.org
  2. keyReleased() på Processing.org