CocosCreator クラシック エントリー プロジェクト flappybird

CocosCreator クラシック エントリー プロジェクト flappybird

開発環境

ココスクリエイター v2.3.1

Node.js v10.16.0

VSコード1.46.1

ゲームエンジンのコンセプト

これは、基礎となるインターフェースの使用をカプセル化し、ゲーム開発のコア機能プロバイダーとなる、事前に記述されたコードのセットとして理解できます。

一般的には 6 つの部分に分かれています。

  1. 画像レンダリング: ゲーム グラフィックに対するコンピューターの描画操作を制御します。これはゲームの品質に直接影響します。
  2. オーディオUI: ゲームとユーザーとのインタラクションを向上させるオーディオ効果とゲームUIを提供します
  3. デバイス入力: キーボード、マウス、ジャイロスコープなど。
  4. スクリプトエンジン: スクリプトインターフェースを提供し、ゲーム開発者に「書き込み」を提供します
  5. ネットワークエンジン: サーバーを使用してクライアントとの対話を提供するデータ対話モジュール
  6. 物理エンジン (高度): 現実世界の物理的効果 (重力加速、オブジェクト間の衝突など) をシミュレートします。

Cocos Creatorについて

プロジェクト構造

ProjectName (プロジェクト フォルダ)
├──assets リソース フォルダー ----------- ゲーム内のすべてのローカル リソース、スクリプト、サードパーティ ライブラリ ファイルを配置するために使用されます ├──library リソース ライブラリ----------------ここでのファイル構造とリソース形式は、最終的なゲーム リリースに必要な形式に処理されます ├──local ローカル設定 -------------- プロジェクトの構成情報 (エディター パネルのレイアウト、ウィンドウのサイズ、位置など) を保存します
├──packages 拡張プラグイン フォルダ - プロジェクトのカスタム拡張プラグインを保存します ├──settings プロジェクト設定 -------------- ビルド リリース メニューのパッケージ名、シーン、プラットフォームの選択など、プロジェクト関連の設定を保存します ├──temp 一時フォルダ ----------- CocosCreator のローカル一時ファイルをキャッシュするために使用されます └──project.json 検証ファイル ------------- CocosCreator プロジェクトの正当性を検証するためのサインとして

実際のプロジェクトを始めましょう

コード編集環境を構成する

Visual Studio Code (以下、VS Code と呼びます) は、Microsoft がリリースした新しい軽量クロスプラットフォーム IDE です。Windows、Mac、Linux プラットフォームをサポートしており、インストールと構成が非常に簡単です。 VS Code を使用してプロジェクト スクリプト コードを管理および編集すると、構文の強調表示やインテリジェントなコード プロンプトなどの機能を簡単に実装できます。

Cocos Creator APIアダプタプラグインをインストールする

この操作により、Cocos Creator API アダプター プラグインが VS Code グローバル プラグイン フォルダーにインストールされます。インストールが成功すると、コンソールに緑色のプロンプトが表示されます: VS Code extension installed to ... 。このプラグインの主な機能は、Cocos Creator コンポーネント スクリプトの使用習慣に準拠した構文プロンプトを VS Code 編集状態に挿入することです。

プロジェクト内でスマートプロンプトデータを生成する

コード作成中に Cocos Creator エンジン API を自動的にプロンプ​​ト表示したい場合は、メニューから API スマート プロンプト データを生成し、それをプロジェクト パスに自動的に配置する必要があります。

メイン メニューから、 [開発者] -> [VS Code ワークフロー] -> [VS Code IntelliSense データの更新]を選択します。この操作により、エンジン API に従って生成されたcreator.d.tsデータ ファイルがプロジェクトのルート ディレクトリにAPI data generated and copied to ... ( assetsディレクトリの外部にあることに注意してください)。操作が成功すると、コンソールに緑色のプロンプトが表示されます: API データが生成され、次の場所にコピーされました...

VS Codeを使用してスクリプトのコンパイルを有効にする

外部テキスト エディターを使用してプロジェクト スクリプトを変更した後、スクリプトのコンパイルをトリガーするには、Cocos Creator ウィンドウを再度アクティブにする必要があります。新しいバージョンの Creator にはプレビュー サーバー API が追加されており、特定のアドレスにリクエストを送信することでエディターのコンパイルをアクティブ化できます。

