vue3 でブロック崩しゲームを開発する方法をステップバイステップで教えます

vue3 でブロック崩しゲームを開発する方法をステップバイステップで教えます

序文

vue3 を使った例をいくつか書いてみましたが、Vue3 のコンポジション API はよく設計されていると感じます。少し習慣を変えましたが、あと 2 つ書いてみるのもいいですね。 今回は、私が子供の頃にとても楽しかったゲーム「ブレイクアウト」について書きます。退屈なときにプレイすると楽しく、プレイアビリティもかなり高いです。今回はvite+vue3のパッケージングを直接使ってみました。Viteもそのまま使える状態で、デッドコードのクリアやオンデマンドでのパッケージングもできるのが特徴で、パッケージングのスピードも非常に速いです。まだ使ったことのない学生はぜひ試してみてください。

ゲーム効果

ゲームの要件

  1. シーンを作成する
  2. ボールとヒットブロックの束を作成する
  3. 左右に動かすことができる可動ブロックを作成する
  4. ボールが左右の上部境界と移動ブロックに当たると、跳ね返ります
  5. ボールが下の境界線に当たった時点でゲームは終了する

完全なコード

<テンプレート>

    <button @click="stop">停止</button>
    <button @click="start">ゲーム開始</button>
    <div style="color: red; text-align: center;font-size: 25px">スコア:{{scroce}}</div>

    <div class="box" :style="{幅:boxWidth +'px', 高さ: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>
</テンプレート>

<スクリプトの設定>
    'vue' から {onMounted、onUnmounted、reactive、toRefs} をインポートします。

    const boxWidth = 500, // シーンの幅 boxHeight = 300, // シーンの高さ ball = 10, // ボールの幅と高さ moveBottomH = 5, // 移動ブロックの高さ moveBottomW = 100 // 移動ブロックのクイック読み取り const strArr = 'おめでとうございます。チャレンジ成功です!!'

    // reactive を使用して観測可能な情報を保存します const state = reactive({
        x: boxWidth / 2 - ball / 2, // ボールの x 軸位置のデフォルト位置は中央です y: boxHeight - ball - moveBottomH, // ボールの y 軸位置のデフォルト位置は中央です mx: boxWidth / 2 - moveBottomW / 2, // 移動ブロックのデフォルト位置は中央です my: boxHeight - moveBottomH, // 移動ブロックの y 軸位置のデフォルト位置は中央です // ヒットブロックの配列 arr: Array.from({length: 50}, (_, index) => {
            戻る {
                索引、
                アクティブ: false
            }
        })、
        str: '', // 「成功したチャレンジ」という単語を返します scroce: 0 // スコア })
    // テンプレート使用のために観測オブジェクトの情報を分解するには toRefs を使用します const {x, y, mx, my, arr, str, scroce} = toRefs(state)
    let timer = null, // ボールタイマー speed = 3, // ボール速度 map = {x: 10, y: 10},
        timer2 = null, // チャレンジ成功単語表示タイマー index = 0 // チャレンジ成功単語表示インデックス値 // チャレンジ成功単語表示方法 const strFun = () => {
        if (strArr.length === インデックス) clearInterval(timer2)
        state.str += strArr.substr(インデックス、1)
        インデックス++
    }

    
    //ボールを動かす方法// 1. ここでは、マップ オブジェクトを使用して座標情報を記録して、ボールが左、右、上、および移動ブロックに当たったときにバウンドするかどうかを決定します// 2. ボールがブロックに衝突して消えるタイミングを検出するために、ブロックをループします const moveBall = () => {
        const {offsetTop、offsetHeight、offsetLeft、offsetWidth} = document.querySelector('.bottomMove')
        (状態x <= 0)の場合{
            map.x = 速度
        } そうでない場合 (state.x > boxWidth - ball) {
            map.x = -速度
        }
        (状態y <= 0)の場合{
            map.y = 速度
        }
        if (state.y >= offsetTop - offsetHeight &&
            state.y <= offsetTop + offsetHeight &&
            state.x >= offsetLeft &&
            状態.x < offsetLeft + offsetWidth) {
            map.y = -速度
        }
        (状態.y > ボックスの高さ)の場合{
            クリアインターバル(タイマー)
            警告('ゲームオーバー')
            ウィンドウの場所を再読み込み()
        }
        Array.from(state.arr).forEach((item, index) => {
            定数{
                オフセット左、
                オフセットトップ、
                オフセット幅、
                オフセット高さ
            } = document.querySelectorAll('.kuai')[インデックス]
            if (state.x > offsetLeft
                && state.x < offsetLeft + offsetWidth
                && state.y > オフセットトップ
                && state.y < offsetTop + offsetHeight) {
                状態.arr[インデックス].activeの場合{
                    状態.scroce += 100
                }
                state.arr[インデックス].active = true
            }
        })
        Array.from(state.arr).every(item => item.active) の場合 {
            クリアインターバル(タイマー)
            タイマー2 = setInterval(strFun, 1000)
        }
        状態.x = 状態.x += マップ.x
        状態.y = 状態.y += マップ.y
    }

    //ブロックを左右に動かし、ボールをキャッチするメソッド const bottomMove = ev => {
        if (ev.code === 'Space') clearInterval(timer)
        スイッチ (ev.key) {
            ケース 'ArrowRight':
                状態.mx += 100
                壊す
            ケース 'ArrowLeft':
                状態.mx -= 100
                壊す
        }
        state.mx = state.mx < 0 ? 0 : state.mx
        state.mx = state.mx > boxWidth - moveBottomW ? boxWidth - moveBottomW : state.mx
    }
    // ゲームを一時停止する const stop = () => {
        クリアインターバル(タイマー)
    }
    // ゲームを開始する const start = () => {
        タイマー = setInterval(moveBall, 20)
    }
    
    // 移動ブロックイベントをバインド onMounted(() => {
        document.addEventListener('keyup', bottomMove)
    })
    // 移動ブロックイベントから抜け出す onUnmounted(() => {
        クリアインターバル(タイマー)
    })
