캔버스 스크래치 게임

17797 단어

캔버스 스크래치 게임

  • 사고방식
  • 에 나타난 문제점 요약
  • 코드
  • 사고의 방향


    1. 도면층을 긁은 후 무작위 배경도를 표시하고 마우스 들어올리기 이동 내려놓기 이벤트를 설계한다.신구 픽셀이 합쳐질 때 지워져요.
    ctx.globalCompositeOperation = 'destination-out'
    

    3. 빠르게 이동하면 단점이 생길 수 있으니 양쪽 떨어진 곳을 선으로 연결한다. 4.getImageData라는 방법을 이용하여 안에 있는 데이터를 얻을 수 있다. 데이터에 모든 화소점의 rgba가 포함되어 있어 a라는 속성 값을 판단하고 a가 0인 값의 개수가 일정량에 도달할 때 회색 도층을 모두 제거한다.

    문제점 요약


    1. 단점을 빠르게 이동하는 문제를 해결할 때 폐쇄 경로를 잘 써야 한다. 이것은 원을 먼저 그릴지 선을 먼저 그릴지 순서와 무관하다.캔버스가 가운데에 있는 방법에 대해 캔버스는 블록급 요소가 아닙니다. 가운데에 있는 것을 원한다면 부모급을 추가할 수 있습니다. 텍스트-align:center나 Margin:0 auto를 직접 사용할 수 있습니다. 그러나 이것은 넓이를 설정해야 합니다.addeventListener의 세 번째 매개 변수,false는 거품,true는 포획

    코드

     <style>
            * {
                margin: 0;
                padding: 0;
            }
    
           div{
                /* width: 302px;
                height: 302px; 
                margin: 0 auto; */
                text-align: center;
            }
    
            canvas {
                border: 1px solid #000;
                background-size: 100% 100%;
    
            }
        </style>
    </head>
    
    <body>
        <div>
            <canvas width="300" height="300" id="myCanvas"></canvas>
        </div>
        <script>
            var myCanvas = document.getElementById('myCanvas');
            //  ( jq $, getContext dom )
            var ctx = myCanvas.getContext('2d');
            var lastX, lastY, nowX, nowY;
    
            init();
    
            function init() {
                ctx.fillStyle = '#ccc';
                ctx.fillRect(0, 0, 300, 300);
    
                var oImg = new Image();
                var r = Math.random();
                oImg.src = r < 0.5 ? './img/duidui01.jpg' : './img/duidui02.jpg';
                oImg.onload = function () {
                    myCanvas.style.backgroundImage = 'url(' + oImg.src + ')';
                    ctx.globalCompositeOperation = 'destination-out';
                    document.addEventListener('mousedown', downFun, false);
                }
    
                function downFun(e) {
                    var lastX = e.clientX - myCanvas.offsetLeft;
                    var lastY = e.clientY - myCanvas.offsetTop;
                    document.addEventListener('mousemove', moveFun, false);
                    document.addEventListener('mouseup', upFun, false);
                }
    
                function moveFun(e) {
                    var nowX = e.clientX - myCanvas.offsetLeft;
                    var nowY = e.clientY - myCanvas.offsetTop;
                    //  
                    ctx.beginPath();
                    ctx.fillStyle = 'red';
                    ctx.arc(nowX, nowY, 20, 0, Math.PI * 2, 0);
                    ctx.fill();
    
                    ctx.beginPath();
                    ctx.lineWidth = '40';
                    ctx.moveTo(lastX, lastY);
                    ctx.lineTo(nowX, nowY);
                    ctx.stroke();
    
                    lastX = nowX;
                    lastY = nowY;
                }
    
                function upFun() {
                    document.removeEventListener('mousemove', moveFun, false);
                    clearAll();
                }
    
                //  0.8 
                function clearAll() {
                    var d = ctx.getImageData(0, 0, 300, 300);
                    var len = d.data.length;
                    var num = 0;
                    for (i = 0; i < len; i += 4) {
                        if (d.data[i] == 0) {
                            num++;
                        }
                    }
    
                    if (num > 300 * 300 * 0.8) {
                        ctx.clearRect(0, 0, 300, 300);
                    }
                }
            }
    
        </script>
    </body>
    

    좋은 웹페이지 즐겨찾기