0

矢印キーでキャラクターを操作し、「A」で攻撃するゲームを作っています。私の問題は、攻撃に遅延がないため、「A」を押し続けると敵の HP が急速に消耗することです。遅延を追加するにはどうすればよいですか? 遅延を追加してみました。これが私のコードです:

var DELAY = 2;
var cooldown = 0;

function update(time) {

// UP
if (38 in keysDown) { 
    player.y -= player.speed * time;
}
// DOWN
if (40 in keysDown) { 
    player.y += player.speed * time;
}
// LEFT
if (37 in keysDown) {
    player.x -= player.speed * time;
}
// RIGHT
if (39 in keysDown) { 
    player.x += player.speed * time;
}

// 'A'
if(65 in keysDown) {
    player.attacking = true;
    cooldown -= time;
}
else
    player.attacking = false;

// Collision
if( (player.x + pImage.width-5) >= monster.x && 
    (player.x + pImage.width-5) < monster.x + enImage.width &&
    player.y >= monster.y && player.y < (monster.y + enImage.height) &&
    player.attacking) 
    {
        if(cooldown <= 0) {
            monster.hp -= player.dmg;
            cooldown = DELAY;
        }

        if(monster.hp <= 0) {
            relocEn();
        }
    }

}

問題は、クールダウンが「A」を押しているときにのみカウントされ、プレイヤーがモンスターに触れているときにのみリセットされることです. 「A」を押すとクールダウンタイマーがオフになるようなものが欲しいです。また、(攻撃状態の)スプライトが遅延に沿って進み、「立っている」状態に戻るようにします。前もって感謝します

4

2 に答える 2

2

これが私がすることです:

最後の攻撃の時間の変数を作成し、攻撃に関連するすべてのコードを別の関数に移動します。時間はミリ秒単位で測定されると想定しているため、おそらく遅延を数百単位にしたいと思うでしょう。

var DELAY = 400; //Change this to a higher value if it's not long enough.
var timeSinceLastAttack = -400; // The opposite of the DELAY if you want to attack at the start. 

function update(time) {

...

// 'A'
if(65 in keysDown 
    && time > (timeSinceLastAttack + DELAY) ) {
    player.attack();
    timeSinceLastAttack = time;
} 

次に、attack() 関数で衝突検出を行うことができます。

于 2013-01-16T03:17:33.217 に答える
0

わかった、

1- DELAY に大きな値を割り当ててみてください

2-「時間」の値を出力して、各ループを DELAY に追加する量を確認します (値が 0.00x より大きい場合)。

別のこと: 「クールダウン -= 時間」を「A が押された」括弧の外側に配置します。ユーザーが射撃するたびに、一定時間 A ボタンを押し続けることを強制するのは良くありません。

于 2013-01-15T23:46:22.977 に答える