JS实现接掉落块游戏

本文介绍了一款H5小游戏的实现过程,玩家需在规定时间内接住掉落的元素,接住特定元素能增加能量,能量满则游戏成功。游戏失败条件包括能量未满或时间耗尽。文章详细讲解了HTML结构、CSS样式和JavaScript逻辑,包括盒子移动、动态生成图片、倒计时和随机数生成等关键功能,并提供了失败和成功的两种情况展示。
摘要由CSDN通过智能技术生成


前言 : H5小游戏, 在规定时间内, 接掉落块,接到掉落块1,能量减1。接到掉落块2 , 能量加1, 能量满, 游戏成功。 规定时间内,能量条未满或时间到则游戏失败

一、效果

接掉落块
失败效果: 在这里插入图片描述
成功效果图:在这里插入图片描述

二、html结构

1.布局

代码如下(示例):

  <div class="bg">
    </div>
    <div class="date-box">
        <span >10s</span>
    </div>

    <div class="box">
        <img src="./box.jpg" alt="">

    </div>
    <div class="result-box">
        <div class="result-box-img">
            <img src="./gameImg/progress.png" alt="">
        </div>
       
    </div>
    <div class="dialog">
        <div class="img-box">
            <img src="./img2/success.png" alt="">
            <span class="dialog-result"></span>
            <button class="nav-to"></button>
        </div>
    </div>

    <div class="failDialog">
        <div class="img-box">
            <img src="./img2/lose.jpg" alt="">
            <span class="dialog-result"></span>
            <button class="again"></button>
        </div>
    </div>

    <div class="gameOverDialog">
        <div class="img-box">
            <img src="./gameImg/gameOver.png" alt="">
            <span class="dialog-result"></span>
            <button class="back"></button>
        </div>
    </div>

2.样式

代码如下(示例):

  * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        img {
            vertical-align: middle;
            max-width: 100%;
        }

        .bg img,
        .box img {
            width: 100%;
        }

        .bg {
            width: 100%;
            height: 100vh;
            /* background-image: url('./gameImg/bgIMg.jpg'); */
            background-size: 100% 100%;
        }

        .box {
            width: 25vw;
            position: fixed;
            left: 36%;
            bottom: 28vw;
        }

        .el {
            width: 12vw;
            position: fixed;
            pointer-events: none;
        }

        .date-box {
            position: fixed;
            right: 3vw;
            top: 3vw;
            width: 22vw;
        }

        .date-box span {
            position: absolute;
            width: 13vw;
            height: 6vw;
            line-height: 6vw;
            left: 7vw;
            top: 2vw;
            text-align: center;
            color: #d7574f;
            font-size: 8vw;
        }

        .result-box {
            position: absolute;
            left: 4vw;
            top: 194vw;
            width: 92%;
            height: 18vw;

            background-size: 100% 100%;
        }

        .result-box .result-box-img {
            /* width: 18%; */
            position: absolute;
            left: 25.5%;
            bottom: 10%;
            height: 14vw;
            width: 50%;
            overflow: hidden;
        }
        .result-box .result-box-img img{
            height: 14vw;
            width: 100%;
            position: absolute;
        }
        .dialog {
            position: fixed;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            display: none;
            align-items: center;
            justify-content: center;
            background: rgba(0, 0, 0, .6);
        }

        .dialog .img-box {
            width: 70vw;
            position: relative;
        }

        .dialog button {
            position: absolute;
            left: 18vw;
            top: 87vw;
            border: none;
            width: 34vw;
            height: 11vw;
            opacity: 0;
        }

        .dialog .again {
            left: 26vw;
            top: 127vw;
            width: 17vw;
            height: 7vw;
        }

        .dialog-result {
            position: absolute;
            left: 27vw;
            top: 37.3vw;
            width: 8vw;
            font-size: 5vw;
            color: #f1f7ee;
            height: 8vw;
            line-height: 8vw;
            text-align: center;
        }

        .fistDialog {
            position: fixed;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            display: none;
            align-items: center;
            justify-content: center;
            background: rgba(0, 0, 0, .6);
        }

        .fistDialog .img-box {
            width: 70vw;
            position: relative;
        }

        .fistDialog button {
            position: absolute;
            left: 18vw;
            top: 101vw;
            border: none;
            width: 34vw;
            height: 11vw;
            opacity: 0;
        }

        .fistDialog .again {
            left: 26vw;
            top: 127vw;
            width: 17vw;
            height: 7vw;
        }

        .fistDialog-result {
            position: absolute;
            left: 27vw;
            top: 37.3vw;
            width: 8vw;
            font-size: 5vw;
            color: #f1f7ee;
            height: 8vw;
            line-height: 8vw;
            text-align: center;
        }

        .failDialog,
        .gameOverDialog {
            position: fixed;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            display: none;
            align-items: center;
            justify-content: center;
            background: rgba(0, 0, 0, .6);
        }

        .failDialog .img-box,
        .gameOverDialog .img-box {
            width: 70vw;
            position: relative;
        }

        .failDialog button,
        .gameOverDialog button {
            position: absolute;
            left: 18vw;
            top: 101vw;
            border: none;
            width: 34vw;
            height: 11vw;
            opacity: 0;
        }

        .failDialog .again,
        .gameOverDialog .back {
            position: absolute;
            left: 21vw;
            top: 87.3vw;
            width: 29vw;
            font-size: 5vw;
            color: #f1f7ee;
        }

