サンプル ゲームコントローラ - ソースコード
説明
「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>







