2017-11-20 1 views
0

私はトラフィックシミュレータを作成するためにJavaScriptスクリプトでTypescriptを使用しています。さて、交通信号がどれくらいの間赤色になっているかを知りたい。私のコードでは、light変数の色を制御するための特定のブール値がtrueの場合、トラフィックライトは緑に変更されます。私は、このブール変数が真に設定されている時間を測定できるかどうかを考えています。私は信号機の時間を返すことができるように。私のコードは長すぎて、それらのすべてを投稿することはできません。しかし、トラフィックライトを設定するに関連付けられているいくつかのコードがあります:JavaScript/Typescript - 変数の値が設定されている時間を測定できますか?

  1. 私は緑にトラフィックライトを設定したい場合は、この関数が呼び出されることになります。

    setDirAtInter(dir: TLDir, loc: number){ 
        //North-South 
        if(dir == 0){ 
        this.intersections_arr[loc].NS = true; 
        } 
        //East-West 
        else if(dir == 1){ 
        this.intersections_arr[loc].EW = true;   
        } 
    } 
    

    intersection_arrはのインスタンスを含む配列ですintersectionクラス

  2. そしてブール変数が設定されており、intersectionクラスの内側にある以下のコードは、信号灯の色を設定するために影響を受けるであろう。

    if(this.NS == true){ 
        this.right = "rgba(255,0,0,0.4)"; 
        this.left = "rgba(255,0,0,0.4)"; 
        this.top = "rgba(0,255,0,0.4)"; 
        this.bottom = "rgba(0,255,0,0.4)"; 
    } 
    
  3. そしてintersectionクラス内の以下のコードは、トラフィックライトを描画するために影響を受けるであろう:

    this.ctx.save(); 
    if(this.top == "rgba(0,255,0,0.4)"){ 
        //green 
        var shadow_color = 'rgba(0,255,0,1)'; 
    } 
    else{ 
        var shadow_color = 'rgba(255,0,0,1)'; 
    } 
    
    //console.log(); 
    this.ctx.fillStyle = shadow_color; 
    this.ctx.shadowColor = shadow_color 
    this.ctx.shadowOffsetY = -2; 
    this.ctx.shadowBlur = 2; 
    /** 
        * Right Traffic Light at Top side 
    */ 
        this.ctx.fillRect(this.x+4,this.y-2,6,6); 
        this.ctx.fill(); 
        this.ctx.restore(); 
        this.ctx.shadowOffsetX = undefined; 
        this.ctx.shadowBlur = undefined; 
    

    ctxCanvasRenderingContext2Dがあります。交通信号がどれくらい緑色に設定されているかを測定することができますか?

+1

Typescriptは分かりませんが、色が変わるたびに現在の時刻を保存する変数 'timeChanged = new Date()'を設定するだけです。そして、 'new Date() - timeChanged'は最後に変更されてから何ミリ秒経過したかを示します。 – nnnnnn

答えて

0

私はそうするための組み込み方法はありません。 setIntervalを使用し、変更するまで変数の値をチェックし続けます。

let value = true; 
let time = 0; 
let previousValue = value; 
const resolution = 1000; // 1 second 
const handle = setInterval(() => { 
    previousValue === value ? time += resolution : clearInterval(handle); 
}, resolution); 

timeの値はミリ秒単位です。つまり、が最初に変更された時間です。

+0

ありがとう!最初に値を変更したのではなく、変数が一定の値に設定されている時間を追跡するとどうなりますか? –

+1

特定の値、または最新の値?最新の値をチェックしてアプリケーション内のどこかでクエリを実行する場合は、上記の関数を関数として実装する必要があります。 任意の値に対して実行したい場合は、上記と同じようにして履歴の配列(時系列)を作成します。 – vader

+0

私はcodepenまたはfiddleを作成できるかどうかを見てみましょう。いずれにしても、オブジェクト内のすべての値をラップして、参照渡しできるようにする必要があります。 – vader

関連する問題