2017-10-12 5 views
2

Si je déplace le lecteur vers la droite, la gauche, le haut ou le bas, je déplace 5px dans cette direction. Mais si j'appuie sur le bouton droit et par exemple, le joueur se déplace 5px vers la droite et 5px vers le bas, soit environ 7 pixels de la position précédente au lieu de 5px.mouvement du joueur en diagonale - trop rapide || NodeJS

Je peux ajouter l'instruction IF suivante: if (haut et bas) puis spdX et spdY = (maxSpd - maxSpd√2)/ou simple -25%?

Mais je pense déjà que mon code est peu en désordre ...

enter image description here

Les solutions qui sont belles et rapides semble simple? :)

C'est mon code:

self.updateSpd = function(){ 
    if(self.pressingRight){ 
     self.spdX = self.maxSpd; 
     if(self.pressingShift && self.stamina > 0){ 
      self.spdX += self.maxRun; 
      self.stamina --; 
     } 
    } 
    else if(self.pressingLeft){ 
     self.spdX = -self.maxSpd; 
     if(self.pressingShift && self.stamina > 0){ 
      self.spdX -= self.maxRun; 
      self.stamina --; 
     } 
    } 
    else{ 
     self.spdX = 0; 
    } 

    if(self.pressingUp){ 
     self.spdY = -self.maxSpd; 
     if(self.pressingShift && self.stamina > 0){ 
      self.spdY -= self.maxRun; 
      self.stamina --; 
     } 
    } 
    else if(self.pressingDown){ 
     self.spdY = self.maxSpd; 
     if(self.pressingShift && self.stamina > 0){ 
      self.spdY += self.maxRun; 
      self.stamina --; 
     } 
    } 
    else{ 
     self.spdY = 0; 
    } 
} 

Répondre

2

Vous pourriez faire des variables pour la direction X et Y avec des valeurs -1, 0, 1:

var dirX = -self.pressingLeft + self.pressingRight; 
var dirY = -self.pressingUp + self.pressingDown; 

Réglez ensuite lors du déplacement en diagonale:

if (dirX !== 0 && dirY !== 0) { 
    dirX *= Math.SQRT1_2; 
    dirY *= Math.SQRT1_2; 
} 

Ensuite, appliquez le reste:

var speed = self.maxSpd; 

if (self.pressingShift && self.stamina > 0 && (dirX !== 0 || dirY !== 0)) { 
    speed += self.maxRun; 
    self.stamina--; 
} 

self.spdX = speed * dirX; 
self.spdY = speed * dirY; 

Tout a dit:

self.updateSpd = function() { 
    var dirX = -self.pressingLeft + self.pressingRight; 
    var dirY = -self.pressingUp + self.pressingDown; 

    if (dirX !== 0 && dirY !== 0) { 
     dirX *= Math.SQRT1_2; 
     dirY *= Math.SQRT1_2; 
    } 

    var speed = self.maxSpd; 

    if (self.pressingShift && self.stamina > 0 && (dirX !== 0 || dirY !== 0)) { 
     speed += self.maxRun; 
     self.stamina--; 
    } 

    self.spdX = speed * dirX; 
    self.spdY = speed * dirY; 
}; 

Ou peut-être:

self.updateSpd = function() { 
    var dirX = -self.pressingLeft + self.pressingRight; 
    var dirY = -self.pressingUp + self.pressingDown; 

    var speed = self.maxSpd; 

    if (self.pressingShift && self.stamina > 0 && (dirX !== 0 || dirY !== 0)) { 
     speed += self.maxRun; 
     self.stamina--; 
    } 

    if (dirX !== 0 && dirY !== 0) { 
     speed *= Math.SQRT1_2; 
    } 

    self.spdX = speed * dirX; 
    self.spdY = speed * dirY; 
}; 

Notez que cela ne se comporte différemment de l'original lorsque les deux gauche et à droite sont pressés (pas de mouvement, plutôt que de déplacer à droite) ou lorsque vous appuyez sur les deux haut et bas (pas de mouvement, plutôt que de monter).

+1

semble bien et propre et ce qui est le plus important ... Je le comprends :) Je vais l'essayer le soir après le travail et d'éviter les arrêts avec la presse haut/bas Je vais le fermer dans IF instruction de marcher à droite (droite/left pressé) ou bas (pressé haut/bas.) Merci @Ryan! – BatOOn

+0

Je ne pouvais pas attendre. Vérifié au travail via TeamViewer et tout fonctionne bien!;) Merci! – BatOOn

+1

@BatOOn: Heureux de vous aider! – Ryan