3.控制盒子移动

盒子左右移动代码如下(示例):

   var startX, startY, endX, endY, changeX, changeY;
        $('.box').on("touchstart", function (event) {
            event.preventDefault();
            if (!event.touches.length) return;
            var touch = event.touches[0];
            startX = touch.pageX;
            endX = startX;
            startY = touch.pageY;
            endY = startY;
            return false
        });
        $('.box').on("touchmove", function (event) {
            event.preventDefault();
            if (!event.touches.length) return;
            var touch = event.touches[0];
            startX = endX;
            endX = touch.pageX;
            changeX = endX - startX;
            startY = endY;
            endY = touch.pageY;
            changeY = endY - startY;
            var ml = (parseInt($(this).css('left')) + changeX);
            var tl = (parseInt($(this).css('top')) + changeY);
            // console.log(ml)
            // 拖到底就不能再拖动

            if (ml < 0) {
                ml = 0;
            }
            if ((ml + $(this).outerWidth()) > window.innerWidth) {
                ml = window.innerWidth - $(this).outerWidth();
            }
            $(this).css("left", ml);
        });
        $('.box').on("touchend", function (event) {
            event.preventDefault();
        });

3.动态生成图片

 let imgArr = ['./gameImg/boom.png'];
 let imgArr1 = ['./img2/money.png',];



 initElTimer = setInterval(() => {
      // 动态生成img
       if (Math.random() > 0.4) {
       // 增加的
             let src = imgArr1[randomNum(0, 0)];
           new initEl(src, false);
         } else {
             new initEl(imgArr[randomNum(0, 0)], true);
          }
    }, 500)

4.倒计时

            setTimeout(() => {
                dateTimer = setInterval(() => {
                    date--;
                    $('.date-box span').text(date + 's');
                    if (date <= 0) {
                        clearInterval(dateTimer);
                        clearInterval(initElTimer);
                       
                        $('.el').hide();
                    }
                }, 1000);
            }, 1000)

5.生成随机数

        function randomNum(minNum, maxNum) {
            return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
        }

