2017-04-22 13 views
0

メインループの外側に独自の独立したループを持つアクターの概念実証を試したかったのですが、そのようなものを作成しました。いくつか目立った問題があるかどうか、または私がそれを完全に間違っているかどうかを知る。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> 
+0

あなたが何を求めているのかは不明です。特定のコードについて特定の質問をしてください。 "私が間違っているかどうかを知りたい"というのは、特定の質問ではありません。具体的な目的を説明し、その目的を達成するためにどのような問題があったのか、現在のコードで観察したことを正確に説明し、欲しいものを正確に記述します。 – jfriend00

答えて

1

を基本的に私は、正しい方法は「内部」を処理するためにかどうかを知りたいのですがループは、これを使用して、またはされるだろう(ライブ()関数内)にそれを行うためのより良い方法があれば:setTimeout(() => {this.live()}, 100);

でも本当のwhileループを含むこれを行うには他の多くの方法(そのうちのいくつかがあります。 )、しかしそれらのどれも「正しい道」ではありません。

私はこれが最善の方法ではありませんが、いくつかの理由のためだけに setTimeout(this.live, 1);

理由のためHow to access the correct this/context inside a callback?を参照してください動作しないことを確信しています。

2番目の質問は「)(this.destroy」のようなもので、クラスをwithing、インスタンス化クラスを破壊する最善の方法を知っているだろう - 今、私はちょうどオブジェクトへのコンテナからの接続を削除しています - どのように何か他のものは、これを行う必要がありますが、

delete actors[this.id]; 

これは本当にこれを行うには間違った方法だが、範囲外の要素に依存する必要はないでしょうか?

javascriptで何も「破壊」できません。インスタンスがガベージコレクションされるようにするには、インスタンスへのすべての参照を削除する必要があります。俳優が死んでしまうようにする正しい方法は、それ以上生活を止めることです。つまり、.live()にもう電話をかけないでください。また、電話をする予定のすべてのタイムアウトを削除しないでください。

あなたは何かのためにそのコンテナを必要としません(あなたが示したコードでは、それを使用していません)。何らかの理由でspawnActorがインスタンスを格納していたので、のジョブをデッド収集するジョブです。実際にコレクションを必要としない場合は、それを省略してください。もし何かのためにifを使うならば、各アクターは自分自身のプロパティを設定するか、メインアクターにメッセージを送ることによって死を宣言し、コレクションから適切に削除することができます。

関連する問題