用于碰撞检测的数组的目标元素

时间:2016-11-17 14:10:05

标签: javascript html5 canvas

更新:我想告诉你我已经解决了这个问题,如果不一定回答我自己的问题。我没有尝试定位推送阵列的元素,而是这样做:

var ground=[], water=[], enemies=[], environment=[];

我添加了

tokens=[];

到最后。

然后我写了一个新函数updateTokens:

function updateTokens() {
    for (var i = 0; i < tokens.length; i++) {
        tokens[i].update();
        tokens[i].draw();

        if (player.minDist(tokens[i]) <= player.width - platformWidth / 2) {
            gameOver();
        }
    }

    if (tokens[0] && tokens[0].x < - platformWidth) {
        tokens.splice(0, 1);
    }
}

(&#39; gameOver();&#39;功能仅用于测试目的)。 然后我添加了&#39; spawnTokensSprites();&#39;到spawnSprites();功能。 接下来,我为spawnTokensSprites编写了一个新函数:

function spawnTokensSprites() {
    if (score > 0 && rand(0, 20) === 0 && platformHeight < 3 {
        if (Math.random() > 0.5) {
            tokens.push(new Sprite(
                canvas.width + platformWidth % player.speed,
                platformBase - platformHeight * platformSpacer - platformWidth,
                'tokens'
            ));
        }
    }
}

然后我添加了&#39; updateTokens();&#39;到动画功能,最后,我添加了'tokens = []&#39;到了'startGame()&#39;功能。 就是这样。不是原始问题的答案,而是解决我遇到的问题的有效方法。我希望这可以帮助别人,这就是我更新帖子的原因。

    ---------------------------------------------------------

我在这里深受我的影响。我一直在关注this教程制作HTML5画布游戏。这很棒,而且我学到了很多东西,但我完全陷入困境。 我有精灵的矢量

function Sprite(x, y, type) {
    this.x = x;
    this.y = y;
    this.width = platformWidth;
    this.height = platformWidth;
    this.type = type;
    Vector.call(this, x, y, 0, 0);

    this.update = function () {
        this.dx = -player.speed;
        this.advance();
    };

    this.draw = function () {
        ctx.save();
        ctx.translate(0.5, 0.5);
        ctx.drawImage(assetLoader.imgs[this.type], this.x, this.y);
        ctx.restore();
    };
}
Sprite.prototype = Object.create(Vector.prototype);

所有精灵都从中继承。生成&#39;令牌&#39;精灵,我用这个函数:

function spawnEnvironmentSprites() {
    if (score > 0 && rand(0, 20) === 0 && platformHeight < 3) {
        if (Math.random() > 0.5) {
            environment.push(new Sprite(
                canvas.width + platformWidth % player.speed,
                platformBase - platformHeight * 2 * platformSpacer - platformWidth,
                'tokens'
            ));
        }
        else if (platformLength > 2) {
            environment.push(new Sprite(
                canvas.width + platformWidth % player.speed,
                platformBase - platformHeight * 1.5 * platformSpacer - platformWidth,
                'tokens'
            ));
        }
    }
}

将精灵绘制到屏幕上。我不能做的是从阵列中取出这些类型的精灵用于碰撞检测。我试过使用“如果&#39;来自“更新敌人”的声明功能:

 if (player.minDist(enemies[i]) <= player.width - platformWidth/2) {
      gameOver();
   }
  }

在更新环境中&#39;功能,我替代敌人&#39;对于&#39;环境&#39;,但因为我不知道如何指定代币&#39;来自&#39; environment&#39;,使用此行不会导致任何环境精灵被绘制到画布,包括平台。今天早些时候,我试过包括“令牌”。在“敌人精灵”中,玩家碰撞的时候,gameOver()函数运行了,但我无法弄清楚如何给予“令牌”#39;不同的行为(即分数增加而不是gameOver)。我应该提一下,由于我使用过的assetLoader函数,精灵被称为这种方式。 长话短说,我怎么能与“令牌”碰撞?#39;还有其他一切行为应该如此吗? 提前致谢。 编辑:对不起,我忘了提到环境数组是在一个看起来像这样的变量中声明:

var ground = [], water = [], enemies = [], environment = [];

感谢。

更新:好的,我仍然没有对此进行整理,但我已做出改变,我认为这将使您更容易帮助我(!) 我删除了令牌&#39;来自&#39; spawnEnvironmentSprites()&#39;功能并添加条件给spawnEnemySprites&#39;那推动了令牌#39;这意味着他们现在拥有与我的其他敌人相同的行为。即.. gameOver()在碰撞检测时运行。我现在的问题是,我如何定位代币&#39;在这行代码中,我可以给那个碰撞不同的行为?我喜欢&#39;令牌&#39;精灵消失,分数增加,但我不知道如何只针对“令牌”#39;数组的一部分。处理碰撞的线是:

 if (player.minDist(enemies[i]) <= player.width - platformWidth/2) {
  gameOver();
  }
 }
你能帮忙吗?提前致谢。

0 个答案:

没有答案