上からタイルを選択し、そのタイルを下のキャンバス領域に「スタンプ」できる「タイルスタンパー」アプリケーションを作成しようとしました。基本的に、これはHTML5ゲームのマップエディターと考えることができます。
選択とスタンプを除いてすべてが機能しています:http://www.exeneva.com/html5/tileStamper
JSエラーコンソールには、イベントリスナーが正しくないと表示されますが、それらが有効であると100%確信しています。
// Event listeners
theCanvas.addEventListener("mousemove", onMouseMove, false);
theCanvas.addEventListener("click", onMouseClick, false);
これが私のマウスの動きとマウスクリック処理コードです:
function onMouseMove(e) {
// Accounts for the canvas not being at the top left of screen
mouseX = e.clientX - theCanvas.offsetLeft;
mouseY = e.clientY - theCanvas.offsetTop;
}
function onMouseClick(e) {
console.log("click: " + mouseX + "," + mouseY);
if (mouseY < 128) {
// Find tile to highlight
var totalRows = 7; // 8 total rows, but relative zero means we use 7
var col = Math.floor(mouseX / tileLength);
var row = Math.floor(mouseY / tileLength);
var tileId = (row * totalRows) + (col + row);
highlightTile(tileId, col * tileLength, row * tileLength);
} else {
// stamp the selected tile
var col = Math.floor(mouseX / tileLength);
var row = Math.floor(mouseY / tileLength);
context.putImageData(imageData, col * tileLength, row * tileLength);
}
}
タイルの強調表示コードは次のとおりです。
function highlightTile(tileId, x, y) {
// redraw tilesheet and highlight selected tile
context.fillStyle = "#aaaaaa";
context.fillRect(0, 0, 256, 128);
drawTileSheet();
imageData = context.getImageData(x, y, 32, 32);
// set alpha to 128
for (j = 3; j < imageData.data.length; j += 4) {
imageData.data[j] = 128;
}
// draw red line around selected tile
var startX = Math.floor(tileId % 8) * 32;
var startY = Math.floor(tileId / 8) * 32;
context.strokeStyle = "red";
context.strokeRect(startX, startY, 32, 32);
}
誰かがこれが機能しない理由を理解するのを手伝ってもらえますか?