ここにいる誰もが正しいですが、彼らが見逃しているのは、呼び出されるイベントではなく、発射を遅らせる必要があるということです...
キーダウン イベント内で、タイムスタンプを設定し、イベントの前の時間と現在の時間を設定します。関数内に time_limit があります。
そのため、キーを押す (またはキーが繰り返し発火する) ときは、次の点を確認してください。
current_time - last_fired >= rate_limit;
現在の時間が最後のショットから 3000 ミリ秒を超えている場合は、last_fired
タイムスタンプを現在の時間に設定し、武器を発射します。
編集
次の簡単な例を考えてみましょう:
var Keyboard = {};
var player = (function () {
var gun = {
charging : false,
lastFired : 0,
rateLimit : 3000
},
controls = { shoot : 75 },
isHit = false,
public_interface;
function shoot () {
var currentTime = Date.now();
if (gun.rateLimit > currentTime - gun.lastFired) { return; }
/* make bullet, et cetera */
gun.lastFired = currentTime;
}
function update () {
if (Keyboard[controls.shoot] || gun.charging) { this.shoot(); }
// if key was released before this update, then the key is gone...
// but if the gun was charging, that means that it's ready to be fired
// do other updates
}
function draw (ctx) { /* draw player */ }
public_interface = {
shoot : shoot,
damage : function (amt) { isHurt = true; /* rest of your logic */ }
draw : draw,
update : update
};
return public_interface;
}());
document.addEventListener("keydown", function (e) {
// if key is already down, exit
if (!!Keyboard[e.keyCode]) { return; }
// else, set the key to the time the key was pressed
// (think of "charging-up" guns, based on how long you've held the button down)
Keyboard[e.keyCode] = e.timeStamp;
});
document.addEventListener("keyup", function (e) { delete Keyboard[e.keyCode]; });
ゲームループ内では、少し異なることを行います:
プレーヤーは自分自身を更新します。
そのアップデートの中で、それはキーボードにシュートキーが押されているかどうか尋ねています。
そうであれば、shoot メソッドを呼び出します。
これはまだ 100%正しいとは言えません。プレイヤーはキーボードを気にしたり、知ったりするべきではありません。
を求めるのではなく、何らかのサービスを通じて処理する必要がありますwindow.Keyboard
。関係なく...
keyCode
コントロールはプレーヤー内にラップされるようになりました。そのため、あらゆる場所で尋ねるのではなく、それらのコントロールが何であるかを定義できます。
イベントは、キーを設定して終了するという本来の処理を実行しています。
現在の反復では、ブラウザーが起動するたびにkeydown
、必要に応じて 300x/秒になる可能性があります。そのイベントは、すべてのプレーヤー ロジックを呼び出す必要もあります... 300x /秒...
大規模なゲームでは、これをさらに一歩進めて、 と からコンポーネントを作成しControls
、Health
それぞれが独自の仕事を行うために必要なすべてのプロパティとすべてのメソッドを持ちます。
このようにコードを分割すると、さまざまな銃を持つことも非常に簡単になります。コンポーネント
を想像してみてください。
在庫にはさまざまな.
それぞれが独自のを持ち、独自の を持ち、独自のを持ち、独自のを実行し、独自の を起動します。Inventory
guns
gun
rateLimit
lastFired
bulletCount
damage
bulletType
したがって、あなたは を呼び出しplayer.shoot();
、内部では を呼び出しますinventory.equipped.shoot();
。
その内部関数は、装備された銃を発砲するためのすべてのロジックを処理します (なぜなら、あなたはinventory.add(Gun);
自分の銃とinventory.equip(id);
、あなたが望む銃を必要とするからです.