メインループの外側に独自の独立したループを持つアクターの概念実証を試したかったのですが、そのようなものを作成しました。いくつか目立った問題があるかどうか、または私がそれを完全に間違っているかどうかを知る。JavaScriptでインスタンス化された各クラスの独自のループ
「内部」ループを処理する正しい方法がこれを使用するかどうか、またはlive()関数の内部でそれを行うより良い方法があるかどうかを知りたいのですが: setTimeout( )=> {this.live()}、100);
2番目の質問は「)(this.destroy」のようなもので、クラスをwithing、インスタンス化クラスを破壊する最善の方法を知っているだろう - 今、私はちょうどオブジェクト
へのコンテナからの接続を削除していますここ例:https://codepen.io/tommica/pen/qmNXYL
私もコード自体を貼り付けます:
<ul id="simple-log"></ul>
<script>
// We will store out actors as "id" => "actor"
let actors = {};
// Custom logging functionality for a simple ul list
const sLog = (text) => {
let li = document.createElement('li');
li.innerHTML = text;
document.getElementById('simple-log').appendChild(li);
};
const randomNum = (min,max) => { return Math.floor(Math.random() * max) + min; }
// Actor definition
class Actor {
constructor(name, id) {
this.id = id;
this.name = name;
this.gender = randomNum(1,2) === 1 ? 'male' : 'female'; // Random gender
this.lastTime = null;
}
live() {
// Get the current time, and log every 5 seconds
let now = Date.now();
let difference = now - this.lastTime;
if(difference > 5000) {
sLog(`Actor "${this.name}" Log - Difference: ${difference}`);
this.lastTime = now;
}
// Determine if the actor died of a tragic accident
if(randomNum(1,100000) < 5) {
// Something tragic happened, that caused this actor to die
this.die();
} else {
// I'm pretty sure that this is not the best way, but for some reason just
// setTimeout(this.live, 1); does not work
setTimeout(() => {this.live()}, 100);
}
}
die() {
// Log the death
sLog(`Actor "${this.name}" died`);
// This seems really a wrong way to do this, should not need to rely on an element outside of the scope - something else should do this, but how?
delete actors[this.id];
}
}
// Function to spawn a new actor
let spawnActor =() => {
let id = 'a'+randomNum(1,9000000);
sLog('Spawning an actor');
let actorInstance = new Actor(id, id); // Rejoice!
actorInstance.live();
actors[id] = actorInstance;
}
// Simple loop that simulates the rendering of the screen
let lastTimeAnimated = null;
let mainAnimationLoop =() => {
// Logs every 5 seconds to the log
let now = Date.now();
let difference = now - lastTimeAnimated;
if(difference > 5000) {
sLog(`Main Animation Loop Log - Difference: ${difference}`);
lastTimeAnimated = now;
}
window.requestAnimationFrame(mainAnimationLoop);
}
// Simple loop that simulates a normal game main loop
let lastTime = null;
let mainLoop =() => {
// Mainloop logs every 5 seconds to the log
let now = Date.now();
let difference = now - lastTime;
if(difference > 5000) {
sLog(`Main Loop Log - Difference: ${difference}`);
lastTime = now;
}
// Random actor spawner
if(randomNum(1,10000) < 5) {
spawnActor(); // It truly is a blessed day!
}
setTimeout(mainLoop, 1);
}
// Should be obvious
let init =() => {
mainAnimationLoop();
mainLoop();
}
// Let's get started!
init();
</script>
あなたが何を求めているのかは不明です。特定のコードについて特定の質問をしてください。 "私が間違っているかどうかを知りたい"というのは、特定の質問ではありません。具体的な目的を説明し、その目的を達成するためにどのような問題があったのか、現在のコードで観察したことを正確に説明し、欲しいものを正確に記述します。 – jfriend00