打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《游戏脚本的设计与开发》


   
 
 

       

  •      
            0.00 / 5     

         
            5     

       


  •    
         
           
           

  •           1 / 5
           


  •      
           
           

  •           2 / 5
           


  •      
           
           

  •           3 / 5
           


  •      
           
           

  •           4 / 5
           


  •      
           
           

  •           5 / 5
           


  •      
         


 

     0 votes, 0.00 avg. rating (0% score) 




     

上一章介绍了如何读取和解析一个脚本,


其实,对于一个游戏来说,文字的显示和操作是最基本的组成元素之一,本章进入正题,就先从文字显示开始讲解一下。


显示一个文字,就是将文字绘制到游戏界面上,而在lufylegend.js引擎中,要显示一个文本,只需要将LTextField对象添加到LSprite对象之上。


首先,为了便于操作游戏中的所有对象,我们来新建一个“仓库”LScriptArray,用于保存游戏中各种对象,如下。



  1. /*
  2. * LScriptArray.js
  3. **/
  4. function LScriptArray(){
  5. var self = this;
  6. self.textList = new Array();
  7. self.layerList = new Array();
  8. }

其中textList用来保存LTextField文本对象,layerList用来保存LSprite层对象,当然游戏中的对象种类肯定不止这么几个,比如图片,按钮等,这些对象等以后的章节中会陆续添加。


修改一下LScript类的构造器,如下



  1. function LScript(scriptLayer,value){
  2. var self = this;
  3. LGlobal.script = self;
  4. self.scriptLayer = scriptLayer;
  5. self.scriptArray = new LScriptArray();
  6. self.scriptArray.layerList["-"] = scriptLayer;
  7. self.dataList = new Array();
  8. var arr=[value];
  9. self.dataList.unshift(arr);
  10. self.toList(value);
  11. }

这样,我们就可以通过LGlobal.script.scriptArray获取到游戏中的所有对象了。

在L#脚本中与文字操作相关的脚本语法如下