三、JS逻辑

      let result = -47;
        let imgArr = ['./gameImg/boom.png'];
        let imgArr1 = ['./img2/money.png',];

        let date = 10;
        var flag = 1;

        $('.nav-to').on('click', function () {
            console.log("跳转页面");
           
        })

        let initElTimer = null;
        let dateTimer = null

        initPage()

        function initPage() {
            result = -47;
            date = 10;
            $('.box').css('left', '36%');

            $('.result-box img').css('left',"-47vw")
            initElTimer = setInterval(() => {
                // 动态生成img
                if (Math.random() > 0.4) {
                    // 增加的
                    let src = imgArr1[randomNum(0, 0)];

                    new initEl(src, false);
                } else {
                    new initEl(imgArr[randomNum(0, 0)], true);
                }
            }, 500)

            // 倒计时
            setTimeout(() => {
                dateTimer = setInterval(() => {
                    date--;
                    $('.date-box span').text(date + 's');
                    if (date <= 0) {
                        clearInterval(dateTimer);
                        clearInterval(initElTimer);
                        $('.el').hide();
                        if (flag == 1) {
                            console.log('第一次挑战失败');
                            $('.failDialog').css('display', 'flex');
                            $('.failDialog .again').on('click', function () {
                                $('.failDialog').hide();
                                initPage();
                                flag++
                                console.log('flag', flag);
                            })
                        } else if (flag >= 2) {
                            console.log('第二次挑战失败');
                            $('.gameOverDialog').css('display', 'flex');
                            $('.gameOverDialog .back').on('click', function () {
                                $('.gameOverDialog').hide();
                                console.log('回到首页');

                            })
                        }

                    }
                }, 1000);
            }, 1000)
        }


        class initEl {
            constructor(imgSrc, isMinus) {
                this.imgSrc = imgSrc;
                this.isMinus = isMinus;
                this.timer = null;
                this.el = null;
                this.createEl();
            }
            createEl() {
                this.el = document.createElement('img');
                this.el.className = 'el';
                this.el.src = this.imgSrc;
                this.el.setAttribute('style', `left: ${randomNum(0, 80)}vw; top: ${randomNum(0, -40)}vw;`);
                document.body.appendChild(this.el);
                this.setTimer()
            }
            setTimer(el) {
                this.timer = setInterval(() => {
                    this.el.style.top = this.el.offsetTop + 10 + 'px';
                    let bt = $('.box').offset().top,
                        bh = $('.box').outerHeight(),
                        bl = $('.box').offset().left,
                        bw = $('.box').outerWidth();

                    let t = $(this.el).offset().top,
                        h = $(this.el).outerHeight(),
                        l = $(this.el).offset().left,
                        w = $(this.el).outerWidth();

                    if ((t + h) > bt) {
                        // 已超过盒子
                        // 从上往下的临界值为10px
                        if (date > 0 && (t + h) - bt < (h + 10)) {
                            // date 判断是否在有效时间内
                            if (l + w > bl && l < bl + bw) {
                                if (this.isMinus) {
                                    result -= 9.6;
                                } else {
                                    result += 9.6;

                                }
                                if (result >= -2) {
                                    result = 0;
                                    clearInterval(dateTimer);
                                    clearInterval(initElTimer);
                                    $('.el').hide();
                                    $('.dialog').css('display', 'flex');
                                    console.log('挑战成功');
                                    $('.result-box img').css('left', result + 'vw')
                                    clearInterval(this.timer);
                                    document.body.removeChild(this.el);
                                    return
                                }
                                if (result < -47) {
                                    result = -47;
                                }
                                $('.result-box img').css('left', result  + 'vw')
                                // debugger
                                clearInterval(this.timer);
                                document.body.removeChild(this.el);
                                return
                            }
                        }
                        if ((t + h) - bt > window.innerHeight + h) {

                            clearInterval(this.timer);
                            document.body.removeChild(this.el);
                        }
                    }
                }, 20)
            }
        }

        //生成从minNum到maxNum的随机数
        function randomNum(minNum, maxNum) {
            return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
        }

总结

以上就是JS实现接掉落块游戏全部代码,添加了两次机会判断,可控制下落速度、时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值