新しいプロジェクト

1. 空のプロジェクトを作成する

2. リソースマネージャー

次に、リソース マネージャーでプロジェクト内の最も重要なシーンとスクリプト ファイルを作成し、ゲームに必要なテクスチャ (画像リソース) をインポートする必要があります。ここでのフォルダーはデフォルトでは作成されないため、プロジェクトの管理を容易にするために手動で作成する必要があります。なお、resources は CocosCreator (以下、cocos と略します) 内の特別なリソース フォルダです。cc.loader.loadRes (このメソッドについては後述します) を通じて動的にロードする必要があるすべてのリソースは、resources フォルダとそのサブフォルダに配置する必要があります。リソースが resources 内の他のリソースにのみ依存し、cc.loader.loadRes によって直接呼び出される必要がない場合は、そのリソースを resources フォルダーに配置する必要はありません。

3. シナリオ

シーン内で新しいシーンを作成するには、シーンを右クリックして新しいシーンを作成します。Cocos Creator では、ゲーム シーンは開発中にゲーム コンテンツを整理するための中心であり、すべてのゲーム コンテンツをプレイヤーに提示するための媒体でもあります。ゲームシーンには一般的に以下の内容が含まれます。

  • シーン画像とテキスト(スプライト、ラベル)
  • 役割
  • コンポーネントの形でシーンノードに添付されたゲームロジックスクリプト

プレイヤーがゲームを実行すると、ゲームシーンがロードされます。ゲームシーンがロードされた後、含まれているコンポーネントのゲームスクリプトが自動的に実行され、開発者が設定したさまざまな論理機能が実装されます。したがって、リソースに加えて、ゲームシーンはすべてのコンテンツ作成の基礎となります。それでは、新しいシーンを作成しましょう。エントリーレベルのプロジェクトである flappybird では、新しいシーンを作成するだけで済み、プロジェクト完了後の効果はおおよそ次のようになります。

4. シーンエディター、階層マネージャー、プロパティインスペクター

作成した鳥のシーンをダブルクリックすると、Cocos はシーン エディター階層マネージャーでこのシーンを開きます。シーンを開くと、階層マネージャーに現在のシーン内のすべてのノードとその階層関係が表示されます。先ほど作成したシーンには、 Canvasという名前のノードが 1 つだけあります。 Canvas 、キャンバス ノードまたはレンダリング ルート ノードと呼ばれることがあります。 Canvasをクリックして選択すると、プロパティ インスペクターでそのプロパティを確認できます。

リソース パックのテクスチャ ディレクトリから空の背景画像を、ゲームの背景としてキャンバスにドラッグします。キャンバスと空のサイズを調整します。空のサイズは少なくともキャンバスより大きくなければなりません。そうでないと、作成したゲームに大きな黒い縁が現れる場合があります。次に、同様の方法を使用して、bird0 (他の 2 つは、鳥の飛行をシミュレートする簡単なフレーム アニメーションを作成するためのものです)、pipe1 (下のパイプ)、および pipe2 (上のパイプ) をキャンバスに追加します。上下のパイプがグループになっており、4グループコピーしたので合計5グループになります。背景と各パイプ セットはスクリプトによって制御され、左に移動して、鳥が継続的に前方に飛んでいる効果を実現します。

5. ノードバインディング

Canvas の下にあるすべての要素はノード ノードの形式で管理されることに注意してください。 script - game.js に新しいスクリプト ファイルを作成し、それを Canvas にドラッグするか、Canvas に直接バインドします。シーンがロードされるときにスクリプトがロードされることを確認してください。

6. ライフサイクルコールバック

Cocos Creator は、コンポーネント スクリプトのライフサイクル コールバック関数を提供します。ユーザーが特定のコールバック関数を定義している限り、Creator は特定の時間に関連するスクリプトを自動的に実行するため、ユーザーが手動で呼び出す必要はありません。

