【问题标题】:player movement diagonally - too fast || NodeJS玩家对角移动 - 太快 ||节点JS
【发布时间】:2018-03-24 10:40:04
【问题描述】:

如果我向右、向左、向上或向下移动播放器,我会朝那个方向移动 5px。 但是,如果我向下和向右按下,例如播放器向右移动 5px,向下移动 5px,这距离之前的位置大约 7 个像素,而不是 5px。

我可以添加下一条 IF 语句:if (up and down) then spdX and spdY = (maxSpd - maxSpd√2) ​​/ or simple -25% ?.

但我认为我的代码已经有点乱了......

任何快速且看起来简单的好解决方案? :)

这是我的代码:

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;
    }
}

【问题讨论】:

    标签: javascript node.js express math


    【解决方案1】:

    您可以使用值-101 为 X 和 Y 方向创​​建变量:

    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;
    

    总之:

    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;
    };
    

    或许:

    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;
    };
    

    请注意,当同时按下左右键(不移动,而不是向右移动)或同时按下上下键(不移动,而不是向上移动)时,它的行为与原来的不同。

    【讨论】:

    • 看起来又漂亮又干净,最重要的是...我明白了 :) 我会在晚上下班后尝试一下,为了避免上/下按停止我会在 IF 语句中关闭它以步行右(右/左按下)或下(上/下按下。谢谢@Ryan!
    • 我等不及了。通过 TeamViewer 签入工作,一切正常! ;) 谢谢!
    • @BatOOn:很高兴为您提供帮助!
    猜你喜欢
    • 2015-07-22
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多