每次都带有随机参数的JavaScript函数

时间:2017-12-07 11:26:10

标签: javascript oop html5-canvas javascript-objects

我正在开发Canvas API游戏,我想创建一些敌人,每次我创建一个新的敌人实例,我希望它在新的位置创建(不是随机的,而是3个特定的位置。

所以,让我说我有这个功能:

var enemy = new Enemy(0, Math.random() * 184 + 50, Math.random() * 256);

这会产生一个新的敌人,其Y位置为0,X位置是随机的,而Speed参数也是随机的。

这样可以正常运行,但我希望只在3个特定的位置创建敌人,并且每次创建新的敌人实例时,速度只会增加10倍。

更多信息:一旦玩家进入获胜的最终位置,就会召唤新的敌人,如下所示:

var increaseDifficulty = function(numEnemies) {
    // remove all previous enemies on canvas
    allEnemies.length = 0;

    // load new set of enemies
    for (var i = 0; i <= numEnemies; i++) {
        var enemy = new Enemy(0, Math.random() * 184 + 50, Math.random() * 256);

        allEnemies.push(enemy);
    }
};

我想要的是每次创造一个具有不同参数的新敌人的方法。仅限于位置和速度。

类似的东西:

var enemy = new Enemy(0, 1, 1);

第二次被叫它时会有所不同:

var enemy = new Enemy(0, 3, 2);

当然,价值不会是1,2和3,但你明白了。

更新:
新敌人呼吁:

var Enemy = function(x, y, speed) {
    this.x = x;
    this.y = y;
    this.speed = speed;
    this.sprite = 'images/enemy-bug.png';
};

Enemy.prototype.update = function(dt) {
    this.x += this.speed * dt;
    if (this.x >= 505) {
        this.x = 0;
    }

    checkCollision(this);
};
Enemy.prototype.render = function() {
    ctx.drawImage(Resources.get(this.sprite), this.x, this.y);
};

2 个答案:

答案 0 :(得分:1)

speed始终为0,因此无法将其传递给构造函数,X具有一些起始值,然后总是增加10,因此也没有任何一点传递它。 X是唯一随机的东西,并且有一点将它传递给构造函数,但我也不会这样做。我将创建一个可能值const xValues = [20, 60, 100]; //The Enemy "class": function Enemy() { this.y = 0; this.x = xValues[Math.floor(Math.random() * xValues.length)]; Enemy.speed = (Enemy.speed += 10) || 10; this.speed = Enemy.speed; this.sprite = 'images/enemy-bug.png'; } let e1 = new Enemy; console.log(e1); let e2 = new Enemy; console.log(e2); let e3 = new Enemy; console.log(e3);的数组,并在构造函数中随机选择其中一个。

&#13;
&#13;
Math.floor(Math.random() * xValues.length)
&#13;
&#13;
&#13;

注1: Math.floor创建一个随机的整数(感谢xValues)数字介于0和{{1}之间的长度数组。此数字用于从xValues数组中选择随机值。

注意2:在这一行上,我创建类似于类变量Enemy.speed的东西,起始值为10.起初Enemy.speed不存在{{1} }评估为Enemy.speed += 10,因为NaN是假的,评估会继续NaN;

10

然后我将值复制到实例。

Enemy.speed = (Enemy.speed += 10) || 10;

答案 1 :(得分:0)

我不知道整个项目,所以这只是示例/草稿:<​​/ p>

const createEnemiesFactory = pos => {
    let lastPos = -1;
    let lastSpeed = 0;
    return () => {
        lastPos = (lastPos + 1) % pos.length;
        lastSpeed += 10;
        return new Enemy(pos[lastPos].x, pos[lastPos].y, lastSpeed);
    };
};

let enemiesFactory = createEnemiesFactory([
    {x: 0, y: 0},
    {x: 10, y: 10},
    {x: 20, y: 20}
]);

var increaseDifficulty = function(numEnemies) {
    // remove all previous enemies on canvas
    allEnemies.length = 0;

    // load new set of enemies
    for (var i = 0; i <= numEnemies; i++) {
        allEnemies.push( enemiesFactory() );
    }
};

小注意:如果您需要重置难度(即重启时),显然会重新创建敌人工厂,因为没有其他方法可以重置lastSpeed