現在ユーザーに提供されているライフサイクル コールバック関数は次のとおりです。

  • onLoad onLoadコールバックは、シーンがロードされたときやノードがアクティブ化されたときなど、ノードが最初にアクティブ化されたときにトリガーされます。また、 onLoadstartメソッドが呼び出される前に常に実行されます。通常、 onLoadフェーズでは初期化に関連する操作をいくつか実行します。
  • start startバック関数は、コンポーネントが初めてアクティブ化される前、つまり最初のupdateが実行される前にトリガーされます。 start通常、更新中に変更される可能性のある、頻繁に変更する必要があり、一部のデータを初期化するために使用されます。
  • ゲーム開発における重要なポイントは、各フレームをレンダリングする前に、オブジェクトの動作、状態、位置を更新することです。これらの更新操作は通常、 updateコールバック内に配置されます。次の4つのコールバック関数はこのプロジェクトでは使用されません
  • 遅い更新
  • 破棄時
  • 有効にする
  • 無効化

メインコード

ゲーム.js

cc.クラス({
    拡張: cc.Component、

    プロパティ:
        skyNode: cc.Node, // スカイ ノードを定義 pipeNode: cc.Node, // パイプ ノードを定義 birdNode: cc.Node, // バード ノードを定義 clickLayerNode: cc.Node, // マウス クリック イベントをリッスンするリスナー ノードを定義 scoreNode: cc.Node, // スコア ノードの合計スコア ノードを定義 buttonNode: cc.Node, // ゲーム ボタンを開始するボタン ノードを定義 numberNode: cc.Node, // ポイント コンボを追加する数値ノードを定義
        overNode: cc.Node, //ゲーム終了ノード終了ボタンを定義します。spriteFrame: { //スプライトフレームノードを定義します。
            default: [], //配列型、3つの画像スプライトbird0、bird1、bird2をバインドし、update()メソッドでそれらを常に変更することでアニメーションを形成します。type: cc.SpriteFrame //画像スプライト型},
        clip:{// サウンド効果ノードを定義します。default: [], // 配列型でもあり、複数のリソースをバインドするのに便利です。その後の学習では、動的読み込みタイプを使用してみてください: cc.AudioClip //オーディオタイプ}
    },
    onClickButton(){//クリックボタンメソッドを設定する this.num = 0;//numを0にリセットする
        this.sign = true;//ゲームを続行するかどうかを制御する識別子を設定します。this.buttonNode.active = false;//ボタン ノードを非表示にします。this.overNode.active = false;//「ゲーム オーバー」テキストを制御する overNode ノードを非表示にします。this.birdNode.y = 50;//ボタンをクリックすると、鳥の位置は元の位置に戻ります。this.power = 0;//復活後に鳥が急速に落下するのを防ぐために、電力係数を 0 に変更します。this.scoreNode.getComponent(cc.Label).string = "" + this.num;//スコア ノードの文字列値を 0 に変更します。this.scoreNode.getComponent(cc.Label).string
        let list = this.pipeNode.children; // リストを使用して金属パイプの子ノード (.children) を保存します。
        for (let i = 0; i < list.length; i++) { //ループを設定します。終了条件は、i がリストの長さより小さいことです。let child = list[i]; //ループ内の各 list[i] を格納するために子変数を使用します。
            child.x += 1000; //パイプラインノードのxを1000右にシフトします
        }
        cc.audioEngine.playMusic(this.clip[0], true);
    },
    onClickBagButton(event, data) { //バックパックボタンメソッドを定義// cc.log(event, data);
        if (data == "bag"){//渡されたパラメータがイベントのCustomEventDataと等しいかどうかを判断します
            this.showBag(); //バックパックを表示する関数を呼び出す}
    },
    showBag() { //バックパックを表示する関数を定義します if (this.bagPrefab == null) { //リソースの読み込みが成功しなかった場合 setTimeout(() => { //バッグ表示メソッドの呼び出しを続行する前に0.5秒の遅延を設定します this.showBag();
            }, 500);
            戻る;
        }
        //リソースの読み込みが完了しました let node = null; //ノードを定義してnullに割り当てます if (this.isOpen) { //バックパックが開いているかどうかを判断します。this.isOpenの初期値はfalseです
            ノード = cc.find("Canvas/panelBag");
            ノードをアクティブにします。
        }
        それ以外{
            node = cc.instantiate(this.bagPrefab); // 特定のプリセットリソースをロードし、ノードに割り当てます
            cc.find("Canvas").addChild(node); //ノードをCanvas画面に追加します}
        node.opacity = 0; //ノードの透明度を 0 に設定します。
        node.scale = 0.1; //ノードの初期スケールを0.1に設定します。
        let ac = cc.spawn( //並列アニメーションをカプセル化してacに割り当てる
            cc.fadeIn(0.5), // 0.5秒の速度でフェードインします。cc.scaleTo(0.5,1), // 0.5秒の速度で1にスケールします。
        );
        node.runAction(ac); //runAction関数を使用してカプセル化されたacを実行します
        this.isOpen = true; //バックパックの開閉パラメータをtrueに設定する
    },
    gameOver() { //ゲーム終了メソッドを設定する this.sign = false; //ゲームオーバー、ゲーム継続識別子をfalseに変更する
        this.checkStill = false; //ゲームが進行中かどうかをチェックし、パラメータがfalseになる
        this.buttonNode.active = true; //ゲームオーバー、スタートボタンを表示する this.buttonNode を表示する this.overNode.active = true; //ゲームオーバー、"Game Over" テキストの overNode ノードを表示する cc.audioEngine.stopMusic(this.clip[0]); //ゲームオーバー、バックグラウンドミュージックを停止する},
    addScore() { //スコアリング方法を設定します this.numberNode.opacity = 255; //スコアノード numberNode の .opacity 要素 (透明度) を 255 に設定します
        this.num++; //num 値++ とする
        this.scoreNode.getComponent(cc.Label).string = "" + this.num; //スコアノードの文字列要素を空の文字列 "" プラス num にします
        this.numberNode.y = this.birdNode.y; //ボーナスコンボノード numberNode の y を bird ノードの y と同じにします this.numberNode.runAction(//ボーナスコンボノード numberNode をフェードインおよびフェードアウトさせます runAction, spawn, fadeOut, moveBy
            cc.スポーン(
                cc.フェードアウト(0.5)、
                cc.moveBy(0.5, cc.v2(0, 50))
            )
        )
        cc.audioEngine.playEffect(this.clip[2]); // ボーナスミュージック},

    // ライフサイクルコールバック:

    オンロード() {
        // cc.director.getCollisionManager().enabled = true; //衝突管理システム cc.director.getCollisionManager() を開きます。
        this.bagPrefab = null; // bagPrefab 変数を定義し、それを null に割り当てます // cc.loader.loadRes(path, resource type, callback function); error エラーの場合はエラー情報を出力し、data は正常にロードされたリソースです cc.loader.loadRes("prefab/panelBag", cc.Prefab, (error, data) => {
            if (error){//エラーメッセージが空でないかどうかを判断します cc.log(error);//エラーメッセージを出力します return;         
            }
            this.bagPrefab = data; // 読み込んだリソースを this.bafPrefab に割り当てます
        });
    },

    始める() {
        this.isOpen = false; // バックパックが開いているかどうかを定義し、false に設定します。
        this.num = 0; // ゲームが再開したときにスコアが前のゲームのスコアを継承しないように、num パラメータを 0 に変更します。 this.scoreNode.getComponent(cc.Label).string = "" + 0; // 初期スコア値を 0 に設定します。
        this.speed = 5; //相対移動速度を5に設定する
        this.power = 0; // パワーパラメータを0に設定する
        this.checkStill = true; //ゲームが進行中でパラメータがtrueになっているかどうかを確認します
        this.curFrame = 0; //スキンノードリストをループするための変数を定義します。 this.sign = false; //ゲームを開始するかどうかを制御する識別子を定義します。初期値は false です。
        this.checkState = false; // false - 衝突検出なしの状態 true - 衝突検出の状態 this.up = 0; //
        this.clickLayerNode.on(cc.Node.EventType.TOUCH_START, () =>{//Who.on(cc.Node.EventType type.Event, 匿名メソッドを実行() =>)
            this.power = 4; // 初期パワーパラメータを 0 から 4 に直接設定して、鳥がクリックされるたびに大幅に増加するようにします。this.up++;
            cc.audioEngine.playEffect(this.clip[1]);
        })

        cc.audioEngine.playMusic(this.clip[0], true);
    },

    更新(dt) {
        if (!this.sign){//ゲームを一時停止するための識別子を設定します。return;
        }
        cc.log(2);
        this.skyNode.x -= this.speed;//スカイノードのx値を制御して背景の動きを制御しますthis.birdNode.y += this.power + this.up;//鳥ノードのy値と初期パワーパラメータによって鳥の自由落下速度を制御しますthis.power -= 0.2;//パワー値を徐々に小さな振幅で変更して、鳥を滑らかに動かしますthis.birdNode.angle = this.speed * this.power;//パワーと速度パラメータによって鳥の上昇と下降の角度を制御しますif (this.skyNode.x < -1200){//背景と開始点が1200ピクセル離れていると判断し、背景ノードskyNode.xを0に戻します(無限ループ背景)
            _this.skyNode.x = 0; です。
        }
        //node.children はパイプ ノードの子ノードです。let list = this.pipeNode.children; //リストを使用して金属パイプの子ノード (.children) を保存します。
        let checkNode = null; //チェックパイプラインノード変数を定義し、null に割り当てます
        for (let i = 0; i < list.length; i++){//ループを使用してすべてのパイプラインノードに値を割り当て、速度を割り当てます。let child = list[i];//子変数にリストの各要素を格納します。child.x -= this.speed;//パイプラインノードのx-=this.speedを制御します。
            // cc.log(子);
            (子.x < -600)の場合{
                child.x = 600; // 子が -600 未満の範囲外にある場合は、子を 600 に戻します
                child.y = (Math.random() - 0.5) * 200; //Math.random() (値は 0 ~ 1) 関数を使用して、ポートを通るパイプラインのランダムな表示を制御します。イージング値は 200 です。
            }
            let dis = Math.abs(this.birdNode.x - child.x) //変数 dis を使用して、鳥とパイプの x の差を計算します (Math.abs は絶対値を取得します)
            let width = (this.birdNode.width + child.children[0].width) / 2; //鳥とパイプの衝突の臨界値を格納するためのwidth変数を定義します。if (dis < width) { //dis <= widthの場合、値childをチェックパイプノード変数に割り当てます。
                チェックノード = 子;
            }
        }
        if(this.birdNode.y + this.birdNode.height / 2 > cc.winSize.height / 2 //鳥の頭が画面の上端より大きいか、鳥の下部が画面の下端より小さいかを判断します|| this.birdNode.y - this.birdNode.height / 2 < -cc.winSize.height / 2){
                this.gameOver(); //ゲーム終了メソッドを実行する}
        if(checkNode){//checkNodeを直接判定し、値が割り当てられていない場合は空です。this.checkState = true;//状態は何もないものから何かに変わり、チェック状態変数checkStateにtrueが割り当てられます。
            // 長方形の鳥の上端 (.y + height / 2) がチャネルの上端 (checkNode.y + 100) 以上であるか、鳥の下端がチャネル以下であるかを確認します if (this.birdNode.y + this.birdNode.height / 2 > checkNode.y + 100
                || this.birdNode.y - this.birdNode.height / 2 < checkNode.y) {
                this.gameOver(); //ゲームオーバー}
        }それ以外{
            if (this.checkState && this.checkStill){//状態チェック変数とゲーム進行中チェック変数の両方が true かどうかを判断します (&&)
                this.addScore(); //スコア追加関数を呼び出す}
            this.checkStill = true; //ゲームが変数にtrueを割り当てているかどうかを確認します
            this.checkState = false; // チェック状態変数を false に割り当てる
            this.up = 0;
        }
        this.curFrame++; // 鳥のフレーム レート変数を増やします if (this.curFrame > 2) { // フレーム レート変数が 2 より大きい場合は、フレーム レート変数を 0 に変更します。
            this.curFrame = 0;
        }
        if (this.birdNode.y) { //強度パラメータが0より大きい場合
            //bird ノードの Sprite コンポーネントの spriteFrame パラメータをフレーム レート パラメータに合わせて変更します。this.birdNode.getComponent(cc.Sprite).spriteFrame = this.spriteFrame[this.curFrame];
        }
    }
})

