最後に

時節柄、なまけもの(ずぼらな)のサンタクロースがプレゼントをばらまくことになっていますが、画像などを変えて楽しむこともできます。例えば、サンタクロースを首相にして、プレゼントボックスを12枚の1,000円札にするのもよいかもしれません。このプログラムは自由に改造して配布しても問題ありません。背景画像を変更したりプログラム書き換えて楽しんでください。

完成したプログラムコード

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta name="viewport" content="initial-scale=1, user-scalable=no">
    <title>プレゼント キャッチ!</title>
    <style type="text/css"><!--
        h1 { font-size:14pt; }
        body { background-image: url(images/bg.png); background-repeat:no-repeat; }
        #displayScore { position:absolute; top:0px; left:260px; color:#ffffff; font-size:9pt; }
        #gameForm { position:absolute; top:80px; left:60px; font-size:9pt; }
        #gameForm div { width:210px; color:white; }
        input { font-size:16pt; }
        #point { position:absolute; top:-100px; left:0px; font-size:12pt; opacity:0.75;
                    font-weight:bold; width:40px; height:14px; color:white; z-index:999; }
    --></style>
    <script type="text/javascript"><!--
        // ===============================================
        // ゲームに必要な変数
        // ===============================================
        var maxCount = 20;  // プレゼントの最大数
        var count = 0;  // プレゼントのカウント数
        var limitY = 309;   // 下限
        var presentData = new Array();  // プレゼントボックス情報を入れる配列
        var timerID = null; // タイマー変数
        var ptTimer = null;     // ポイント表示のタイマー変数
        var score = 0;  // スコア
        window.onload = function(){
            for (var i=0; i<maxCount; i++) {
                presentData[i] = presentAdd(i);
            }
        }
        // ===============================================
        // プレゼントボックスを生成
        // ===============================================
        function presentAdd(n){
            var img = document.createElement("img");    // imgエレメントを生成
            document.body.appendChild(img); // ページに追加
            img.id = "present"+n;   // ID名を割り当てる
            img.speed = Math.random() * 5 + 2;  // 落下速度を設定する
            img.degree = Math.floor(Math.random() * 36) * 10;   // 初期角度
            img.src = "images/present.png"; // 表示する画像
            img.style.top = img.posY = (Math.random() * -180) -24;  // 画像のY座標
            img.style.left = img.posX = Math.random() * 280 + 20;   // 画像のX座標
            img.style.width = "24px";   // 画像の横幅
            img.style.height = "24px";  // 画像の縦幅
            img.style.position = "absolute";    
            img.ontouchstart = function(){  // タッチした時に処理
                this.ontouchstart = null;
                if (this.posY < limitY) {
                    var pt = 370 - Math.floor(this.degree); // 回転角度によってスコアを変える
                    pt = pt + Math.floor(this.posY / 10);       // 下に行くほど高得点
                }else{
                    pt = 1; // 下限より下なら1点
                }
                score = score + pt; // スコアを加算する
                displayPoint(this.posX, this.posY, pt); // 上に移動するスコア表示を設定
                document.getElementById("displayScore").innerHTML = score + "点";
                this.style.visibility = "hidden";   // プレゼントボックスを非表示にする
                gameOverCheck();    // ゲームオーバーチェック
            }
            img.fall = function(){  // 落下処理を行うメソッド
                this.posY = this.posY + this.speed;
                if (this.posY < limitY) {
                    this.degree = (this.degree + 10) % 360; // 10度ずつ回転
                }
                this.style.top = this.posY;
                this.style["-webkit-transform"]="rotate("+this.degree+"deg)";   // CSSで回転させる
                if (this.posY > limitY) {
                    this.posY = limitY; // ある程度よりは下に落下しないようにする
                }
            }
            return img;
        }
        // ===============================================
        // プレゼントボックスを落下させる
        // ===============================================
        function movePresentBox(){
            for (var i=0; i<maxCount; i++) {
                presentData[i].fall();
            }
            var ptObj = parseInt(document.getElementById("point").style.top);
            ptObj = ptObj - 2;
            document.getElementById("point").style.top = ptObj;
            var n = document.getElementById("point").style.opacity;
            n = n - 0.15;
            document.getElementById("point").style.opacity = n;
        }
        // ===============================================
        // 得点を表示
        // ===============================================
        function displayPoint(x,y,pt){
            clearTimeout(ptTimer);  // ポイントのタイマーをクリア
            document.getElementById("point").style.opacity = 1.0;
            document.getElementById("point").style.left = x;
            document.getElementById("point").style.top = y;
            document.getElementById("point").innerHTML = pt;
            ptTimer = setTimeout('document.getElementById("point").innerHTML=""', 800);
        }
        // ===============================================
        //ゲームオーバー
        // ===============================================
        function gameOverCheck(){
            count = count + 1;
            if (count >= maxCount){
                clearInterval(timerID); // タイマー解除
                alert("ゲームオーバー");
            }
        }
        // ===============================================
        // ゲーム開始
        // ===============================================
        function gameStart(){
            document.getElementById("gameForm").style.visibility = "hidden";
            timerID = setInterval("movePresentBox()", 250);
        }
    // --></script>
    </head>
    <body>
    <div id="displayScore">0点</div>
    <form id="gameForm">
        <div>
            落下するプレゼントボックスをタッチして回収しよう。<br>
            回転するボックスが傾いていない時にタッチすると高得点。<br>
            赤線に近いほど高得点。でも赤線越えると1点。<br>
            20箱回収すればゲームクリア!<br><br>
            再度ゲームプレイする時はリロードしてください。<br>
        </div>
        <input type="button" value="ゲーム開始" onClick="gameStart()">
    </form>
    <div id="point"></div>
    </body>
</html>