溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何用vue3實現(xiàn)打磚塊小游戲

發(fā)布時間:2022-10-12 14:35:45 來源:億速云 閱讀:100 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“如何用vue3實現(xiàn)打磚塊小游戲”,文中的講解內(nèi)容簡單清晰,易于學(xué)習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習“如何用vue3實現(xiàn)打磚塊小游戲”吧!

游戲需求

  1. 創(chuàng)建一個場景

  2. 創(chuàng)建一個球,創(chuàng)建一堆被打擊方塊

  3. 創(chuàng)建一個可以移動方塊并可控制左右移動

  4. 當球碰撞左右上邊界及移動方塊回彈

  5. 擋球碰撞下邊界游戲結(jié)束

完整代碼

<template>

    <button @click="stop">停止</button>
    <button @click="start">游戲開始</button>
    <div style="color: red; text-align: center;font-size: 25px">score:{{scroce}}</div>

    <div class="box" :style="{width :boxWidth +"px", height:boxHeight +"px"}">
        <div class="str">{{str}}</div>
        <div class="kuaiBox">
            <div class="kuai" v-for="(item,index) in arr" :key="index" :style="{opacity :item.active ? "0":"1"}"></div>
        </div>
        <div class="ball" :style="{left :x + "px", top : y + "px", width : ball +"px", height: ball+"px"}"></div>
        <div class="bottomMove"
             :style="{left :mx + "px" , top : my + "px",width :moveBottomW +"px",height : moveBottomH+"px"  }"></div>
    </div>
</template>

<script setup>
    import {onMounted, onUnmounted, reactive, toRefs} from "vue"

    const boxWidth = 500, // 場景寬度
        boxHeight = 300, // 場景高度
        ball = 10,//小球的寬高
        moveBottomH = 5,//移動方塊高度
        moveBottomW = 100//移動方塊快讀

    const strArr = "恭喜你,挑戰(zhàn)成功!!"

    //用reactive 保存一些可觀察信息
    const state = reactive({
        x: boxWidth / 2 - ball / 2,  // 小球x軸位置信息 計算默認位置在中間
        y: boxHeight - ball - moveBottomH, // 小球Y軸的位置信息 計算默認位置在中間
        mx: boxWidth / 2 - moveBottomW / 2, //移動方塊的位置信息 計算默認位置在中間
        my: boxHeight - moveBottomH, // 移動方塊y軸的的位置信息  計算默認位置在中間
        // 被打擊方塊的數(shù)組
        arr: Array.from({length: 50}, (_, index) => {
            return {
                index,
                active: false
            }
        }),
        str: "", // 返回挑戰(zhàn)成功字眼
        scroce: 0 // 分數(shù)
    })
    // 用toRefs將觀察對象的信息解構(gòu)出來供模板使用 
    const {x, y, mx, my, arr, str, scroce} = toRefs(state)
    let timer = null, // 小球定時器
        speed = 3,// 小球速度
        map = {x: 10, y: 10},
        timer2 = null, // 挑戰(zhàn)成功字眼顯示定時器
        index = 0//挑戰(zhàn)成功字眼續(xù)個顯示的索引值

    // 挑戰(zhàn)成功字眼續(xù)個顯示的方法
    const strFun = () => {
        if (strArr.length === index) clearInterval(timer2)
        state.str += strArr.substr(index, 1)
        index++
    }

    
    //移動小球的方法  
    // 1.這里同過變量map 對象來記錄坐標信息, 確定小球碰到 左右上 及移動方塊是否回彈
    // 2.循環(huán)磚塊檢測小球碰撞到磚塊消失
    const moveBall = () => {
        const {offsetTop, offsetHeight, offsetLeft, offsetWidth} = document.querySelector(".bottomMove")
        if (state.x <= 0) {
            map.x = speed
        } else if (state.x > boxWidth - ball) {
            map.x = -speed
        }
        if (state.y <= 0) {
            map.y = speed
        }
        if (state.y >= offsetTop - offsetHeight &&
            state.y <= offsetTop + offsetHeight &&
            state.x >= offsetLeft &&
            state.x < offsetLeft + offsetWidth) {
            map.y = -speed
        }
        if (state.y > boxHeight) {
            clearInterval(timer)
            alert("game over")
            window.location.reload()
        }
        Array.from(state.arr).forEach((item, index) => {
            const {
                offsetLeft,
                offsetTop,
                offsetWidth,
                offsetHeight
            } = document.querySelectorAll(".kuai")[index]
            if (state.x > offsetLeft
                && state.x < offsetLeft + offsetWidth
                && state.y > offsetTop
                && state.y < offsetTop + offsetHeight) {
                if (!state.arr[index].active) {
                    state.scroce += 100
                }
                state.arr[index].active = true
            }
        })
        if (Array.from(state.arr).every(item => item.active)) {
            clearInterval(timer)
            timer2 = setInterval(strFun, 1000)
        }
        state.x = state.x += map.x
        state.y = state.y += map.y
    }

    //移動方塊左右移動方法 ,接住小球
    const bottomMove = ev => {
        if (ev.code === "Space") clearInterval(timer)
        switch (ev.key) {
            case "ArrowRight":
                state.mx += 100
                break
            case  "ArrowLeft":
                state.mx -= 100
                break
        }
        state.mx = state.mx < 0 ? 0 : state.mx
        state.mx = state.mx > boxWidth - moveBottomW ? boxWidth - moveBottomW : state.mx
    }
    // 暫停游戲
    const stop = () => {
        clearInterval(timer)
    }
    // 開始游戲 
    const start = () => {
        timer = setInterval(moveBall, 20)
    }
    
    // 綁定移動方塊事件
    onMounted(() => {
        document.addEventListener("keyup", bottomMove)
    })
    // 移動出移動方塊事件
    onUnmounted(() => {
        clearInterval(timer)
    })
</script>

<style>

    .bottomMove {
        width: 100px;
        height: 10px;
        background: red;
        position: absolute;
        transition-duration: 100ms;
        transition-timing-function: ease-out;
    }

    .ball {
        width: 20px;
        height: 20px;
        background-color: red;
        border-radius: 50%;
        position: absolute;
    }

    .kuaiBox {
        display: flex;
        flex-wrap: wrap;
    }

    .kuai {
        width: 30px;
        height: 10px;
        background: red;
        margin: 10px;
        transition-duration: 100ms;
        transition-timing-function: ease-in;
    }

    .str {
        text-align: center;
        font-size: 50px;
        color: red;

    }

    .box {

        justify-content: center;
        width: 500px;
        height: 500px;
        margin: 0 auto;
        position: relative;
        border: 5px solid red;
        overflow: hidden;
    }

    .picker {
        width: 50px;
        height: 50px;
    }
</style>

感謝各位的閱讀,以上就是“如何用vue3實現(xiàn)打磚塊小游戲”的內(nèi)容了,經(jīng)過本文的學(xué)習后,相信大家對如何用vue3實現(xiàn)打磚塊小游戲這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI