まず、この記事は、RPGゲームのゼロベース開発 - ゲームのスクリプト化を実現し、ゲームスクリプトを使用してマップシーンを切り替えるためのオープンソース講座シリーズの第4回目の記事であるようです。前回の更新から長い時間が経ちました。次の文章を読む前に、以下の最初の 3 つの記事の内容を理解する必要があります。
1. ゲーム スクリプトとは何ですか? 簡単に言えば、ゲーム スクリプトは、スクリプト内のカスタマイズされたステートメントを通じて、対応するロジックを実行できる、特定の形式で記述された実行可能ファイルです。
第二に、なぜゲームをスクリプト化する必要があるのか
3ゲームのスクリプトを作成する方法
現在ゲームに実装されている内容には、マップシーンの追加、ゲームキャラクターの追加、キャラクターダイアログの実装などが含まれます。そして、ゲーム スクリプトを設計するときに、これらのデータを含める必要があります。そうすれば、これら 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(); }
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 スクリプトを次のように変更します
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"} ] } };
上記のスクリプトは、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();
//游戏场景跳转测试 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) にご注意ください。