jQuery-demo-plane

jq-飞机demo

<style>
        .container {
            width: 500px;
            position: relative;
            height: 80vh;
            margin: 10vh auto;
            overflow: hidden;
            background: #000;
        }
        .plane {
            width: 120px;
            height: 80px;
            background: url(./plane.png) 0 / 100% 100%;
            position: absolute;
            left: calc(50% - 40px);
            bottom: 20px;
        }
        .bullet {
            width: 8px;
            height: 22px;
            background: #ff0;
            position: absolute;
            border-radius: 10px 10px 0 0;
            box-shadow: 0 5px 5px rgb(9, 95, 35);
        }
        .enemy {
            width: 80px;
            height: 50px;
            background: url(./plane.png) 0 / 100% 100%;
            position: absolute;
            top: 0;
        }

        .score {
            position: absolute;
            color: red;
            top: 0px;
            left: 50%;
            transform: translateX(-50%);
        }
    </style>
    
     <h1 class="score">0</h1>
    <div class="container">
        <div class="plane"></div>
    </div>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        $(function () {
            let score = 0
            let maxLeft = $('.container').innerWidth() - $('.plane').innerWidth()
            let maxTop = $('.container').innerHeight() - $('.plane').innerHeight()

            $(window).keydown(function ({ keyCode }) {
                // console.log(keyCode);
                let { top: t, left: l } = $('.plane').position()
                switch (keyCode) {
                    case 87:
                        t -= 10
                        break;
                    case 83:
                        t += 10
                        break;
                    case 65:
                        l -= 10
                        break;
                    case 68:
                        l += 10
                        break;
                    case 74:
                        shoot()
                        break;
                    default:
                        break;
                }

                if (l < 0) l = 0
                if (t < 0) t = 0
                if (l > maxLeft) l = maxLeft
                if (t > maxTop) t = maxTop

                $('.plane').css('top', t).css('left', l)
            })

            let entTime = new Date()
            function shoot() {
                if (new Date() - entTime < 500) return;
                let bullet = $('<div/>').addClass('bullet')
                $('.container').append(bullet)
                bullet.css('top', $('.plane').position().top - 20)
                bullet.css('left', $('.plane').position().left + $('.plane').innerWidth() / 2 - bullet.innerWidth() / 2)
                entTime = new Date()
            }

            setInterval(() => {
                $('.bullet').each(function () {
                    let bullet = $(this)
                    let { top } = bullet.position()
                    if (top < 0) bullet.remove()
                    else bullet.css('top', bullet.position().top - 10)
                })
            }, 100);

            setInterval(() => {

                $('.enemy').each(function () {
                    let enemy = this

                    if (calc(enemy, $('.plane').get(0)) || calc($('.plane').get(0), enemy)) {
                        console.log('GG');
                        location.reload()
                    }

                    $('.bullet').each(function () {
                        let bullet = this
                        if (calc(enemy, bullet) || calc(bullet, enemy)) {
                            bullet.remove()
                            enemy.remove()
                            score += 10
                            $('.score').text(score)
                        }
                    })
                })

            }, 50);

            setInterval(() => {
                let enemy = $('<div/>').addClass('enemy')
                $('.container').append(enemy)
                enemy.css('left', Math.round(Math.random() * ($('.container').innerWidth() - enemy.innerWidth())))
            }, 2000);

            setInterval(() => {
                $('.enemy').each(function () {
                    let enemy = $(this)
                    let { top } = enemy.position()
                    if (top > $('.container').innerHeight()) enemy.remove()
                    else enemy.css('top', enemy.position().top + 20)
                })
            }, 200);

            function getLTRB(node) {
                return {
                    l: node.offsetLeft,
                    t: node.offsetTop,
                    r: node.offsetLeft + node.offsetWidth,
                    b: node.offsetTop + node.offsetHeight
                }
            }

            function calc(a, b) {
                a = getLTRB(a)
                b = getLTRB(b)

                if (b.l > a.l && b.l < a.r && b.t > a.t && b.t < a.b) return true
                else if (b.l > a.l && b.l < a.r && b.b > a.t && b.b < a.b) return true
                else if (b.r > a.l && b.r < a.r && b.b > a.t && b.b < a.b) return true
                else if (b.r > a.l && b.r < a.r && b.t > a.t && b.t < a.b) return true
                else return false
            }



        })
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值