Zuallererst ist dieser Artikel der vierte Artikel in der Zero-Based-Entwicklung von RPG-Spielen – einer Open-Source-Vortragsreihe zur Implementierung von Spielskripten und zur Verwendung von Spielskripten Es scheint, dass es seit dem letzten Update lange her ist, den Wechsel der Kartenszenen zu realisieren. Bevor Sie den folgenden Text lesen, müssen Sie verstehen, was in den ersten drei Artikeln erwähnt wird.
1. Was ist ein Spielskript?
Einfach ausgedrückt ist ein Spielskript eine ausführbare Datei, die in einem bestimmten Format geschrieben ist im Skript die entsprechende Logik ausführen.
Spielskripte können unsere Spiele dynamisch machen, zum Beispiel die Handlung, Ereignisse und Karten usw ., wenn wir das alles in das Programm schreiben, ist das natürlich möglich, aber sobald ein Problem auftritt, selbst ein paar Tippfehler, müssen wir diese Tippfehler zuerst korrigieren und das gesamte Programm neu kompilieren und veröffentlichen. Dieser Vorgang ist ziemlich ekelhaft , denn wenn das Spielprogramm ständig an den Spielinhalt angepasst wird, wird Ihr Programm nur immer komplexer. Wenn wir diese wiederholbaren Daten jedoch in Dateien außerhalb des Spielprogramms definieren und die Spiel-Engine entwickelt wird, führt unser Spiel die entsprechende Handlung und Ereignisse aus, indem es diese externen Dateien liest. Wenn dann, wie oben erwähnt, ein Problem mit unserem Spiel vorliegt Wir müssen nur diese externen Dateien ändern und nicht das gesamte Programm neu kompilieren. Dies macht unsere Spieleentwicklung bequem und prägnant.
* Für HTML5 ist es natürlich nicht nötig, das Programm neu zu kompilieren, aber für RPG-Spiele sind Skripte immer noch unerlässlich, da es unmöglich ist, alle Spielskripte in das Programm zu schreiben. .
Okay, als nächstes überlegen wir zunächst, in welcher Form das Spielskript erstellt werden soll haben? Es gibt mehrere Optionen, Sie können XML wählen, Sie können JSON wählen, oder Sie können reine benutzerdefinierte Syntax wählen,
Zum Beispiel habe ich das Flash-Spielskript L entwickelt # http://blog.csdn .net/lufy_legend/article/details/6889424
Um Ärger zu sparen, habe ich mich dieses Mal für JSON entschieden, das einfacher zu verarbeiten ist, da Javascript JSON-Daten problemlos verarbeiten kann .
Zu den derzeit im Spiel implementierten Inhalten gehören das Hinzufügen von Kartenszenen, das Hinzufügen von Spielcharakteren und die Implementierung von Charakterdialogen. Wenn ich dann das Spielskript entwerfe, muss ich diese Daten einbeziehen, und dann können diese drei Funktionen vom Skript gesteuert werden.
Schauen Sie sich zuerst den JSON unten an
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:"真的吗?一定要想想办法啊。"} ] } } };
Bei der eigentlichen Erstellung des Spiels sollte das Skript in einem externen Dokument gespeichert werden Nur die Theorie zu erklären und wie man sie verbessern kann, ist ein anderes Thema, haha.
Wie Sie sehen können, enthält der JSON Kartenarrays und Kartendatenarrays im Zusammenhang mit der Karte, Daten im Zusammenhang mit hinzugefügten Zeichen und Arrays für Dialoge. Auf diese Weise muss ich beim Anzeigen des Spiels nur die JSON-Daten lesen und dann den Spielbildschirm basierend auf diesen Inhalten anzeigen. Ich definiere eine InitScript-Funktion, um diese Vorgänge auszuführen.
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(); }
Die Methode „removeAllChild“ ist eine einzigartige Methode der Lufylegend-Engine, mit der alle Unterobjekte auf der LScript-Anzeigeebene entfernt werden können, wodurch die Initialisierung jeder Anzeigeebene in dieser realisiert wird Spiel.
Ändern Sie die addChara-Methode wie folgt
//添加人物 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); } }
Das heißt, Sie fügen Charaktere im Spiel basierend auf dem Add-Array im JSON-Skript hinzu.
Okay, führen Sie das Spiel aus. Sie können sehen, dass das Spiel normal angezeigt wird, genau das gleiche wie zuvor und die gleichen Funktionen implementiert.
Damit jeder die Bequemlichkeit von Spielskripten sehen kann, werden jetzt Skripte zum Wechseln von Szenen in verwendet Spiel. .
Ändern Sie das JSON-Skript wie folgt
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"} ] } };
Wie Sie sehen können, habe ich stage02, die zweite Szene, hinzugefügt und den Sprungknoten in das Skript eingeführt, um die Spielszene zu steuern Umschalten, wobei at in jump die Koordinate darstellt, zu der sich der Spielprotagonist bewegt, und to den Namen des Bildschirms darstellt, zu dem nach Erreichen dieser Koordinate gesprungen werden soll. Der Grund, warum der Sprung hier ein Array ist, liegt darin, dass eine Szene auch zu mehreren anderen Szenen springen kann.
Das obige Skript realisiert den gegenseitigen Sprung zwischen den Szenen Stage01 und Stage02.
Um diesen Sprung zu lesen und zu implementieren, müssen wir beurteilen, ob er springen soll, nachdem sich der Spielprotagonist einen Schritt bewegt hat, und die Onmove-Methode der Character-Klasse ändern
/** * 开始移动 **/ 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); } };
Ich habe eine Zeile
if(self.isHero && self.moveIndex > 0)checkJump();
hinzugefügt, um anzuzeigen, dass nach der Bewegung, wenn der Charakter der Protagonist des Spiels ist, ein Sprungurteil gefällt wird
Also müssen wir a hinzufügen checkJump-Methode
//游戏场景跳转测试 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; } } }
Okay, alles ist ganz einfach und sehen Sie den Effekt. Wenn der kleine Naruto zur Tür des kleinen Raums auf der Karte geht, springt die Szene
Spieltest-URL:
Das lufylegend.js-Engine-Paket enthält diese Demo. Bitte laden Sie die lufylegend.js-Engine direkt herunter und sehen Sie sich den Quellcode im Engine-Paket an
Download-Adresse der lufylegend.js-Engine
http://lufylegend.com/lufylegend
Das Obige ist HTML5-Spieleentwicklung – nullbasierte Entwicklung von RPG-Spielen – Open-Source-Vorlesung ( 4) - Spielskripte und Map-Jump-Inhalte. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!