【问题标题】:Move canvas position in HTML5 puzzle game在 HTML5 益智游戏中移动画布位置
【发布时间】:2015-08-26 04:58:44
【问题描述】:

我已经下载了一个现成的 HTML5 tile-swapping puzzle,但我不知道如何更改画布位置。 如果我们通过给 body 留出一个边距来改变画布的位置,那么这个拼图就不起作用了。我想将拼图与页面中间对齐。

这是一个带有拼图代码的 JSFiddle:

https://jsfiddle.net/kilobyte/0ej6cv6w/

这是您应该检查的代码的摘录,我正在更改边距:

function Add(){
    alert("Congratulation...! You have Won...!!");
        var btn=document.createElement("input");
        btn.type="button";
        btn.id="mybutton";
        btn.value="Submit";
        btn.style.width="100px";
        btn.style.height="50px";
        btn.style.background="green";
        btn.style.margin="100px";
        document.body.appendChild(btn);
        var buttonid =document.getElementById("mybutton");
        buttonid.addEventListener('click', ButtonClick,false);
    }
    function gameOver(){
        document.onmousedown = null;
        document.onmousemove = null;
        document.onmouseup = null;
        Add();  
    //initPuzzle();
    }

【问题讨论】:

    标签: javascript css html canvas


    【解决方案1】:

    编辑:好的,似乎 Firefox 可以工作,但 chrome 有不同的行为。我不打算重写游戏,但我可以告诉你该怎么做。您需要编辑名为onPuzzleClick() 的函数,它位于代码的第103 行。这就是设置点击位置的地方(_mouse.x_mouse.y)。您需要找出 chrome 的不同之处并在那里设置正确的位置,id 建议查看左边距和上边距或某个绝对位置或类似位置

    【讨论】:

    • 是的,画布可以工作,但只在左上角......改变它的位置它不会工作......为了尝试改变图像(200x200像素)
    • 拼图只在左上角而不是其他位置工作......是的,画布工作但只在左上角......改变它的位置它不会工作...... ...出于尝试目的,您更改图像(200x200 像素)或任何小图像.....之后将 css 应用于画布并将其移动到您想要的特定位置,除了左上角,您会看到它不起作用.. ..
    • 如果我在页面上的任何位置移动拼图它应该可以工作....请有人帮我解决这个问题......
    • 如果您将 text-align:center 放在环绕元素(在本例中为主体)上,画布将使其位置居中并仍按预期工作。你能建立一个不起作用的例子吗?例如使用 JSFiddle
    • 好吧,确定我刚刚解决了这个难题。我没有得到你所说的行为,它在 Firefox 40.0.2 中工作正常
    【解决方案2】:

    您在问题中引用的代码实际上并没有改变画布的边距。它在游戏结束时为按钮分配边距。但不要介意。在下面的演示中,我删除了不必要的按钮,并使用 CSS 设置了画布边距。

    我们可以借助一个计算 HTML 元素相对于包含它的 HTML 元素的偏移量的函数来解决移位画布的问题:

    function getOffset(element, ancestor) {
      var left = 0,
          top = 0;
      while (element != ancestor) {
        left += element.offsetLeft;
        top += element.offsetTop;
        element = element.parentNode;
      }
      return { left: left, top: top };
    }
    

    我们还需要一个函数来计算鼠标相对于页面左上角的位置:

    function getMousePosition (event) {
      event = event || window.event;
      if (event.pageX) {
        return { x: event.pageX, y: event.pageY };
      }
      return {
        x: event.clientX + document.body.scrollLeft +
            document.documentElement.scrollLeft,
        y: event.clientY + document.body.scrollTop +
            document.documentElement.scrollTop
      };
    }
    

    setCanvas()中,我们计算并保存画布相对于页面的偏移量:

    _canvas.offset = getOffset(_canvas, document.body);
    

    随后,当我们需要onPuzzleClick()updatePuzzle()中的鼠标坐标时,我们将画布偏移量考虑在内:

    var position = getMousePosition(e);
    _mouse.x = position.x - _canvas.offset.left;
    _mouse.y = position.y - _canvas.offset.top;
    

    现在无论画布放置在哪里,拼图都能正常工作:

    const PUZZLE_DIFFICULTY = 4;
    const PUZZLE_HOVER_TINT = '#009900';
    
    var _canvas;
    var _stage;
    var _img;
    var _pieces;
    var _puzzleWidth;
    var _puzzleHeight;
    var _pieceWidth;
    var _pieceHeight;
    var _currentPiece;
    var _currentDropPiece;
    var _mouse;
    
    function getOffset(element, ancestor) {
      var left = 0,
          top = 0;
      while (element != ancestor) {
        left += element.offsetLeft;
        top += element.offsetTop;
        element = element.parentNode;
      }
      return { left: left, top: top };
    }
    
    function getMousePosition (event) {
      event = event || window.event;
      if (event.pageX) {
        return { x: event.pageX, y: event.pageY };
      }
      return {
        x: event.clientX + document.body.scrollLeft +
            document.documentElement.scrollLeft,
        y: event.clientY + document.body.scrollTop +
            document.documentElement.scrollTop
      };
    }
    
    function init(){
        _img = new Image();
        _img.addEventListener('load',onImage,false);
        _img.src = "http://www.justvape247.com/ekmps/shops/justvape247/images/red-apple-natural-f.w-16946-p.jpg";
    }
    
    function onImage(e){
        _pieceWidth = Math.floor(_img.width / PUZZLE_DIFFICULTY)
        _pieceHeight = Math.floor(_img.height / PUZZLE_DIFFICULTY)
        _puzzleWidth = _pieceWidth * PUZZLE_DIFFICULTY;
        _puzzleHeight = _pieceHeight * PUZZLE_DIFFICULTY;
        setCanvas();
        initPuzzle();
    }
    
    function setCanvas(){
        _canvas = document.getElementById('gameCanvas');
        _stage = _canvas.getContext('2d');
        _canvas.width = _puzzleWidth;
        _canvas.height = _puzzleHeight;
        _canvas.style.border = "1px solid black";
        _canvas.offset = getOffset(_canvas, document.body);
    }
    
    function initPuzzle(){
        _pieces = [];
        _mouse = {x:0,y:0};
        _currentPiece = null;
        _currentDropPiece = null;
        _stage.drawImage(_img, 0, 0, _puzzleWidth, _puzzleHeight, 0, 0, _puzzleWidth, _puzzleHeight);
        createTitle("Click to Start Puzzle");
        buildPieces();
    }
    
    function createTitle(msg){
        _stage.fillStyle = "#000000";
        _stage.globalAlpha = .4;
        _stage.fillRect(100,_puzzleHeight - 40,_puzzleWidth - 200,40);
        _stage.fillStyle = "#FFFFFF";//text color
        _stage.globalAlpha = 1;
        _stage.textAlign = "center";
        _stage.textBaseline = "middle";
        _stage.font = "20px Arial";
        _stage.fillText(msg,_puzzleWidth / 2,_puzzleHeight - 20);
    }
    
    function buildPieces(){
        var i;
        var piece;
        var xPos = 0;
        var yPos = 0;
        for(i = 0;i < PUZZLE_DIFFICULTY * PUZZLE_DIFFICULTY;i++){
            piece = {};
            piece.sx = xPos;
            piece.sy = yPos;
            _pieces.push(piece);
            xPos += _pieceWidth;
            if(xPos >= _puzzleWidth){
                xPos = 0;
                yPos += _pieceHeight;
            }
        }
        document.onmousedown = shufflePuzzle;
    }
    
    function shufflePuzzle(){
        _pieces = shuffleArray(_pieces);
        _stage.clearRect(0,0,_puzzleWidth,_puzzleHeight);
        var i;
        var piece;
        var xPos = 0;
        var yPos = 0;
        for(i = 0;i < _pieces.length;i++){
            piece = _pieces[i];
            piece.xPos = xPos;
            piece.yPos = yPos;
            _stage.drawImage(_img, piece.sx, piece.sy, _pieceWidth, _pieceHeight, xPos, yPos, _pieceWidth, _pieceHeight);
            _stage.strokeRect(xPos, yPos, _pieceWidth,_pieceHeight);
            xPos += _pieceWidth;
            if(xPos >= _puzzleWidth){
                xPos = 0;
                yPos += _pieceHeight;
            }
        }
        document.onmousedown = onPuzzleClick;
    }
    
    function shuffleArray(o){
        for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
        return o;
    }
    
    function onPuzzleClick(e){
        var position = getMousePosition(e);
        _mouse.x = position.x - _canvas.offset.left;
        _mouse.y = position.y - _canvas.offset.top;
        _currentPiece = checkPieceClicked();
        if(_currentPiece != null){
            _stage.clearRect(_currentPiece.xPos,_currentPiece.yPos,_pieceWidth,_pieceHeight);
            _stage.save();
            _stage.globalAlpha = .9;
            _stage.drawImage(_img, _currentPiece.sx, _currentPiece.sy, _pieceWidth, _pieceHeight, _mouse.x - (_pieceWidth / 2), _mouse.y - (_pieceHeight / 2), _pieceWidth, _pieceHeight);
            _stage.restore();
            document.onmousemove = updatePuzzle;
            document.onmouseup = pieceDropped;
        }
    }
    
    function checkPieceClicked(){
        var i;
        var piece;
        for(i = 0;i < _pieces.length;i++){
            piece = _pieces[i];
            if(_mouse.x < piece.xPos || _mouse.x > (piece.xPos + _pieceWidth) || _mouse.y < piece.yPos || _mouse.y > (piece.yPos + _pieceHeight)){
                //PIECE NOT HIT
            }
            else{
                return piece;
            }
        }
        return null;
    }
    
    function updatePuzzle(e){
        var position = getMousePosition(e);
        _mouse.x = position.x - _canvas.offset.left;
        _mouse.y = position.y - _canvas.offset.top;
        _currentDropPiece = null;
        _stage.clearRect(0,0,_puzzleWidth,_puzzleHeight);
        var i;
        var piece;
        for(i = 0;i < _pieces.length;i++){
            piece = _pieces[i];
            if(piece == _currentPiece){
                continue;
            }
            _stage.drawImage(_img, piece.sx, piece.sy, _pieceWidth, _pieceHeight, piece.xPos, piece.yPos, _pieceWidth, _pieceHeight);
            _stage.strokeRect(piece.xPos, piece.yPos, _pieceWidth,_pieceHeight);
            if(_currentDropPiece == null){
                if(_mouse.x < piece.xPos || _mouse.x > (piece.xPos + _pieceWidth) || _mouse.y < piece.yPos || _mouse.y > (piece.yPos + _pieceHeight)){
                    //NOT OVER
                }
                else{
                    _currentDropPiece = piece;
                    _stage.save();
                    _stage.globalAlpha = .4;
                    _stage.fillStyle = PUZZLE_HOVER_TINT;
                    _stage.fillRect(_currentDropPiece.xPos,_currentDropPiece.yPos,_pieceWidth, _pieceHeight);
                    _stage.restore();
                }
            }
        }
        _stage.save();
        _stage.globalAlpha = .6;
        _stage.drawImage(_img, _currentPiece.sx, _currentPiece.sy, _pieceWidth, _pieceHeight, _mouse.x - (_pieceWidth / 2), _mouse.y - (_pieceHeight / 2), _pieceWidth, _pieceHeight);
        _stage.restore();
        _stage.strokeRect( _mouse.x - (_pieceWidth / 2), _mouse.y - (_pieceHeight / 2), _pieceWidth,_pieceHeight);
    }
    
    function pieceDropped(e){
        document.onmousemove = null;
        document.onmouseup = null;
        if(_currentDropPiece != null){
            var tmp = {xPos:_currentPiece.xPos,yPos:_currentPiece.yPos};
            _currentPiece.xPos = _currentDropPiece.xPos;
            _currentPiece.yPos = _currentDropPiece.yPos;
            _currentDropPiece.xPos = tmp.xPos;
            _currentDropPiece.yPos = tmp.yPos;
        }
        resetPuzzleAndCheckWin();
    }
    
    function resetPuzzleAndCheckWin(){
        _stage.clearRect(0,0,_puzzleWidth,_puzzleHeight);
        var gameWin = true;
        var i;
        var piece;
        for(i = 0;i < _pieces.length;i++){
            piece = _pieces[i];
            _stage.drawImage(_img, piece.sx, piece.sy, _pieceWidth, _pieceHeight, piece.xPos, piece.yPos, _pieceWidth, _pieceHeight);
            _stage.strokeRect(piece.xPos, piece.yPos, _pieceWidth,_pieceHeight);
            if(piece.xPos != piece.sx || piece.yPos != piece.sy){
                gameWin = false;
            }
        }
        if(gameWin){
            setTimeout(gameOver,500);
        }
    }
    
    function gameOver(){
        document.onmousedown = null;
        document.onmousemove = null;
        document.onmouseup = null;
        alert("Congratulations...! You have Won...!!");
    }
    
    window.onload = init;
    #gameCanvas {
      margin: 20px 50px;
    }
    &lt;canvas id="gameCanvas"&gt;&lt;/canvas&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 2011-12-02
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多