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 の違いと使い方

推薦する

IE6かどうかを判定する最短JS(IEの書き方)

ブラウザが IE のどのバージョンであるかを検出するためによく使用される JavaScript コー...

ウェブサイトのアクセス速度を向上させるための徹底的な最適化に関するヒント

ウェブサイトのアクセス速度を向上させるための徹底的な最適化に関するヒント。ウェブサイトのアクセス速度...

React スキャフォールディングのパスエイリアスを設定する方法

この記事を書いている時点でのReactのバージョンは16.13.1です1 npm run eject...

Ubuntu 18.0.4 MySQL 8.0.20 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0.20 のインストールおよび設定方法は、参考としてグラフィック チュートリアルにま...

MySQLインデックスの基本構文

インデックスはソートされたデータ構造です。 where 条件での検索や order by 条件での並...

HTML iframe で親ページと子ページ間の双方向メッセージングを実装する例

ある日、リーダーはメイン ページに iframe を埋め込み、親ページと子ページ間で双方向にメッセー...

Docker ベースのよく使われる CentOS7 イメージの概要

目次1 Dockerをインストールする2 国内ミラーソースの設定3 中国語環境基本版Centos7イ...

MySQLデータベースとテーブルシャーディングの概要

プロジェクトの開発中に、データベースのデータがどんどん大きくなり、その結果、1 つのテーブルにデータ...

mysql5.5.28 のインストール チュートリアルは非常に詳細です。

参考までにmysql5.5.28のインストールチュートリアルです。具体的な内容は次のとおりです。イン...

IE6 での PNG アルファ透明度 (完全コレクション)

IE6 は PNG の透明度をサポートしていないと多くの人が言っています。実際、IE は 100%...

Power Shell に vim 実装コード例を追加する方法

1. Vimの公式ウェブサイトにアクセスして、オペレーティングシステムに適した実行ファイルをダウンロ...

Vue での ref の使用法とデモンストレーション

ref 定義:要素またはサブコンポーネントの参照情報を登録するために使用されます。参照情報は、親コン...

Navicat は CSV データを MySQL にインポートします

この記事では、Navicatを使用してcsvデータをmysqlにインポートする方法を参考までに紹介し...

C++ TpeScriptシリーズのジェネリックについて

目次1. テンプレート2. ジェネリック3. ジェネリック再帰4. デフォルトのジェネリックパラメー...

Linux ssh サービス情報と実行ステータスを表示する方法

Linux での ssh サービス構成など、ssh サーバー構成に関する記事は多数あります。ここでは...