要約する

上記の鳥と鋼管の衝突の有無の検出は、数学的な計算方法によって実現されます。ただし、私のプロジェクト ファイルには、各パイプ ノード、エントランス ノード、および bird.js の BoxCollider コンポーネントに表示される cocos 衝突コンポーネントを使用するバージョンがまだ保持されています。作り方を学んだバックパックもあります。主にプリセット(cc.prefab)ノードを使用してバックパックのウィンドウを実現し、ウィンドウ内にプロップ画像(スプライト)を動的に読み込みます。まだ学習段階です。ご質問があれば、コメント欄でお気軽にご相談ください。他のプロジェクトについては後ほどシェアします!スタンドアロン版と LAN オンライン版の比較プロジェクトを含み、リソース マネージャー、ネットワーク通信マネージャー、シグナル スロットなどの最適化戦略も使用される場合があります。不十分な点がありましたらご容赦ください。

上記は、CocosCreator の定番の入門プロジェクトである flappybird の詳細です。CocosCreator で flappybird を作成する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • cocoscreatorプレハブの詳しい説明
  • CocosCreator でレイヤー管理に常駐ノードを使用する方法
  • ゲーム開発におけるサウンド処理にCocosCreatorを使用する方法
  • CocosCreator ScrollView 最適化シリーズ: フレーム読み込み
  • CocosCreatorプロジェクト構造の仕組みの詳細な説明
  • CocosCreatorオブジェクトプールの使い方
  • CocosCreatorでスワイプした位置にテクスチャを表示する方法
  • CocosCreatorの共通知識ポイントを整理する
  • CocosCreatorのホットアップデートの包括的な説明
  • CocosCreator ユニバーサルフレームワークデザインネットワーク
  • CocosCreatorを使ってシューティングゲームを作る方法
  • CocosCreatorでゲームコントローラーを使用する方法

