目次
たとえば、RPG ゲームを開発する場合、プロット、イベント、マップなどをすべてプログラム内に記述すると、ゲーム スクリプトを使用してゲームを動的にすることができます。もちろん可能ですが、問題が発生すると、たとえいくつかのタイプミスであっても、まずこれらのタイプミスを修正し、プログラム全体を再コンパイルしてリリースする必要があります。ゲームのプログラムが常に変更されている場合、このプロセスは非常に好ましくありません。ゲームの内容によっては、プログラムがますます複雑になるだけです。しかし、これらの反復可能なデータをゲーム プログラムの外部のファイルに定義すると、ゲーム エンジンの開発時に、ゲームはこれらの外部ファイルを読み取って対応するプロットとイベントを実行します。その後、前述したように、ゲームに問題がある場合、これらの外部ファイルを変更するだけでよく、プログラム全体を再コンパイルする必要がないため、ゲーム開発が便利かつ簡潔になります。
それでは、まず、ゲーム スクリプトの作成にどのような形式を使用するかを考えてみましょう。xml を選択することも、json を選択することも、純粋なカスタム構文を選択することもできます。
ホームページ ウェブフロントエンド H5 チュートリアル HTML5ゲーム開発 - RPGゲームのゼロベース開発 - オープンソース講座(4) - ゲームスクリプティング&マップジャンプ

HTML5ゲーム開発 - RPGゲームのゼロベース開発 - オープンソース講座(4) - ゲームスクリプティング&マップジャンプ

Mar 02, 2017 pm 02:08 PM


まず、この記事は、RPGゲームのゼロベース開発 - ゲームのスクリプト化を実現し、ゲームスクリプトを使用してマップシーンを切り替えるためのオープンソース講座シリーズの第4回目の記事であるようです。前回の更新から長い時間が経ちました。次の文章を読む前に、以下の最初の 3 つの記事の内容を理解する必要があります。

1. ゲーム スクリプトとは何ですか? 簡単に言えば、ゲーム スクリプトは、スクリプト内のカスタマイズされたステートメントを通じて、対応するロジックを実行できる、特定の形式で記述された実行可能ファイルです。


第二に、なぜゲームをスクリプト化する必要があるのか​​

たとえば、RPG ゲームを開発する場合、プロット、イベント、マップなどをすべてプログラム内に記述すると、ゲーム スクリプトを使用してゲームを動的にすることができます。もちろん可能ですが、問題が発生すると、たとえいくつかのタイプミスであっても、まずこれらのタイプミスを修正し、プログラム全体を再コンパイルしてリリースする必要があります。ゲームのプログラムが常に変更されている場合、このプロセスは非常に好ましくありません。ゲームの内容によっては、プログラムがますます複雑になるだけです。しかし、これらの反復可能なデータをゲーム プログラムの外部のファイルに定義すると、ゲーム エンジンの開発時に、ゲームはこれらの外部ファイルを読み取って対応するプロットとイベントを実行します。その後、前述したように、ゲームに問題がある場合、これらの外部ファイルを変更するだけでよく、プログラム全体を再コンパイルする必要がないため、ゲーム開発が便利かつ簡潔になります。

* もちろん、HTML5 の場合はプログラムを再コンパイルする必要はありませんが、RPG ゲームの場合は、すべてのゲーム スクリプトをプログラムに書き込むことは不可能であるため、スクリプトは依然として不可欠です...


3ゲームのスクリプトを作成する方法

それでは、まず、ゲーム スクリプトの作成にどのような形式を使用するかを考えてみましょう。xml を選択することも、json を選択することも、純粋なカスタム構文を選択することもできます。

例えば私が開発したフラッシュゲームスクリプトL#はjsonデータを簡単に扱えます。

現在ゲームに実装されている内容には、マップシーンの追加、ゲームキャラクターの追加、キャラクターダイアログの実装などが含まれます。そして、ゲーム スクリプトを設計するときに、これらのデータを含める必要があります。そうすれば、これら 3 つの機能をスクリプトで制御できるようになります。
まずは以下のjsonを見てください

