javascript游戏:让玩家跳跃并着陆

时间:2018-07-25 15:45:27

标签: javascript html html5 canvas html5-canvas

我正在使用画布制作一个JavaScript游戏。当按下键盘(37)时,我想让角色(玩家)跳跃并着陆在下一个即将到来的日志上。因此,我尝试使数组在更新时包含日志的y位置,并且按下键盘时,播放器会以规则的顺序降落在日志中y的位置。

但是,这很奇怪。播放器没有降落在原木的计划y位置上,有时在跳跃时突然移至其他位置,并且在第一次按键盘时(第二次及之后,它跳得很好),玩家未跳到y位置。我真的不知道几天的原因...下面的代码有问题吗?我该如何解决这个问题?

这是一个github地址,其中包含与游戏有关的所有文件。 https://github.com/psh5487/lionTravel.git

其中,RS_PlayGame.js与跳跃和着陆直接相关。

RS_PlayGame.js

function PlayGameState()
{
    //player
    this.sprPlayer = new SpriteAnimation(resourcePreLoader.GetImage("/.c9/img/game_player.png"), 125, 167, 4, 4);
    this.x = 150;
    this.y = 200;

    this.Invalid();

    this.isJumpingUp = false;
    this.jumpPower = 0;

    //log
    this.imgShortlog1 = resourcePreLoader.GetImage("/.c9/img/game_shortlog.png");
    this.imgShortlog2 = resourcePreLoader.GetImage("/.c9/img/game_shortlog.png");
    this.imgShortlog3 = resourcePreLoader.GetImage("/.c9/img/game_shortlog.png");

    //moving logs
    this.posShortlog1 = 0+200;
    this.speedShortlog1 = 7;

    this.posShortlog2 = 315+200;
    this.speedShortlog2 = 7;

    this.posShortlog3 = 625+200;
    this.speedShortlog3 = 7;

    //default y position of log
    this.y_log_position_Arr = new Array(3);
    this.y_log_position_Arr[0] = 350;
    this.y_log_position_Arr[1] = 300;
    this.y_log_position_Arr[2] = 350;

    //player position after jumping
    this.afterjump_Arr = new Array();
    this.afterjump_Arr[0] = 350;
    this.afterjump_Arr[1] = 300;
    this.afterjump_Arr[2] = 350;

    this.i = 0;
}

PlayGameState.prototype.Render = function()
{
    var theCanvas = document.getElementById("GameCanvas");
    var Context = theCanvas.getContext("2d");

    //drawing log
    Context.drawImage(this.imgShortlog1, this.posShortlog1, this.y_log_position_Arr[0], 170, 32);
    Context.drawImage(this.imgShortlog2, this.posShortlog2, this.y_log_position_Arr[1], 170, 32);
    Context.drawImage(this.imgShortlog3, this.posShortlog3, this.y_log_position_Arr[2], 170, 32);

    //drawing player
    this.sprPlayer.Render(Context);
};

PlayGameState.prototype.Update = function()
{ 
    this.sprPlayer.Update();

    //moving log
    this.posShortlog1 -= this.speedShortlog1;
    this.posShortlog2 -= this.speedShortlog2;
    this.posShortlog3 -= this.speedShortlog3;

    if(this.posShortlog1 < -170)
    {
        this.posShortlog1 = 800;

        var y_position_values_ud = [350, 300, 250];
        var position_index_ud = getRandomInt(3);
        var y_log_position_ud = y_position_values_ud[position_index_ud];

        this.y_log_position_Arr[0] = y_log_position_ud;

        this.afterjump_Arr.push(this.y_log_position_Arr[0]);
    }

    if(this.posShortlog2 < -170)
    {
        this.posShortlog2 = 800;

        var y_position_values_ud = [350, 300, 250];
        var position_index_ud = getRandomInt(3);
        var y_log_position_ud = y_position_values_ud[position_index_ud];

        this.y_log_position_Arr[1] = y_log_position_ud;

        this.afterjump_Arr.push(this.y_log_position_Arr[1]);
    }

    if(this.posShortlog3 < -170)
    {
        this.posShortlog3 = 800;

        var y_position_values_ud = [350, 300, 250];
        var position_index_ud = getRandomInt(3);
        var y_log_position_ud = y_position_values_ud[position_index_ud];

        this.y_log_position_Arr[2] = y_log_position_ud;

        this.afterjump_Arr.push(this.y_log_position_Arr[2]);
    }

    //keyboard control
    if(this.isJumpingUp == false)
    {
        if(inputSystem.isKeyDown(37))
        {
            this.isJumpingUp = true;
            this.jumpPower = -17;
            this.i++;
        }
    }
    else
    {
        this.y += this.jumpPower;
        this.jumpPower += 1;

        if(this.y >= this.afterjump_Arr[this.i]-150)
        {
            this.y = this.afterjump_Arr[this.i]-150;

            this.isJumpingUp = false;
        }
        this.Invalid();
    }
};

PlayGameState.prototype.Invalid = function()
{
    this.sprPlayer.SetPosition(this.x, this.y);
};

//getting random number
function getRandomInt(num)
{
    return Math.floor(Math.random() * num);
}

1 个答案:

答案 0 :(得分:0)

我在GitHub上发布了您的游戏,并试图了解您在做什么。

代码不容易理解,您混合了面向对象和函数式编程,我删除了一些游戏元素并放慢了游戏速度,以​​显示一些有关玩家如何跳跃的调试信息,所以现在我从技术上讲,fork只是一个让玩家跳跃的动画: https://raw.githack.com/heldersepu/lionTravel/master/index.html

玩家未登陆日志的原因在于以下代码行:

    if(this.y >= this.afterjump_Arr[1]-150)
    {
        this.y = this.afterjump_Arr[1]-150;

        this.isJumpingUp = false;
    }

您不是将日志与固定变量进行比较,而是可以将播放器定位在右侧,以使它跳到正确的位置,但您将无法通过将播放器向左或向右移动来进行错觉。键,只要您让玩家水平移动,这种错觉就会显示出真正的问题。

我建议您再学习一些游戏开发课程,这样您才能更好地理解游戏元素之间的冲突。