2013-02-10 142 views
0

所以我是Html/Javascript的新手。所以我決定玩弄畫布和展示瓷磚並點擊鼠標。我想要做的是點擊鼠標,然後將用戶點擊的圖塊變爲顏色。問題在於我得到的用戶點擊轉換到平鋪座標上的方式。似乎越往右下方,我越不太準確。畫布座標

<!DOCTYPE html> 

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Fun Canvas!!!</title> 
    <style> 
     canvas 
     { 
      position: relative; 
      padding-left: 0; 
      padding-right: 0; 
      margin-left: auto; 
      margin-right: auto; 
      display: block; 
      border:1px solid #000000; 
      height: 100%; 
      width: 100%; 
     } 
    </style> 
    <script> 
     // Map Related 
     var m_iTotalWidth; 
     var m_iTotalHeight; 
     var m_iMapWidth = 60; 
     var m_iMapHeight = 30; 
     var m_iTileWidth; 
     var m_iTileHeight; 
     var m_bColorFull = new Array(m_iMapWidth); 
     var m_cColors = ['#FF0000', '#FF7700', '#FFFF00', '#00FF00', '#1500FF', '#C700FF']; 
     var m_cDefaultColor = "#000"; 
     var m_CanvaContext; 
     var m_Canvas; 
     var m_iBorderLength = 1; 

     // Map Color related 
     var iMin = 0; 
     var iMax = 255; 
     var m_iPrevX = 0; 
     var m_iPrevY = 0; 

     // GameSpeed 
     var m_iGameSpeed = 60; 

     var m_IntervalID; 
     document.addEventListener("DOMContentLoaded", initialize, false); 
     document.documentElement.style.overflowX = 'hidden';  // horizontal scrollbar will be hidden 
     document.documentElement.style.overflowY = 'hidden'; 

     function initialize() { 
      m_IntervalID = window.setInterval("gameLoop();", m_iGameSpeed); 

      // Get canvas context for drawing 
      m_CanvasContext = document.getElementById("myCanvas").getContext("2d"); 
      setCanvasSize(); 
      m_Canvas = document.getElementById("myCanvas"); 
      document.addEventListener('mousedown', getPosition, false); 

      for (var x = 0; x < m_iMapWidth; x++) { 
       m_bColorFull[x] = new Array(m_iMapHeight); 

       for (var y = 0; y < m_iMapHeight; y++) 
       { 
        if (y == 0) 
         paintTile(x, y, "white", 2); 

        m_bColorFull[x][y] = false; 
       } 
      } 

      drawMap(); 
      gameLoop(); 
     } 

     // Runs all the functions required for the game to work. 
     function gameLoop() { 
      drawMap(); 
     } 

     // Draws everything on the canvas. 
     function drawMap() { 

      for (var x = 0; x < m_iMapWidth; x++) 
       for (var y = 1; y < m_iMapHeight; y++) { 

        if (m_bColorFull[x][y]) 
         paintTile(x, y, getRandomColor(0, 255), 2); 

        else 
         paintTile(x, y, m_cDefaultColor, 2); 
       } 
     } 

     // Paints a tile on the screen, handles converting pixel to tile. 
     function paintTile(x, y, color, borderThickness) 
     { 
      m_CanvasContext.fillStyle = color; 
      m_CanvasContext.fillRect((x * m_iTileWidth) + borderThickness, (y * m_iTileHeight) + borderThickness, m_iTileWidth - (borderThickness * 2), m_iTileHeight - (borderThickness * 2)); 
     } 

     // Handles clicks. 
     function getPosition(event) 
     { 
      var rect = m_Canvas.getBoundingClientRect(); 
      var x = event.clientX - rect.left; 
      var y = event.clientY - rect.top; 
      x = Math.round(x/m_iTileWidth); 
      y = Math.round(y/m_iTileHeight); 

      for (var xIndex = 0; xIndex < m_iMapWidth; xIndex++) 
       for (var yIndex = 0; yIndex < 1; yIndex++) 
        paintTile(xIndex, yIndex, "white", 0); 

      writeMessage(1, "black", x + "-" + y); 
      m_bColorFull[x][y] = !m_bColorFull[x][y]; 
     } 

     // Sets the canvas as big as the broswer size. 
     function setCanvasSize() 
     { 
      m_CanvasContext.scale(1, 1); 
      m_iTileWidth = Math.floor(m_CanvasContext.canvas.width/m_iMapWidth);//Math.floor(window.innerWidth/m_iMapWidth); 
      m_iTileHeight = Math.floor(m_CanvasContext.canvas.height/m_iMapHeight); //Math.floor(window.innerHeight/m_iMapHeight); 
      //m_CanvasContext.canvas.width = (m_iTileWidth * m_iMapWidth); 
      //m_CanvasContext.canvas.height = (m_iTileHeight * m_iMapHeight); 
     } 

     function writeMessage(startTile, color, message) 
     { 
      m_CanvasContext.font = '16pt Calibri'; 
      m_CanvasContext.fillStyle = color; 
      m_CanvasContext.fillText(message, startTile * m_iTileWidth, 16); 
     } 
     /*********************************************************************************************************/ 
     /*USEFULL FUNCTIONS*/ 

     function getRandomColor(iMin, iMax) { 

      //return m_cColors[getRandomNumber(0, m_cColors.length)]; 
      // creating a random number between iMin and iMax 
      var r = getRandomNumber(iMin, iMax) 
      var g = getRandomNumber(iMin, iMax) 
      var b = getRandomNumber(iMin, iMax) 

      // going from decimal to hex 
      var hexR = r.toString(16); 
      var hexG = g.toString(16); 
      var hexB = b.toString(16); 

      // making sure single character values are prepended with a "0" 
      if (hexR.length == 1) 
       hexR = "0" + hexR; 

      if (hexG.length == 1) 
       hexG = "0" + hexG; 

      if (hexB.length == 1) 
       hexB = "0" + hexB; 

      // creating the hex value by concatenatening the string values 
      var hexColor = "#" + hexR + hexG + hexB; 
      return hexColor.toUpperCase(); 
     } 

     function getRandomNumber(iMin, iMax) { 
      return Math.floor((Math.random() * (iMax - iMin)) + iMin); 
     } 
    </script> 