</スクリプト>

<スタイル>

    .bottomMove{
        幅: 100ピクセル;
        高さ: 10px;
        背景: 赤;
        位置: 絶対;
        遷移期間: 100ms;
        遷移タイミング関数: イーズアウト;
    }

    。ボール {
        幅: 20px;
        高さ: 20px;
        背景色: 赤;
        境界線の半径: 50%;
        位置: 絶対;
    }

    .kuaiBox{
        ディスプレイ: フレックス;
        flex-wrap: ラップ;
    }

    .kuai {
        幅: 30ピクセル;
        高さ: 10px;
        背景: 赤;
        マージン: 10px;
        遷移期間: 100ms;
        遷移タイミング関数: イーズイン;
    }

    .str {
        テキスト配置: 中央;
        フォントサイズ: 50px;
        色: 赤;

    }

    。箱 {

        コンテンツの中央揃え: 中央;
        幅: 500ピクセル;
        高さ: 500px;
        マージン: 0 自動;
        位置: 相対的;
        境界線: 5px 実線の赤;
        オーバーフロー: 非表示;
    }

    .ピッカー{
        幅: 50px;
        高さ: 50px;
    }
</スタイル>

やっと

今後も vue3 を使い続け、さらに多くの例を書いていきます。

添付はブロック崩しゲームのアドレスです

shinewen189.github.io/nigo-ball-v…

これで、vue3 を使用したブロック崩しゲームの開発に関するこの記事は終了です。vue3 を使用したブロック崩しゲームの関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue3 を使用したジグソーパズルゲームのリファクタリングの例

<<:  MySQLで数千万のテストデータを素早く作成する方法

>>:  Linux コマンドにおける Ctrl+z、Ctrl+c、Ctrl+d の違いと使い方

推薦する

MySQL ユーザーのホスト属性を素早く変更する方法

MySQL にリモートでログインする場合、使用するアカウントには特別な要件があります。アカウントのデ...

vue3.0 sfcのセットアップの変更について簡単に説明します。

目次序文標準的なSFCの書き方スクリプト設定可変露出部品の取り付け小道具カスタムイベント要約する序文...

Nginx 仮想ホストを構成する 3 つの方法 (ドメイン名に基づく)

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮...

サーバー間のファイル バックアップ ソリューション、サーバー ファイルを別のサーバーに自動的にバックアップする方法は?

多くの組織ではファイル サーバーをバックアップする必要があり、あるサーバーから別のファイル サーバー...

MySQLで論理SQLを置き換える際の落とし穴を回避する方法の詳細な説明

重複キーの置換と挿入の違い置換の使用法競合がない場合、挿入と同等となり、他の列のデフォルト値が使用さ...

IDEA 構成の Tomcat 起動エラーの問題を解決する

異なるサーブレット パスを構成するときに、次の 2 つのエラーが発生しました。 java.lang....

データ型の判断における js typeof と instanceof の違いと、その開発と使用について

目次1. typeof演算子2. インスタンスオブ演算子3. typeof と instanceof...

Vue が 4 レベルのナビゲーションと検証コードを実装する方法の例

効果: まず5つのVueインターフェースを作成する1.home.vueページ <テンプレート&...

Vue の計算プロパティとリスナーの使用の概要

1. 計算プロパティとリスナー1.1 計算プロパティ <!DOCTYPE html> &...

Angular構造ディレクティブモジュールとスタイルの詳細な説明

目次1. 構造指示モジュールforRoot()を書く3. スタイルの定義ドラッグ時の順序を調整するに...

MySQLで最新のトランザクションIDを照会する方法

前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要...

Node.jsはMySQLデータベースの実戦記録を追加、削除、変更、チェックします

目次プロジェクトでデータベースを操作する3つのステップデータベースを操作するための具体的な手順1: ...

MySQL ストレステストツール Mysqlslap の使用

1. MySQL独自のストレステストツールMysqlslap mysqlslap は、mysql に...

権限の問題によりMySQLの設定ファイルmy.cnfを起動できない問題の解決方法

この記事では、権限の問題により MySQL 構成ファイル my.cnf を起動できない場合の関連する...

MySQL方言の簡単な紹介

データベースはさておき、人生における方言とは何でしょうか?方言とは、ある場所特有の言語です。他の場所...