渡一教育公开课web前端开发JavaScript精英课学习笔记(二十六)JavaScript 打砖块

打砖块

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>打砖块</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container {
            position: relative;
            margin: 0 auto;
            width: 300px;
            height: 500px;
            background-color: black;
        }

        .board {
            position: absolute;
            border-radius: 5px;
            background-color: white;
        }

        .ball {
            position: absolute;
            border-radius: 50%;
            background-color: red;
            left: 145px;
            bottom: 100px;
        }

        .brick {
            position: absolute;
            background-color: yellow;
            border: 1px solid green;
            box-sizing: border-box;
        }

        button {
            display: block;
            margin: 0 auto;
            width: 300px;
        }
    </style>
</head>

<body>

    <button>开始</button>
    <div class="container">

    </div>

</body>
<script>

    (function () {
        var paras = {
            boardWidth: 100,
            boardHeight: 10,
            boardBottom: 20,
            ballRadius: 5,
            brickWidth: 10,
            speedX: 1,
            speedY: -1,
        }
        var container = document.getElementsByClassName('container')[0];
        var board = document.createElement('div');
        var ball = document.createElement('div');
        var bricksInfo = { topMin: 4, topMax: 28, leftMin: 4, leftMax: 25, color: 'yellow' };
        var brickArr = [];
        var timer;


        init();

        function init() {
            initBricks();
            initBoard();
            initBall();
            var btn = document.getElementsByTagName('button')[0];
            btn.onclick = function () {
                if (btn.innerText.indexOf('开始') >= 0) {
                    run();
                    btn.innerText = "暂停";
                } else {
                    clearInterval(timer);
                    btn.innerText = "开始";
                }
            }
        }

        // 初始化砖块
        function initBricks() {
            for (var i = 0; i <= (bricksInfo.topMax); i++) {
                brickArr[i] = [];
                for (var j = 0; j <= bricksInfo.leftMax; j++) {
                    brickArr[i][j] = null;
                    if (i >= bricksInfo.topMin && j >= bricksInfo.leftMin && i <= bricksInfo.topMax && j <= bricksInfo.leftMax) {
                        var brick = document.createElement('div');
                        brick.className = 'brick';
                        brick.style.width = paras.brickWidth + 'px';
                        brick.style.height = paras.brickWidth + 'px';
                        brick.style.left = paras.brickWidth * j + 'px';
                        brick.style.top = paras.brickWidth * i + 'px';
                        container.appendChild(brick);
                        brickArr[i][j] = brick;

                    }
                }
            }
        }
        function initBoard() {
            board.className = 'board';
            board.style.width = paras.boardWidth + 'px';
            board.style.height = paras.boardHeight + 'px';
            board.style.bottom = paras.boardBottom + 'px';
            board.style.left = ((container.offsetWidth - paras.boardWidth) / 2) + 'px';
            container.appendChild(board);
            document.onmousedown = function (ev) {
                var lastX = ev.clientX;
                document.onmousemove = function (ev) {
                    var left = board.offsetLeft + ev.clientX - lastX;
                    left = left < 0 ? 0 : left;
                    left = left > container.offsetWidth - board.offsetWidth ? container.offsetWidth - board.offsetWidth : left;

                    board.style.left = left + 'px';
                    lastX = ev.clientX;
                }
                document.onmouseup = function (ev) {
                    document.onmousemove = null;
                }
            }
        }

        function initBall() {
            ball.className = 'ball';
            ball.style.width = paras.ballRadius * 2 + 'px';
            ball.style.height = paras.ballRadius * 2 + 'px';
            container.appendChild(ball);
        }

        function run() {
            timer = setInterval(function () {
                // 判断小球是否超出左右边框
                if (ball.offsetLeft <= 0 || ball.offsetLeft >= container.offsetWidth - ball.offsetWidth) {
                    paras.speedX *= -1;
                }
                // 判断小球是否超出上边框
                if (ball.offsetTop <= 0) {
                    paras.speedY *= -1;
                }
                // 判断小球是否超出下边框
                if (ball.offsetTop >= container.offsetHeight - ball.offsetHeight) {
                    //    游戏失败
                    paras.speedY *= -1;
                }
                // 判断小球是否落在托板的范围内
                if (ball.offsetTop >= board.offsetTop - ball.offsetHeight && ball.offsetLeft >= board.offsetLeft && ball.offsetLeft + ball.offsetWidth <= board.offsetLeft + board.offsetWidth && paras.speedY > 0) {
                    paras.speedY *= -1;
                }
                ball.style.left = (ball.offsetLeft + paras.speedX) + 'px';
                ball.style.top = (ball.offsetTop + paras.speedY) + 'px';
                // 检查是否与砖块碰撞,及碰撞角度
                checkBump();
            }, 1)
        }


        function checkBump() {

            // 判断小球的运动方向 0 右上 1 右下 2 左下 3 左上
            // 以小球最前面的角的坐标为参考点
            var direction = 0;
            if (paras.speedX > 0) {
                if (paras.speedY > 0) {
                    direction = 1;
                } else {
                    direction = 0;
                }
            } else {
                if (paras.speedY > 0) {
                    direction = 2;
                } else {
                    direction = 3;
                }
            }
            var brickIndexX,brickIndexY,ballX,ballY ;
            // 小球圆心作为参考点
            ballX =  ball.offsetTop + ball.offsetWidth /2 ;
            ballY =  ball.offsetLeft  + ball.offsetWidth /2  ;

            // switch (direction) {
            //     case 0:
            //         ballX = ball.offsetTop;
            //         ballY = ball.offsetLeft + ball.offsetWidth;
            //         break;
            //     case 1:
            //     ballX =  ball.offsetTop + ball.offsetHeight ;
            //     ballY =  ball.offsetLeft + ball.offsetWidth ;

            //         break;
            //     case 2:
            //     ballX =  ball.offsetTop + ball.offsetHeight ;
            //     ballY =  ball.offsetLeft ;
            //         break;
            //     case 3:
            //          ballX =  ball.offsetTop ;
            //          ballY =  ball.offsetLeft ;
            //         break;
            // }
            // 计算小球所在位置的砖块数组索引值
            brickIndexX = Math.floor(ballX / 10);
            brickIndexY = Math.floor(ballY / 10);


            //判断小球当前位置是否有砖块
            if (brickIndexX <= bricksInfo.topMax && brickIndexY <= bricksInfo.leftMax) {
                if (brickArr[brickIndexX][brickIndexY] != null) {
                    // 该位置有砖块则进行反弹,并移除砖块
                    // 判断小球撞击砖块的那条边
                    var x = ballX - brickIndexX * 10 - 5;
                    var y = ballY - brickIndexY * 10 - 5;
                    console.log(x,y);
                    if( x > 0){
                        if(y > 0){
                            // 撞击右下角
                            if(Math.abs(y) > Math.abs(x)){
                                paras.speedY *= -1;
                            }else{
                                paras.speedX *= -1;
                            }

                        }else{
                            // 撞击右上角
                            if(Math.abs(y) > Math.abs(x)){
                                paras.speedY *= -1;
                            }else{
                                paras.speedX *= -1;
                            }

                        }
                    }else{
                        if(y > 0){
                            // 撞击左下角
                            if(Math.abs(y) > Math.abs(x)){
                                paras.speedY *= -1;
                            }else{
                                paras.speedX *= -1;
                            }

                        }else{
                            // 撞击左上角
                            if(Math.abs(y) > Math.abs(x)){
                                paras.speedY *= -1;
                            }else{
                                paras.speedX *= -1;
                            }

                        }
                    }
                    container.removeChild(brickArr[brickIndexX][brickIndexY]);
                    brickArr[brickIndexX][brickIndexY] = null;
                }


            }

        }

    })();



</script>

</html>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值