</head> 
<body> 
    <canvas id="myCanvas" width="1000" height="500" style="border:1px solid #000000;"> 
</canvas> 
</body> 
</html> 
+0

我正在做一些非常相似的事情,但我有同樣的問題,這些答案都沒有幫助。我已經從字面上嘗試了一切。 – Kerndog73 2015-02-21 02:55:00

回答

0

我已經這樣做:http://jsfiddle.net/Saturnix/rJD3r/

,並詳細解釋:https://ijosephblog.wordpress.com/2012/05/09/implementing-conways-game-of-life-in-html5-canvas-with-javascript/

有更多的東西給你真正需要的,所以在這裏我做了一個簡單的版本: http://jsfiddle.net/DTMRt/

上面演示的這段代碼將鼠標座標轉換爲數組索引。

var j = Math.floor((g.mouseX/(dim + spacing))); 
var i = Math.floor(g.mouseY/(dim + spacing)); 
grid[j][i] = "mouse is passing over here!"; 

其中dim是瓷磚的尺寸,spacing是瓷磚之間的距離(可以設置爲零),並g.mouseX/g.mouseY是鼠標座標。

你需要所有的瓦片在數組的數組,我這樣做是這樣的:

var grid = new Array(grid_width); 

for (var j = 0; j<grid_width; j++){ 
grid[j] = new Array(grid_height); 
}; 

其中grid_width和grid_height將行和瓷磚的列數。

0

此代碼爲我工作:

update = function(){ 
canvas.onmousedown=function(){ 
var e = window.event; 
var posX = e.clientX; 
var posY = e.clientY; 

警報( 「X位置: 」+ POSX +「 Y位置:」 +波西);`

}; 
setInterval(update,100); 

它爲你工作?