序文vue3 を使った例をいくつか書いてみましたが、Vue3 のコンポジション API はよく設計されていると感じます。少し習慣を変えましたが、あと 2 つ書いてみるのもいいですね。 今回は、私が子供の頃にとても楽しかったゲーム「ブレイクアウト」について書きます。退屈なときにプレイすると楽しく、プレイアビリティもかなり高いです。今回はvite+vue3のパッケージングを直接使ってみました。Viteもそのまま使える状態で、デッドコードのクリアやオンデマンドでのパッケージングもできるのが特徴で、パッケージングのスピードも非常に速いです。まだ使ったことのない学生はぜひ試してみてください。 ゲーム効果ゲームの要件
完全なコード<テンプレート> <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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQLで数千万のテストデータを素早く作成する方法
>>: Linux コマンドにおける Ctrl+z、Ctrl+c、Ctrl+d の違いと使い方
まず、MySQLをskip-grant-tablesモードで起動します: mysqld --skip...
MySQL ウィンドウ関数の紹介MySQL は MySQL 8.0 以降、ウィンドウ関数をサポートし...
序文決まり文句です。ここでは、フロントエンドとバックエンドの分離についての私の理解についてお話ししま...
この記事では、JavaScriptで全選択と全選択解除の操作を実装するための具体的なコードを参考まで...
序文インターネット上には、MySQL でインデックスにヒットできないさまざまな状況をまとめた記事がよ...
ps: Linux システムで root アカウントのリモート ログインを無効にする方法は次のとおり...
クラスを見るとき、どのような情報を得たいですか?このクラスはどこで使用され、その機能は何ですか?この...
弊社のネットワーク管理センターは管理センター兼サーバーとして機能します!各管理対象デバイスは、TCP...
1. ffmpeg がビデオ ファイルをプッシュする場合、オーディオとビデオのエンコード形式は H2...
まず、CSS3 の相対的な長さの単位を見てみましょう (詳細なチュートリアルを参照してください)。相...
MySQL のインストールは、インストール バージョンと解凍バージョンに分かれています。インストール...
<br />元のアドレス: http://andymao.com/andy/post/8...
前回の記事では、openssl を使用して無料の証明書を生成した後、この証明書を使用してローカル ノ...
データベースはさておき、人生における方言とは何でしょうか?方言とは、ある場所特有の言語です。他の場所...
Windows フォームと同様の効果を得るには、中央をドラッグして div の位置を変更し、端をド...