var script = {
	stage01:{
		map:[
		    [18,18,18,18,18,18,18,18,18,18,18,18,55,55,18,18,18],
			[18,18,18,17,17,17,17,17,17,17,17,17,55,55,17,17,18],
			[18,18,17,17,17,17,18,18,17,17,17,17,55,55,17,17,18],
			[18,17,17,17,18,18,18,18,18,17,17,55,55,17,17,17,18],
			[18,17,17,18,22,23,23,23,24,18,17,55,55,17,17,17,18],
			[18,17,17,18,25,28,26,79,27,18,55,55,17,17,17,17,18],
			[18,17,17,17,17,10,11,12,18,18,55,55,17,17,17,17,18],
			[18,18,17,17,10,16,16,16,11,55,55,17,17,17,17,17,18],
			[18,18,17,17,77,16,16,16,16,21,21,17,17,17,17,17,18],
			[18,18,17,17,77,16,16,16,16,55,55,17,17,17,17,17,18],
			[18,18,18,18,18,18,18,18,18,55,55,18,18,18,18,18,18]],
		mapdata:[
			[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
			[1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1],
			[1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1],
			[1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,1],
			[1,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,1],
			[1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,0,1],
			[1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1],
			[1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],
			[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
			[1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],
			[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],
		add:[
		     {chara:"player",img:"mingren",x:5,y:6},
		     {chara:"npc",img:"npc1",x:7,y:6},
		     {chara:"npc",img:"npc1",x:3,y:3}],
		talk:{
			talk1:[
		    		  {img:"m",name:"鸣人",msg:"我是木叶村的鸣人,你是谁?"},
		    		  {img:"n",name:"黑衣忍者甲",msg:"你就是鸣人?九尾还在你身体里吗?"}
		    	  ],
		    talk2:[
		    	      {img:"n",name:"黑衣忍者乙",msg:"鸣人,听说忍者大战就要开始了。"},
		    		  {img:"m",name:"鸣人",msg:"真的吗?一定要想想办法啊。"}
		    	  ]
		}
	}


};
ログイン後にコピー

実際にゲームを作る場合はスクリプトを外部ドキュメントに格納する必要がありますが、ここでは理論を説明します。はは。
jsonには、マップに関連するマップ配列とマップデータ配列、キャラクターに関連する追加データ、ダイアログの配列が含まれていることがわかります。このように、ゲームを表示する際にはjsonデータを読み込んで、その内容を元にゲーム画面を表示するだけの操作を行うinitScript関数を定義します。

function initScript(){
	//地图位置初始化
	mapLayer.x = 0;
	mapLayer.y = 0;


	//地图层初始化
	mapLayer.removeAllChild();
	//人物层初始化
	charaLayer.removeAllChild();
	//效果层初始化
	effectLayer.removeAllChild();
	//对话层初始化
	talkLayer.removeAllChild();
	
	//地图数据获取
	map = stage.map;
	mapdata = stage.mapdata;
	//对话数据获取
	talkScriptList = stage.talk;
	
	//添加地图
	addMap(0,0);
	delMap();
	//添加人物
	addChara();
}
ログイン後にコピー

removeAllChild メソッドは lufylegend エンジン固有のメソッドで、LScript 表示レイヤー上のすべてのサブオブジェクトを削除することで、このゲームの各表示レイヤーの初期化を実現できます。

addCharaメソッドを以下のように変更します

//添加人物
function addChara(){
	var charaList = stage.add;
	var chara,charaObj;
	for(var i=0;i<charaList.length;i++){
		charaObj = charaList[i];
		if(charaObj.chara == "player"){
			//加入英雄
			bitmapdata = new LBitmapData(imglist[charaObj.img]);
			chara = new Character(true,i,bitmapdata,4,4);
			player = chara;
		}else{
			//加入npc
			bitmapdata = new LBitmapData(imglist[charaObj.img]);
			chara = new Character(false,i,bitmapdata,4,4);
		}
		chara.x = charaObj.x * 32;
		chara.y = charaObj.y * 32;
		charaLayer.addChild(chara);
	}
}
ログイン後にコピー

つまり、jsonスクリプトのadd配列に基づいてゲーム内にキャラクターを追加します。

それでは、ゲームを実行してみましょう。ゲームが以前とまったく同じように正常に表示され、同じ機能が実装されていることがわかります。


四、ゲームスクリプトを使用してマップを切り替える

ゲームスクリプトの便利さを誰もが理解できるように、ゲーム内のシーンを切り替えるためにスクリプトが使用されるようになりました。 json スクリプトを次のように変更します

var script = {
	stage01:{
		map:[
		    [18,18,18,18,18,18,18,18,18,18,18,18,55,55,18,18,18],
			[18,18,18,17,17,17,17,17,17,17,17,17,55,55,17,17,18],
			[18,18,17,17,17,17,18,18,17,17,17,17,55,55,17,17,18],
			[18,17,17,17,18,18,18,18,18,17,17,55,55,17,17,17,18],
			[18,17,17,18,22,23,23,23,24,18,17,55,55,17,17,17,18],
			[18,17,17,18,25,28,26,79,27,18,55,55,17,17,17,17,18],
			[18,17,17,17,17,10,11,12,18,18,55,55,17,17,17,17,18],
			[18,18,17,17,10,16,16,16,11,55,55,17,17,17,17,17,18],
			[18,18,17,17,77,16,16,16,16,21,21,17,17,17,17,17,18],
			[18,18,17,17,77,16,16,16,16,55,55,17,17,17,17,17,18],
			[18,18,18,18,18,18,18,18,18,55,55,18,18,18,18,18,18]],
		mapdata:[
			[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
			[1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1],
			[1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1],
			[1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,1],
			[1,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,1],
			[1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,0,1],
			[1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1],
			[1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],
			[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
			[1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],
			[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],
		add:[
		     {chara:"player",img:"mingren",x:5,y:6},
		     {chara:"npc",img:"npc1",x:7,y:6},
		     {chara:"npc",img:"npc1",x:3,y:3}],
		talk:{
			talk1:[
		    		  {img:"m",name:"鸣人",msg:"我是木叶村的鸣人,你是谁?"},
		    		  {img:"n",name:"黑衣忍者甲",msg:"你就是鸣人?九尾还在你身体里吗?"}
		    	  ],
		    talk2:[
		    	      {img:"n",name:"黑衣忍者乙",msg:"鸣人,听说忍者大战就要开始了。"},
		    		  {img:"m",name:"鸣人",msg:"真的吗?一定要想想办法啊。"}
		    	  ]
		},
		jump:[
		      {at:{x:6,y:5},to:"stage02"}
		]
	},
	stage02:{
		map:[
		    [0,0,1,2,2,2,2,2,2,2,2,1,0,0,0],
		    [0,0,1,3,5,5,1,5,5,5,5,1,0,0,0],
		    [0,0,1,80,4,4,1,80,4,4,4,1,0,0,0],
		    [0,0,1,80,4,4,1,80,8,7,8,1,0,0,0],
			[0,0,1,80,4,4,5,81,4,4,4,1,0,0,0],
			[0,0,1,2,2,2,6,4,4,4,4,1,0,0,0],
			[0,0,1,3,5,5,81,4,4,4,4,1,0,0,0],
			[0,0,1,80,4,4,4,4,4,4,9,1,0,0,0],
			[0,0,1,2,2,2,2,6,2,2,2,1,0,0,0]],
		mapdata:[
			[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
			[1,1,1,0,0,0,1,0,0,0,0,1,1,1,1],
			[1,1,1,0,0,0,1,0,0,0,0,1,1,1,1],
			[1,1,1,0,0,0,1,0,0,1,0,1,1,1,1],
			[1,1,1,0,0,0,0,0,0,0,0,1,1,1,1],
			[1,1,1,1,1,1,0,0,0,0,0,1,1,1,1],
			[1,1,1,0,0,0,0,0,0,0,0,1,1,1,1],
			[1,1,1,0,0,0,0,0,0,0,1,1,1,1,1],
			[1,1,1,1,1,1,1,0,1,1,1,1,1,1,1]],
		add:[
		     {chara:"player",img:"mingren",x:7,y:8},
		     {chara:"npc",img:"npc1",x:8,y:3},
		     {chara:"npc",img:"npc1",x:10,y:3}],
		talk:{
		      talk1:[
		    	        {img:"m",name:"鸣人",msg:"你们在干什么啊?"},
			    		{img:"n",name:"黑衣忍者甲",msg:"我们在喝茶。"}
		    	  ],
		      talk2:[
			    	    {img:"n",name:"黑衣忍者乙",msg:"我们在喝茶,你不要打扰我们。"},
			    		{img:"m",name:"鸣人",msg:"....."}
		    	  ]
		},
		jump:[
		      {at:{x:7,y:8},to:"stage01"}
		]
	}


};
ログイン後にコピー

ご覧のとおり、2 番目のシーンである stage02 を追加し、ゲーム シーンの切り替えを制御するジャンプ ノードをスクリプトに導入しました。ゲームの主人公が到達した座標。 to はその座標に到達した後にジャンプする画面の名前を表します。ここでジャンプが配列である理由は、1 つのシーンが他の複数のシーンにもジャンプできるためです。

上記のスクリプトは、stage01とstage02のシーン間の相互ジャンプを実現しています。
このジャンプを読み込んでジャンプを実装するには、ゲームの主人公が一歩進んだ後にジャンプするかどうかを判断し、Characterクラスのonmoveメソッドを修正する必要があります

/**
 * 开始移动 
 **/
Character.prototype.onmove = function (){
	var self = this;
	//设定一个移动步长中的移动次数
	var ml_cnt = 4;
	//计算一次移动的长度
	var ml = STEP/ml_cnt;
	//根据移动方向,开始移动
	switch (self.direction){
		case UP:
			if(mapmove){
				mapLayer.y += ml;
				charaLayer.y += ml;
			}
			self.y -= ml;
			break;
		case LEFT:
			if(mapmove){
				mapLayer.x += ml;
				charaLayer.x += ml;
			}
			self.x -= ml;
			break;
		case RIGHT:
			if(mapmove){
				mapLayer.x -= ml;
				charaLayer.x -= ml;
			}
			self.x += ml;
			break;
		case DOWN:
			if(mapmove){
				mapLayer.y -= ml;
				charaLayer.y -= ml;
			}
			self.y += ml;
			break;
	}
	self.moveIndex++;
	//当移动次数等于设定的次数,开始判断是否继续移动
	if(self.moveIndex >= ml_cnt){
		//一个地图步长移动完成后,判断地图是否跳转
		if(self.isHero && self.moveIndex > 0)checkJump();
		self.moveIndex = 0;
		//一个地图步长移动完成后,如果地图处于滚动状态,则移除多余地图块
		if(mapmove)delMap();
		//如果已经松开移动键,或者前方为障碍物,则停止移动,否则继续移动
		if(!isKeyDown || !self.checkRoad()){
			self.move = false;
			return;
		}else if(self.direction != self.direction_next){
			self.direction = self.direction_next;
			self.anime.setAction(self.direction);
		}
		//地图是否滚动
		self.checkMap(self.direction);
	}
};
ログイン後にコピー

に行

if(self.isHero && self.moveIndex > 0)checkJump();
ログイン後にコピー

を追加しましたExpress 、移動後、キャラクターがゲームの主人公の場合、ジャンプ判定が行われます
そこで、 checkJump メソッドを追加する必要があります

//游戏场景跳转测试
function checkJump(){
	var jump = stage.jump;
	var jumpstage;
	for(var i=0;i<jump.length;i++){
		jumpstage = jump[0];
		if(player.x == jumpstage.at.x * 32 && player.y == jumpstage.at.y * 32){
			//获取该场景脚本数据
			stage = script[jumpstage.to];
			//开始跳转
			initScript(stage);
			return;
		}
	}
}
ログイン後にコピー

さて、すべては非常に簡単です。ゲームを実行して効果を確認してみましょう、小さなナルトがマップに向かって歩きました シーンは小さなドア部分にジャンプします



ゲームテストURL:

http://lufylegend.com/demo/rpg/index.html

lufylegend.js エンジン パッケージにはこのデモが含まれています。lufylegend.js エンジンを直接ダウンロードして、エンジン パッケージ内のソース コードを表示してください

lufylegend.js エンジンのダウンロード アドレス

http://lufylegend.com/lufylegend

以上がhtml5ゲーム開発〜RPGゲームのゼロベース開発〜オープンソース講座(4)〜ゲームスクリプティング&マップジャンプの内容です、その他の関連コンテンツ PHP 中国語 Web サイト (www.php.cn) にご注意ください。



このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLの表の境界線 HTMLの表の境界線 Sep 04, 2024 pm 04:49 PM

HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML のネストされたテーブル HTML のネストされたテーブル Sep 04, 2024 pm 04:49 PM

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML 左マージン HTML 左マージン Sep 04, 2024 pm 04:48 PM

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

HTML テーブルのレイアウト HTML テーブルのレイアウト Sep 04, 2024 pm 04:54 PM

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML入力プレースホルダー HTML入力プレースホルダー Sep 04, 2024 pm 04:54 PM

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

HTML 順序付きリスト HTML 順序付きリスト Sep 04, 2024 pm 04:43 PM

HTML 順序付きリストのガイド。ここでは、HTML 順序付きリストと型の導入とその例についても説明します。

HTML の onclick ボタン HTML の onclick ボタン Sep 04, 2024 pm 04:49 PM

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。

HTML 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

See all articles