2017-12-07 13 views
1

私はCanvas APIゲームに取り組んでいます。私は新しい敵のインスタンスを作成するたびに新しい敵を作成したいと思いますないランダムではなく、3の特定の位置毎回ランダムな引数をとるJavaScript関数

それでは、私はこの機能を持っているとしましょう:。

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

これが0のY位置に新たな敵、ランダムであるX位置と速度の引数を作成し、それもランダムです。

これはうまく動作しますが、私は敵を欲しい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ではありませんが、あなたアイデアを得る。

UPDATE:
新たな敵がこの呼びかけ:

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); 
}; 
+0

「異なる表現」とはどういう意味ですか? – MUT

+0

私は "議論"を意味する。申し訳ありませんが、私は質問を編集しました。 – Sparrky

+0

あなたが達成したいことは明確ではありません。あなたが難しさを増やしたときにあなたはいくつの敵を作り出していますか?より具体的には、 'for'ループは何度反復されますか?あなたは実際に何個を作成したいですか? 3?または1、ランダムに3つのポジションからランダムに選択して、最初に何かをランダムに生成します(すべてを初期化するとき)?最初の敵をどうやって作りますか? – Adelin

答えて

1

Yは常に0であるため、コンストラクタにポイントを渡すことはありません。speedには開始値があり、それを通過するポイントがないため常に10ずつ増加します。 Xはランダムな唯一のもので、コンストラクタに渡すポイントがありますが、私はそれもしません。私はXの可能な値の配列を作成し、それらのうちの1つをコンストラクタ内でランダムに選択します。

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

注1:Math.floor(Math.random() * xValues.length)は私xValuesアレイ上の0と長さとの間のランダム整数(おかげMath.floorに)数値を作成します。この数値は、xValues配列からランダムな値を選択するために使用されます。

注2:この行の Iが最初Enemy.speedで10の開始値と変数Enemy.speedクラスのようなものを作成するには、評価が10に進みfalsy NaNであるのでEnemy.speed += 10は、NaNに評価されるように存在していません。

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

次に、値をインスタンスにコピーします。

this.speed = Enemy.speed; 
0

私はプロジェクト全体を知らないので、これはあくまでも一例/ドラフトです:

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をリセットする別の方法がないため、難易度をリセットする必要がある場合(再起動時など)、明らかに敵の工場を再現する必要はありません。

関連する問題