<<:  CentOS のデフォルトの SSH ポート番号を変更する方法の例

>>:  MySQLアカウントのIP制限条件を変更する方法

推薦する

Nginx のステータス監視とログ分析の詳細な説明

1. Nginx ステータス監視Nginx には、Nginx の全体的なアクセス ステータスを監視す...

Linux で CPU 使用率が高くなる原因をトラブルシューティングするプロセスの詳細な説明

目次序文始めるステップトラブルシューティング序文CPU 使用率が高くなるのは、オンラインでよくある問...

JavaScript での AOP プログラミングの基本実装

AOP の紹介AOP (アスペクト指向プログラミング) の主な機能は、コアビジネスロジックモジュール...

Linux サーバーでの MySQL インストール情報の表示

mysql のインストール情報を表示します。 #ps -ef | grep mysql usr/bi...

el-table のテーブルを最適化するために仮想リストを使用する方法についての簡単な説明

目次序文解決具体的な実装満たすべき前提条件質問序文テーブルをよく使用します。データ量が多い場合は直接...

jsの継承の6つの方法を詳しく解説

プロトタイプチェーン継承プロトタイプ継承は、ECMAScript における主な継承方法です。基本的な...

素晴らしい CSS ナビゲーション バーの下線効果

中国初のカッター github.com/chokcocoまず、ここに画像があります。純粋な CSS ...

Vue3におけるキーの役割と動作原理についての簡単な説明

このキー属性の機能は何ですか?まずは公式の説明を見てみましょう。 kekey 属性は主に、新しいノー...

Kafka と Nginx の統合例

背景nginx-kafka-module は、Kafka を nginx に統合して、Web プロジ...

VMware で VMware ツールをインストールしてもインストール ファイルが表示されない問題を解決する方法

VMware ツールは VMware の使用に非常に便利です。そのため、VMware ツールをインス...

MySQL のクラスター化インデックスとクラスター化インデックスの成長の仕組みを理解する

このノートでは、 MySQL の B+Tree インデックスとは何ですか?クラスター化インデックスは...

Windows Server 2019 で NAS を構成する方法

序文このチュートリアルでは最新バージョンをインストールします。 NAS は非常に安定して動作するので...

MyBatis 動的 SQL の包括的な説明

目次序文動的SQL 1. まずモジュールのディレクトリ構造を見てみましょう2. 物理モデリングと論理...

MySQLテーブル内の重複データをクエリする方法

hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', '...

ミニプログラムはミニプログラムクラウドを使用してWeChatの支払い機能を実装します

目次1. WeChat Payを開く1.1 アフィリエイト加盟店番号1.2 加盟店番号を追加する1....