アットウィキロゴ

サイコロを2個振る関数を dice.roll2dice() として、このように定義しました。

ポイントは、setTimeoutを使って、100ミリ秒後に自分自身を呼び出すこと。 これで、何らかの外圧(ユーザーが dice.stop() を実行する)がない限り、 サイコロは約100ミリ秒毎に目を変え続けることになる。

alert("ピップは治療薬を飲んだ。生命点の回復量を決めるために、サイコロを2個振れ。");
dice.rolloing_state = "rolling";
dice.roll2dice();
dice.roll2dice = function() {
    // ユーザーがdice.stop();を押すとdice.rolling_state === "rolled"になり、止まる
    if (this.rolling_state === "rolling") { 
    
        ctx.clearRect(0, 0, 500, 210); // canvasをクリア

        this.die1pip = Math.ceil(Math.random() * 6); // 左のサイコロの目
        switch (this.die1pip) {
            case 1:
                draw_pip1(150, 105); // 1の目のサイコロを描く
                break;
            case 2:
                draw_pip2(150, 105); // 2の目のサイコロを描く
                break;
            case 3:
                draw_pip3(150, 105);  // 3の目のサイコロを描く
                break;
            case 4:
                draw_pip4(150, 105); // 4の目のサイコロを描く
                break;
            case 5:
                draw_pip5(150, 105); // 5の目のサイコロを描く
                break;
            case 6:
                draw_pip6(150, 105); // 6の目のサイコロを描く
                break;
        }

          this.die2pip = Math.ceil(Math.random() * 6); // 右のサイコロの目
        switch (this.die2pip) {
            case 1:
                draw_pip1(350, 105); // 1の目のサイコロを描く
                break;
            case 2:
                draw_pip2(350, 105); // 2の目のサイコロを描く
                break;
            case 3:
                draw_pip3(350, 105); // 3の目のサイコロを描く
                break;
            case 4:
                draw_pip4(350, 105); // 4の目のサイコロを描く
                break;
            case 5:
                draw_pip5(350, 105); // 5の目のサイコロを描く
                break;
            case 6:
                draw_pip6(350, 105); // 6の目のサイコロを描く
                break;
       } 

        // dice.roll_speed === 100ミリ秒後に自分自身を呼び出す
        setTimeout("dice.roll2dice()", this.roll_speed); 
    }
}

そして、ユーザーが回っているサイコロをクリック(実はサイコロを狙わなくてもキャンバス内ならおk)すると、 dice.stop() が実行される。

<canvas id="dice_canvas" width="500" height="210" onclick="dice.stop()" style="background: #ccffcc;"></canvas>

dice.stop() で、dice.rolling_state が "rolling" から "rolled" になると、dice.roll2dice() の再度自己呼出が止まり、サイコロが止まる。

dice.stop = function () {
    if (this.rolling_state === "rolling") {
        this.rolling_state = "rolled";
    }
}

タグ:

+ タグ編集
  • タグ:
最終更新:2012年04月01日 18:05