derletztekick: Drehung einer Ebene wird doppelt ausgeführt

Beitrag lesen

Hallo,

ich habe ein Clone von Tetris erstellt - ist schon etwas her - der in allen von mir getesteten Browsern (Opera, Gecko, IE) problemlos läuft. Nun habe ich erfahren, das der Maxthon-Browser sich nicht korrekt verhält - nachdem ich diesen installiert habe, kann ich das auch bestätigen. Einen Fehler kann ich trotzdem nicht finden. Möglicherweise zeigen auch andere Browser noch das selbe Problem.

Was ist nun das Problem? Ein Tetrisbaustein kann gedreht werden. Meine Steine bestehen aus Arrays vom Typ Boolean - true steht für den Stein, false für die Lücken zB das J:

  
figureTypes[0] =  [[true, false, false],  
                  [true, true, true]];

Gedreht werden die Spielsteine über eine Rotationsmatrix um 90°:

  
var R = new Array();  
R[0] = new Array(0, (-1*val));  
R[1] = new Array((1*val),  0);

wobei die Variabel "val" die Drehrichtung (links/rechts) angibt und dementsprechend 1 bzw. -1 ist. Es werde dann die true-false-Werte getauscht, an der Anzeige ändert sich dadurch jedoch noch nichts.

Wenn ein Stein gedreht wird, führe ich intern diese Rotation durch, prüfe, ob diese zulässig war und drehe den Stein zurück in seine Ausgangslage. Wenn die Drehung nicht gültig ist, bleibt alles so, wie es ist. Ist die Drehung hingegen möglich, entferne ich die sichtbaren Felder (Hintergurndfarbe transparent) drehe den Stein und mache die Felder sichtbar, die im Array true sind:

  
var kc = getKeyCode(e);  
if (kc == 32 || kc == 38 || kc == 83 || kc == 115 || kc == 73) {  
  Block.rotate();  
  if (GP.canInsert(Block,Block.y,Block.x)){  
    //Stein kann nach Drehung eingestetzt werden  
    Block.rotate(-1);  
    //Entferne Felder - Hintergrundfarbe  
    GP.removeToken(Block);  
    Block.rotate();  
    //Mache neue Feler sichtbar  
    GP.moveSidelongToken(Block, 0);  
  }  
  else {  
    //Stein kann nicht gesetzt werden, Testdrehung rückgängig machen  
    Block.rotate(-1);  
  }  
}

Im Maxthon-Browser wird jedoch diese Rotation zweimal durchgeführt. Es kommen also scheinbar nur Drehungen um 180° zu stande - sieht man beim T-Stein. Setze ich zwischen der Hin- und Rückdrehungen ein alert() und lass mit das Array testweise ausgeben, kommt 1. das korrekt raus und 2. wird nur um 90° gedreht - alles schein korrekt zu funktionieren! Selbigen Effekt erhält man auch, wenn man die [ALT]-Taste beim drehen drückt?!

Zur Navigation sind neben einigen Alternativen die Tasten I,J,K,L recht geeignet, wie mir scheint. Wer es also mal live testen will - nur zu zum Spiel...

Kann mir einer sagen, warum und wodurch dieses Problem auftritt?

Versucht habe ich auch schon, den Spielstein zu clonen und mit diesem Clone die Prüfdrehungen durchzuführen - erfolglos.

Mit freundlichem Gruß
Micha