1,添加一行文字



  1. Text.label(-,txt01,Hello World,0,0,30,#000000);

几个参数如下:


  1. 显示层,文字名称,文字内容,文字坐标x,文字坐标y,文字大小,文字颜色

2,改变一行文字的内容


  1. Text.labelChange(txt03,Hello Change,40,#FF0000);

几个参数如下:

  1. 文字名称,文字内容,文字大小,文字颜色

3,移除一行文字

  1. Text.remove(txt02);

参数如下:


  1. 文字名称



接着,修改解析函数中的switch部分,如下



  1. switch(sarr[0]){
  2. case "Load":
  3. ScriptLoad.analysis(lineValue);
  4. break;
  5. case "Text":
  6. ScriptText.analysis(lineValue);
  7. break;
  8. default:
  9. self.analysis();
  10. }

这样的话,遇到文字操作相关的脚本的话,就会调用ScriptText静态类的analysis函数。

下面看一下ScriptText类和analysis函数



  1. /*
  2. * ScriptText.js
  3. **/
  4. var ScriptText = function (){};
  5. ScriptText.analysis = function (value){
  6. var start = value.indexOf("(");
  7. var end = value.indexOf(")");
  8. switch(LMath.trim(value.substr(0,start))){
  9. case "Text.label":
  10. ScriptText.label(value,start,end);
  11. break;
  12. case "Text.labelChange":
  13. ScriptText.labelChange(value,start,end);
  14. break;
  15. case "Text.remove":
  16. ScriptText.removeText(value,start,end);
  17. break;
  18. default:
  19. LGlobal.script.analysis();
  20. }
  21. };

在这个函数里,遇到我定义的三个脚本的时候,就会通过调用三个不同的函数,并将脚本括号内的部分作为参数来进行解析,我们来一个个的实现这几个函数。
首先是ScriptText.label,如下


  1. ScriptText.label = function (value,start,end){
  2. var script = LGlobal.script;
  3. var lArr = value.substring(start+1,end).split(",");
  4. var layer,label,i;
  5. var layerStr = lArr[0];
  6. var nameStr = lArr[1];
  7. var textStr = lArr[2];
  8. layer = script.scriptArray.layerList[layerStr];
  9. var textArr = textStr.split("\\n");
  10. var textList = new Array();
  11. for(i=0;i<textArr.length;i++){
  12. label = new LTextField();
  13. label.size = lArr[5]-4;
  14. label.color = lArr[6];
  15. label.text = textArr[i];
  16. label.x = parseInt(lArr[3]);
  17. label.y = parseInt(lArr[4]) + label.getHeight()* i ;
  18. label.name = nameStr;
  19. layer.addChild(label);
  20. textList.push(label);
  21. }
  22. script.scriptArray.textList[nameStr] = textList;
  23. script.analysis();
  24. };

来解释一下上面的代码:

  1. var lArr = value.substring(start+1,end).split(",");

将参数分解到lArr数组。

  1. var layerStr = lArr[0];
  2. var nameStr = lArr[1];
  3. var textStr = lArr[2];

这样就从lArr数组中得到了相应的参数。

  1. layer = script.scriptArray.layerList[layerStr];

得到显示层,在这里只支持“-”这个参数,就是最底层,后面会详细讲解显示层脚本,支持其他参数。



  1. var textArr = textStr.split("\\n");
  2. var textList = new Array();
  3. for(i=0;i<textArr.length;i++){
  4. label = new LTextField();
  5. label.size = lArr[5]-4;
  6. label.color = lArr[6];
  7. label.text = textArr[i];
  8. label.x = parseInt(lArr[3]);
  9. label.y = parseInt(lArr[4]) + label.getHeight()* i ;
  10. label.name = nameStr;
  11. layer.addChild(label);
  12. textList.push(label);
  13. }

这里是考虑到换行的问题,在设置文字内容的时候,可以使用“\n”来换行。在这里将分割后的字符串用一个个的LTextField对象显示出来,然后将这些LTextField对象压入数组中。


  1. script.scriptArray.textList[nameStr] = textList;
  2. script.analysis();

将存有LTextField对象的数组保存进script.scriptArray.textList数组中,最后再调用script.analysis()继续进行解析。


接着是ScriptText.labelChange,如下



  1. ScriptText.labelChange = function (value,start,end){
  2. var script = LGlobal.script,i;
  3. var lArr = value.substring(start+1,end).split(",");
  4. var nameStr = lArr[0];
  5. var textStr = lArr[1];
  6. var textList = script.scriptArray.textList[nameStr];
  7. var x = textList[0].x;
  8. var y = textList[0].y;
  9. layer = textList[0].parent;
  10. for(i=0;i<textList.length;i++){
  11. label = textList[i];
  12. label.parent.removeChild(label);
  13. }
  14. textList = new Array();
  15. textArr = textStr.split("\\n");
  16. for(i=0;i<textArr.length;i++){
  17. label = new LTextField();
  18. label.size = lArr[2];
  19. label.color = lArr[3];
  20. label.text = textArr[i];
  21. label.x = x;
  22. label.y = y + label.getHeight()* i ;
  23. label.name = nameStr;
  24. layer.addChild(label);
  25. textList.push(label);
  26. }
  27. script.scriptArray.textList[nameStr] = textList;
  28. script.analysis();
  29. };

解释下代码


  1. var lArr = value.substring(start+1,end).split(",");
  2. var nameStr = lArr[0];
  3. var textStr = lArr[1];

这个跟前面一样,是获取参数。


  1. var textList = script.scriptArray.textList[nameStr];

用传入的文字名称来得到保存在script.scriptArray.textList数组中的LTextField对象组。


  1. var x = textList[0].x;
  2. var y = textList[0].y;

得到LTextField对象的坐标。


  1. layer = textList[0].parent;

得到LTextField对象的显示层。

  1. for(i=0;i<textList.length;i++){
  2. label = textList[i];
  3. label.parent.removeChild(label);
  4. }

为了改变文字内容,我先将被添加的LTextField对象删除。


  1. textList = new Array();
  2. textArr = textStr.split("\\n");
  3. for(i=0;i<textArr.length;i++){
  4. label = new LTextField();
  5. label.size = lArr[2];
  6. label.color = lArr[3];
  7. label.text = textArr[i];
  8. label.x = x;
  9. label.y = y + label.getHeight()* i ;
  10. label.name = nameStr;
  11. layer.addChild(label);
  12. textList.push(label);
  13. }
  14. script.scriptArray.textList[nameStr] = textList;
  15. script.analysis();

添加的LTextField对象已经被删除,剩下的就是按照新的文字内容重新添加LtextField对象,所以上面的代码和添加文字是一样的。


最后,再看看ScriptText.removeText,代码如下

  1. ScriptText.removeText = function (value,start,end){
  2. var lArr = value.substring(start+1,end).split(",");
  3. var nameStr = lArr[0];
  4. var script = LGlobal.script;
  5. var textList = script.scriptArray.textList[nameStr];
  6. if(textList == null){
  7. script.analysis();
  8. return;
  9. }
  10. for(i=0;i<textList.length;i++){
  11. label = textList[i];
  12. label.parent.removeChild(label);
  13. }
  14. script.scriptArray.textList[nameStr] = null;
  15. script.analysis();
  16. };

删除对象比较简单,和前面ScriptText.labelChange函数中移除部分是一样的。


下面看一下效果如何,


修改Main.ls脚本文件的代码,如下



  1. Text.label(-,txt01,Hello World,0,0,30,#000000);

运行代码,效果如下:



显示多个文字的话,修改Main.ls脚本文件的代码,如下



  1. Text.label(-,txt01,Hello World,0,0,30,#000000);
  2. Text.label(-,txt02,Hello World,0,50,30,#000000);
  3. Text.label(-,txt03,Hello World,0,100,30,#000000);

运行代码,效果如下



下面看看如何修改文字内容,修改Main.ls脚本文件的代码,如下


  1. Text.label(-,txt01,Hello World,0,0,30,#000000);
  2. Text.label(-,txt02,Hello World,0,50,30,#000000);
  3. Text.label(-,txt03,Hello World,0,100,30,#000000);
  4. Text.labelChange(txt03,Hello \nChange,40,#FF0000);

运行代码,效果如下



最后,看看改变删除文字对象,修改Main.ls脚本文件的代码,如下



  1. Text.label(-,txt01,Hello World,0,0,30,#000000);
  2. Text.label(-,txt02,Hello World,0,50,30,#000000);
  3. Text.label(-,txt03,Hello World,0,100,30,#000000);
  4. Text.labelChange(txt03,Hello \nChange,40,#FF0000);
  5. Text.remove(txt02);

运行代码,效果如下



测试连接如下


http://lufylegend.com/demo/test/lsharp/02/index.html


本章为止的lufylegend.lsharp.js源码如下


http://lufylegend.com/demo/test/lsharp/02/lufylegend.lsharp.js


《游戏脚本的设计与开发》系列文章目录


http://blog.csdn.net/lufy_legend/article/details/8888787





本章就讲到这里,欢迎继续关注我的博客


转载请注明:转自lufy_legend的博客http://blog.csdn.net/lufy_legend






      
 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
《游戏脚本的设计与开发》 第六章 按钮,脚本的暂停和标签 | Intel? Developer Zone
TArray可以这样初始化
真实经纬度(gps)转成百度坐标的js方法
利用js给datalist或select动态添加option选项
【百度地图API】如何制作多途经点的线路导航
腾讯地图API标注
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服