/* HTML5 Canvas で drag&drop その2 * ドラッグ中のみ、dtest2.mspfで指定した間隔でCanvas更新 */ var dtest2 = {}; // namespace (function($) { /* 定数 */ dtest2.con = { id: { // id名 cvm: 'cv2', // main Canvas cvdiv: 'cvdiv2', // main Canvasのdiv msgdiv: 'msg2', // メッセージ表示div stbtn: 'stbtn2' // スタートボタン }, msg: { // 表示メッセージ candr: 'ドラッグできます', dring: 'ドラッグ中', leave: 'ポインタがCanvasから外れたので
ドロップしました', pushb: 'スタートボタンを押してください' }, btnmsg: { // ボタン表示メッセージ start: 'スタート', stop: 'ストップ' }, dtype: { // 図形のタイプ cir: 'circle', // 円 tri: 'triangle', // 三角形 squ: 'square' // 正方形 } }; /* グローバル変数 */ // drag状態 dtest2.drag = { now: false, // ドラッグ状態ならtrue item: null // ドラッグしているアイテムのitemArのindex }; dtest2.gamestart = false; // 実行中ならtrue dtest2.timeoutID; // タイマー用ID var fps = 24; // 1秒あたりのフレーム数 dtest2.mspf = 1000 / fps; // フレーム表示間隔(ミリ秒) /* スタートボタンを押した場合の処理 * return なし */ dtest2.start = function() { var $cvdiv = $('#' + dtest2.con.id.cvdiv); // main Canvasのdiv var $btn = $('#' + dtest2.con.id.stbtn); // スタートボタン if (!dtest2.gamestart) { // 停止中の場合 // canvasにイベント付与 $cvdiv.mousedown(dtest2.cvmsDown); $cvdiv.mouseup(dtest2.cvmsUp); $cvdiv.mouseleave(dtest2.cvmsUp); $cvdiv.mousemove(dtest2.cvmsMove); // canvas初期化 dtest2.DRAG.init(); dtest2.DRAG.draw(); dtest2.gamestart = true; dtest2.showmsg(dtest2.con.msg.candr); $btn.text(dtest2.con.btnmsg.stop); } else { // 実行中の場合 // 画面更新停止 if (dtest2.timeoutID) { window.clearInterval(dtest2.timeoutID); } // イベント削除 $cvdiv.unbind('mousedown', dtest2.cvmsDown); $cvdiv.unbind('mouseup', dtest2.cvmsUp); $cvdiv.unbind('mouseleave', dtest2.cvmsUp); $cvdiv.unbind('mousemove', dtest2.cvmsMove); dtest2.gamestart = false; dtest2.showmsg(dtest2.con.msg.pushb); $btn.text(dtest2.con.btnmsg.start); } }; /* 画面更新 * return なし */ dtest2.update = function() { if (dtest2.drag.now) { dtest2.DRAG.draw(); } }; /* メッセージ表示 * {string} msg 表示するメッセージ * return なし */ dtest2.showmsg = function(msg) { $('#' + dtest2.con.id.msgdiv).html(msg); }; /* Canvasでmousedown時に行われる処理 * {event} evt イベントオブジェクト * return なし */ dtest2.cvmsDown = function(evt) { if (!dtest2.drag.now) { // ポインタ座標をCanvas座標へ変換 var cx = evt.pageX - dtest2.DRAG.cvpos.x; var cy = evt.pageY - dtest2.DRAG.cvpos.y; // ポインタ座標内にドラッグ可能なアイテムがあるかチェック var itemIdx = dtest2.DRAG.checkItem(cx, cy); if (itemIdx != null) { // 一定時間ごとに画面更新 dtest2.timeoutID = window.setInterval("dtest2.update()", dtest2.mspf); dtest2.drag.now = true; dtest2.drag.item = itemIdx; dtest2.showmsg(dtest2.con.msg.dring); } } return false; }; /* Canvasでmouseup/mouseleave時に行われる処理 * {event} evt イベントオブジェクト * return なし */ dtest2.cvmsUp = function(evt) { if (dtest2.drag.now) { // ポインタ座標をCanvas座標へ変換 var cx = evt.pageX - dtest2.DRAG.cvpos.x; var cy = evt.pageY - dtest2.DRAG.cvpos.y; if (cx < 0) cx = 0; if (cx > dtest2.DRAG.area.w) cx = dtest2.DRAG.area.w; if (cy < 0) cy = 0; if (cy > dtest2.DRAG.area.h) cy = dtest2.DRAG.area.h; // 画面更新停止 if (dtest2.timeoutID) { window.clearInterval(dtest2.timeoutID); } // アイテムの座標をグリッドの中央にセット dtest2.DRAG.setCenter(dtest2.drag.item, cx, cy); // 画面更新 dtest2.DRAG.draw(); dtest2.drag.now = false; dtest2.drag.item = null; if (evt.type == 'mouseleave'){ dtest2.showmsg(dtest2.con.msg.leave); } else if (dtest2.gamestart) { dtest2.showmsg(dtest2.con.msg.candr); } } }; /* Canvasでmousemove時に行われる処理 * {event} evt イベントオブジェクト * return なし */ dtest2.cvmsMove = function(evt) { if (dtest2.drag.now) { // ポインタ座標をCanvas座標へ変換 var cx = evt.pageX - dtest2.DRAG.cvpos.x; var cy = evt.pageY - dtest2.DRAG.cvpos.y; // アイテムの座標更新 dtest2.DRAG.itemAr[dtest2.drag.item].x = cx; dtest2.DRAG.itemAr[dtest2.drag.item].y = cy; } return false; }; /* body onload時の処理 */ $(window).load(function() { // canvasのDOM elementとcontext取得 var canvas = document.getElementById(dtest2.con.id.cvm); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext("2d"); ctx.lineWidth = 1; ctx.globalAlpha = 0.7; ctx.globalCompositeOperation = "source-over"; // 画面表示 dtest2.DRAG = new dtcom.canv(ctx, canvas.width, canvas.height, dtest2); dtest2.DRAG.init(); dtest2.DRAG.draw(); // イベント付与 // ドラッグ中にボタンが押されることを防ぐため、 // clickではなくmousedownイベントを付与 var $btn = $('#' + dtest2.con.id.stbtn); // スタートボタン $btn.mousedown(dtest2.start); $btn.text(dtest2.con.btnmsg.start); // メッセージ表示 dtest2.showmsg(dtest2.con.msg.pushb); }); })(jQuery);