開発環境ココスクリエイター v2.3.1 Node.js v10.16.0 VSコード1.46.1 ゲームエンジンのコンセプトこれは、基礎となるインターフェースの使用をカプセル化し、ゲーム開発のコア機能プロバイダーとなる、事前に記述されたコードのセットとして理解できます。 一般的には 6 つの部分に分かれています。
Cocos Creatorについてプロジェクト構造ProjectName (プロジェクト フォルダ) 実際のプロジェクトを始めましょう コード編集環境を構成するVisual Studio Code (以下、VS Code と呼びます) は、Microsoft がリリースした新しい軽量クロスプラットフォーム IDE です。Windows、Mac、Linux プラットフォームをサポートしており、インストールと構成が非常に簡単です。 VS Code を使用してプロジェクト スクリプト コードを管理および編集すると、構文の強調表示やインテリジェントなコード プロンプトなどの機能を簡単に実装できます。 Cocos Creator APIアダプタプラグインをインストールするこの操作により、Cocos Creator API アダプター プラグインが VS Code グローバル プラグイン フォルダーにインストールされます。インストールが成功すると、コンソールに緑色のプロンプトが表示されます: プロジェクト内でスマートプロンプトデータを生成するコード作成中に Cocos Creator エンジン API を自動的にプロンプト表示したい場合は、メニューから API スマート プロンプト データを生成し、それをプロジェクト パスに自動的に配置する必要があります。 メイン メニューから、 [開発者] -> [VS Code ワークフロー] -> [VS Code IntelliSense データの更新]を選択します。この操作により、エンジン 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 はシーン エディターと階層マネージャーでこのシーンを開きます。シーンを開くと、階層マネージャーに現在のシーン内のすべてのノードとその階層関係が表示されます。先ほど作成したシーンには、 リソース パックのテクスチャ ディレクトリから空の背景画像を、ゲームの背景としてキャンバスにドラッグします。キャンバスと空のサイズを調整します。空のサイズは少なくともキャンバスより大きくなければなりません。そうでないと、作成したゲームに大きな黒い縁が現れる場合があります。次に、同様の方法を使用して、bird0 (他の 2 つは、鳥の飛行をシミュレートする簡単なフレーム アニメーションを作成するためのものです)、pipe1 (下のパイプ)、および pipe2 (上のパイプ) をキャンバスに追加します。上下のパイプがグループになっており、4グループコピーしたので合計5グループになります。背景と各パイプ セットはスクリプトによって制御され、左に移動して、鳥が継続的に前方に飛んでいる効果を実現します。 5. ノードバインディングCanvas の下にあるすべての要素はノード ノードの形式で管理されることに注意してください。 script - game.js に新しいスクリプト ファイルを作成し、それを Canvas にドラッグするか、Canvas に直接バインドします。シーンがロードされるときにスクリプトがロードされることを確認してください。 6. ライフサイクルコールバックCocos Creator は、コンポーネント スクリプトのライフサイクル コールバック関数を提供します。ユーザーが特定のコールバック関数を定義している限り、Creator は特定の時間に関連するスクリプトを自動的に実行するため、ユーザーが手動で呼び出す必要はありません。 現在ユーザーに提供されているライフサイクル コールバック関数は次のとおりです。
メインコードゲーム.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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: CentOS のデフォルトの SSH ポート番号を変更する方法の例
1. Nginx ステータス監視Nginx には、Nginx の全体的なアクセス ステータスを監視す...
目次序文始めるステップトラブルシューティング序文CPU 使用率が高くなるのは、オンラインでよくある問...
AOP の紹介AOP (アスペクト指向プログラミング) の主な機能は、コアビジネスロジックモジュール...
mysql のインストール情報を表示します。 #ps -ef | grep mysql usr/bi...
目次序文解決具体的な実装満たすべき前提条件質問序文テーブルをよく使用します。データ量が多い場合は直接...
プロトタイプチェーン継承プロトタイプ継承は、ECMAScript における主な継承方法です。基本的な...
中国初のカッター github.com/chokcocoまず、ここに画像があります。純粋な CSS ...
このキー属性の機能は何ですか?まずは公式の説明を見てみましょう。 kekey 属性は主に、新しいノー...
背景nginx-kafka-module は、Kafka を nginx に統合して、Web プロジ...
VMware ツールは VMware の使用に非常に便利です。そのため、VMware ツールをインス...
このノートでは、 MySQL の B+Tree インデックスとは何ですか?クラスター化インデックスは...
序文このチュートリアルでは最新バージョンをインストールします。 NAS は非常に安定して動作するので...
目次序文動的SQL 1. まずモジュールのディレクトリ構造を見てみましょう2. 物理モデリングと論理...
hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', '...
目次1. WeChat Payを開く1.1 アフィリエイト加盟店番号1.2 加盟店番号を追加する1....