[JS] Een keyhandling probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo mede tweakers,

Al enige tijd probeer ik een platform spel te maken in Javascript en SVG.

In het begin had ik een simpele keymanager die registreerde wanneer een toets ingedrukt was. Enig probleem was dat in Firefox niet altijd geregistreerd wordt wanneer een knop is ingedrukt. Ik heb het hier over 100 keer kijken per seconden, tot 30 keer ging prima. Maar met 30 Hz is het spel niet echt 'vloeiend'.

Daarom wou ik het proberen om te registreren wanneer een knop ingedrukt wordt. Vervolgens dat in een variable registreren. En dan zodra de knop weer omhoog gaat, de variable weer reseten.

Nu heb ik deze code gescript:

JavaScript:
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
...
function objKeyHandler() {
            
            this.keysDown;
            
            this.init = function () {
                this.keysDown = new Array();
                this.keysDown[0] = false; // left
                this.keysDown[1] = false; // right
                this.keysDown[2] = false; // up
                this.keysDown[3] = false; // shift
                
                document.documentElement.addEventListener("keydown", this.keyPressDown, false);
                document.documentElement.addEventListener("keyup", this.keyPressUp, false);
            }
            
            this.keyPressDown = function (event) {
                event.preventDefault();
                switch (event.keyCode) {
                    case 37: // left
                        this.keysDown[0] = true;
                    break;
                    case 39: // right
                        this.keysDown[1] = true;
                    break;
                    case 38: // up
                        this.keysDown[2] = true;
                    break;
                    case 16: // shift
                        this.keysDown[3] = true;
                    break;
                }
            }
...


Zodra ik nu een toets indruk krijg ik van Firebug de volgende foutmelding:

this.keysDown is undefined
[Break on this error] this.keysDown[0] = true;

Het gaat om deze regel:

JavaScript:
1
2
3
4
5
...
case 37: // left
    this.keysDown[0] = true;
break;
...


Zelf dacht ik dat dit de juiste manier is om die variable toe te spreken. Zou iemand mij kunnen helpen door te zeggen hoe ik die variabele wel moet bereiken?

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Door het intoetsen van een toets trigger je het event, welke je object-method called. Maar volgens mij lig je dan al uit je object-scope, en weet de functie niet wie/wat this is. Ik vermoed dat "this" verwijs naar het event.

Je zou het eens kunnen proberen met

JavaScript:
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
function objKeyHandler() { 
            var self = this;

            this.keysDown = new Array(); 
            this.keysDown[0] = false; // left 
            this.keysDown[1] = false; // right 
            this.keysDown[2] = false; // up 
            this.keysDown[3] = false; // shift 
                 
            document.documentElement.addEventListener("keydown", self.keyPressDown, false); 
            document.documentElement.addEventListener("keyup", self.keyPressUp, false); 
             
            this.keyPressDown = function (event) { 
                event.preventDefault(); 
                switch (event.keyCode) { 
                    case 37: // left 
                        self.keysDown[0] = true; 
                    break; 
                    case 39: // right 
                        self.keysDown[1] = true; 
                    break; 
                    case 38: // up 
                        self.keysDown[2] = true; 
                    break; 
                    case 16: // shift 
                        self.keysDown[3] = true; 
                    break; 
                } 
            } 

[ Voor 165% gewijzigd door frickY op 21-06-2009 15:39 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Waarom zou je 100 keer per seconde willen checken?

Je hebt het over verversing, maar de opbouw van je scherm is (hoop ik) toch niet gelinked aan de detectie van je input?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@frickY, werkt perfect! Heel erg bedankt!

En de reden dat ik meer dan 30 keer per seconden wil checken is simpel, zodra het minder is voelt het poppetje heel onnatuurlijk. Een zekere traagheid. het klinkt als weinig, maar zodra je snellere combinaties wilt uitvoeren is dat heel goed merkbaar. Vaak doet hij dan ook een toets missen omdat ik hem al losgelaten heb voor hij gemeten heeft.

Acties:
  • 0 Henk 'm!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 12-09 11:42

EnnaN

Toys in the attic

Bosmonster schreef op zondag 21 juni 2009 @ 15:32:
Je hebt het over verversing, maar de opbouw van je scherm is (hoop ik) toch niet gelinked aan de detectie van je input?
Je kan toch meer dingen verversen dan alleen je graphics? bv de richting van je sprite..

sig


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

EnnaN schreef op zondag 21 juni 2009 @ 15:48:
[...]

Je kan toch meer dingen verversen dan alleen je graphics? bv de richting van je sprite..
En dat moet perse op dezelfde verversingssnelheid?

Hij heeft het overigens zelf over de verversingssnelheid van zn beeld, ik grijp het niet uit de lucht ;)

Ik zie niet in waarom je je beeld niet gewoon op 100 fps zou kunnen laten lopen, maar je input bijvoorbeeld op 30/s.

[ Voor 31% gewijzigd door Bosmonster op 21-06-2009 16:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bosmonster schreef op zondag 21 juni 2009 @ 16:35:
[...]


En dat moet perse op dezelfde verversingssnelheid?

Hij heeft het overigens zelf over de verversingssnelheid van zn beeld, ik grijp het niet uit de lucht ;)

Ik zie niet in waarom je je beeld niet gewoon op 100 fps zou kunnen laten lopen, maar je input bijvoorbeeld op 30/s.
Uhm, nee, ik heb het nergens gehad over mijn verversingssnelheid van mijn beeld ;)
Verwijderd schreef op zondag 21 juni 2009 @ 15:18:
...
In het begin had ik een simpele keymanager die registreerde wanneer een toets ingedrukt was. Enig probleem was dat in Firefox niet altijd geregistreerd wordt wanneer een knop is ingedrukt. Ik heb het hier over 100 keer kijken per seconden, tot 30 keer ging prima. Maar met 30 Hz is het spel niet echt 'vloeiend'.
...
Hz is de eenheid van frequentie, hoevaak iets per seconde gebeurd. Ik zei dus dat het goed gaat als er maar niet meer dan 30 keer per seconde wordt gekeken welke toetsen ingedrukt zijn. Het woord beeld komt er nergens is voor.

Maar 30 keer per seconde is te weinig voor input, althans bij mij voelde de besturing niet al te best aan toen ik het probeerde.

Edit: als iemand geïnteresseerd is om te zien wat ik tot nu toe heb gemaakt, het staat online op: http://liberi.nl/game.svg. Ik heb het alleen getest op Firefox.

[ Voor 6% gewijzigd door Verwijderd op 21-06-2009 16:49 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Sowieso heb je het nu event-driven, en is er geen sprake meer van polling. Bij elke keypress triggert je functie vanzelf. Veel netter dan elke x interval checken.
Pagina: 1