サンプル ゲームコントローラ - ソースコード

説明

 「crocro.jscam」は、クロノス・クラウンの柳井政和が開発しているJavaScirptのライブラリです。「crocro.jscam」を使うと、JavaScriptからWebカメラを扱うことができます。また、簡単な図形認識などを行えます。

 このページでは、この「crocro.jscam」のサンプルである「サンプル ゲームコントローラ」のソースコードを掲載します。

ソースコード

以下、ソースコードです。

<!DOCTYPE html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>「crocro.jscam」 - サンプル ゲームコントローラ - クロノス・クラウン</title>
    <script
        type="text/javascript"
        src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"
    ></script>
    <script type="text/javascript" src="jscam.js"></script>
    <script language="javascript">
        // 変数
        var cap;

        // 起動時処理
        $(document).ready(function() {
            // JSカメラ初期化
            crocro.jscam.initSwfCam();
            crocro.jscam.setFilter(["bin", "label", "detectMarker", "drawMarker"]);
            cap = crocro.jscam.makeCaptureObject("cnvsCap");

            // コールバックの設定
            cap.setBackDataType(["markerData"]);

            // マーカーの設定
            viewMarker();

            crocro.jscam.ready(function() { // 準備ができたら開始
                cntrl();    // コントロール
            });
        });

        // 画像取得
        function cntrl() {
            cap.capture(function(resObj){   // 各戻り値ごとの処理
                var resArr = [];
                if ("markerData" in resObj) {
                    // 出力
                    var s = "";
                    var md = resObj.markerData;
                    $.each(md, function(k, v) {s += k + ":" + v + ", "});
                    s += "<br>"
                    s += "lt(" + md.ltX + ", " + md.ltY + ") / "
                        + "rt(" + md.rtX + ", " + md.rtY + ")<br>";
                    s += "lb(" + md.lbX + ", " + md.lbY + ") / "
                        + "rb(" + md.rbX + ", " + md.rbY + ")";
                    resArr.push("<hr>markerData : " + s);

                    // 中心からのコーン
                    var ctx = cap.cntxtObj;     // 2Dコンテクストを取得
                    ctx.clearRect(0, 0, cap.w, cap.h);
                    drawLine(ctx, "#ff0000", 3, [
                         [md.ltX, md.ltY]
                        ,[md.rtX, md.rtY]
                        ,[md.rbX, md.rbY]
                        ,[md.lbX, md.lbY]
                    ]);
                    drawLine(ctx, "#ff0000", 3, [
                         [md.ltX - 2, md.ltY - 2]
                        ,[md.ltX + 2, md.ltY - 2]
                        ,[md.ltX + 2, md.ltY + 2]
                        ,[md.ltX - 2, md.ltY + 2]
                    ]);

                    drawLine(ctx, "#8f0000", 1, [
                         [cap.w / 2, cap.h / 2]
                        ,[md.ltX, md.ltY]
                    ]);
                    drawLine(ctx, "#8f0000", 1, [
                         [cap.w / 2, cap.h / 2]
                        ,[md.rtX, md.rtY]
                    ]);
                    drawLine(ctx, "#8f0000", 1, [
                         [cap.w / 2, cap.h / 2]
                        ,[md.rbX, md.rbY]
                    ]);
                    drawLine(ctx, "#8f0000", 1, [
                         [cap.w / 2, cap.h / 2]
                        ,[md.lbX, md.lbY]
                    ]);

                    // 傾きと大きさ
                    var cntrX = (md.ltX + md.rtX + md.rbX + md.lbX) / 4;
                    var cntrY = (md.ltY + md.rtY + md.rbY + md.lbY) / 4;
                    var dirX = ((md.ltX + md.rtX) / 2 - cntrX);
                    var dirY = ((md.ltY + md.rtY) / 2 - cntrY);

                    drawLine(ctx, "#0000ff", 5, [
                         [cap.w / 2, cap.h / 2]
                        ,[cap.w / 2 + dirX, cap.h / 2 + dirY]
                    ]);
                }
                $("#resData").html(resArr.join("<br>"));
            });
            setTimeout(cntrl, 50);
        }

        // 線描画
        function drawLine(ctx, col, width, arr) {
            ctx.strokeStyle = col;
            ctx.lineWidth = width;
            ctx.beginPath();
            ctx.moveTo(arr[0][0], arr[0][1]);
            for (var i = 1; i < arr.length; i ++) {
                ctx.lineTo(arr[i][0], arr[i][1]);
            }
            ctx.lineTo(arr[0][0], arr[0][1]);
            ctx.closePath();
            ctx.stroke();
        }

        // キャプチャ
        function captureImg() {
            cap.capture();      // キャプチャ
        }

        // マーカー設定
        var mrkrArr = crocro.jscam.util.swapXY(16, 16, [
            [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
            [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
            [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
            [1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
            [1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1],
            [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
            [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
            [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
        ]);

        // マーカー表示
        function viewMarker() {
            // マーカーの作成
            crocro.jscam.util.makeMarker("marker", mrkrArr, 13, true,
                function(x, y, prm){
                    mrkrArr[x][y] = prm;
                    crocro.jscam.setMarker(mrkrArr);
                }
            );
        }
    </script>
</head>
<body bgcolor="#ffffff">

    <div id="jscamAS" class="boxOut">
        <table border=0><tr><td valign="top">
            <script language="javascript">
                crocro.jscam.write();
            </script>
        </td><td valign="top" style="padding-left: 32px;">
            ●マーカー形式<br>
            <br>
            <div id="marker"></div>
        </td></tr></table>
    </div>
    <div id="jscamJS" style="">
        <table border=0><tr><td valign="top">
            <canvas id="cnvsCap" width="320" height="240"></canvas>
        </td><td valign="top">
            <div id="resData"></div>
        </td></tr></table>
    </div>

</body>
</html>
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について