请选择 进入手机版 | 继续访问电脑版
查看: 6779|回复: 172

[新手教程] html5游戏开发圣诞老人送礼物小游戏

  [复制链接]
最佳答案
0 
guofinni 发表于 2017-1-17 14:18:21 | 显示全部楼层 |阅读模式


今天我也以零基础为视点,为大家讲述如何开发一款简单的游戏。希望大家看了这篇文章,能使你对理解游戏开发有帮助。


1,如何进行游戏开发

1.1游戏开发思想


本文依然要运用OOP思想(Object Oriented Programming,面向对象编程),毕竟它很重要,很方便。
首先,为了让大家了解游戏开发的一些思想,我不妨说一下我对游戏开发的理解:
在游戏开发中,不是需要一个角色就要去立刻手动建设一个角色的。倘若是一个不断变化的游戏,用手慢慢改,那还不得累死。因此我们就需要用到循环或者时间轴事件。具体用循环还是时间轴事件,要看你是如何设计游戏。循环不要说,我们主要说说时间轴事件。
时间轴事件相当于一个循环,在它内部要执行的内容会不断地执行,也就是说是一个死循环。既然是死循环,那要改变游戏里的内容就会变得相当简单。只需要在外部更改界面上的属性,然后在时间轴事件内不断判断属性,执行变化即可。


1.2类的使用


另外还需要注意的是,游戏开发需要用到类。javascript定义类很简单,只用定义一个函数就行,属性用this来加。如下:
  1. function people(){  
  2.     this.name = "yorhom";  
  3.     this.age = "13";  
  4. }  
复制代码

类的作用很大,加入有界面上有3个角色,我们只用循环3次,每循环一次就用局部变量来实例化一个角色类即可。
类操作里面比较重要一项的就是继承。比如说在lufylegend.js中,如果你的类继承自LSprite类,那就拥有show方法,到时候你在使用你的类时,只用更改属性,不用手动重绘就可以更新界面。除了方便以外,它还可以替你免去一些多余的代码。假如父类有个加鼠标事件的方法,而子类想要也,那就不需要在重新写一遍了,直接继承就行了。


2,开始游戏开发

2.1开发准备


由于本次开发用到了lufylegend.js开源引擎,所以首先需要下载它。
下载地址:http://lufylegend.com/lufylegend
API 文档:http://lufylegend.com/lufylegend/api
另外,由于是html5游戏,所以你需要一个支持html5的浏览器。当然,如果你已经有了这样的浏览器,那就直接开始吧。


2.2开始编程


首先来看一下Main.js。首先定义一些层变量:
  1. var backLayer,  
  2. loadingLayer,  
  3. logoLayer,  
  4. sceneLayer,  
  5. snowLayer,  
  6. stageLayer,  
  7. charaLayer,  
  8. overLayer,  
  9. gameoverLayer;  
复制代码

另外一些闲杂变量:
  1. var point = 0,time = 1000*30;  
  2. var showTime;  
  3. var plopSound,backSound;  
  4. var playerName;  
  5. var pointText,timeText,resultText;  
复制代码

还有几个散乱的家伙藏在角落里,也被我给找到贴出来:
  1. var snowingSpeed = 0;  
  2. var snowingSpeedIndex = 20;  
  3. var snowChildList = [];  
  4. var canSnowing = true;  
  5. var showChara = false;  
复制代码

接下来初始化引擎
  1. init(50,"mylegend",600,400,main);  
  2. LSystem.screen(LStage.FULL_SCREEN);  
复制代码

init是引擎初始化函数,用法如下:
------------------------------------------------------------------------------
init(
    speed,
    divid,
    width,
    height,
    completeFunc,
    type
)


■作用:
库件初始化

■参数:
speed:游戏速度设定
divid:传入一个div的id,库件进行初始化的时候,会自动将canvas加入到此div内部
width:游戏界面宽
height:游戏界面高
completeFunc:游戏初始化后,调用此函数
type:当为null时,会先进行页面的onload操作,如果你的init函数调用是在onload之后,那么需要将此参数设为LEvent.INIT
------------------------------------------------------------------------------  

LSystem.screen是一调整屏幕大小的方法。如果参数写LStage.FULL_SCREEN说明调整为全屏。
接下来是加载图片:
  1. var imglist = [];  
  2. var imgData = [  
  3.     {path:"./js/gameLogo.js",type:"js"},  
  4.     {path:"./js/Charactor.js",type:"js"},  
  5.     {path:"./js/Stage.js",type:"js"},  
  6.     {name:"player",path:"./images/airplane.png"},  
  7.     {name:"logoback",path:"./images/logoback.jpg"},  
  8.     {name:"background",path:"./images/background.png"},  
  9.     {name:"house",path:"./images/house.png"},  
  10.     {name:"costume0",path:"./images/costume0.png"},  
  11.     {name:"costume1",path:"./images/costume1.png"},  
  12.     {name:"costume2",path:"./images/costume2.png"},  
  13.     {name:"costume3",path:"./images/costume3.png"},  
  14.     {name:"costume4",path:"./images/costume4.png"},  
  15.     {name:"costume5",path:"./images/costume5.png"},  
  16.     {name:"costume6",path:"./images/costume6.png"},  
  17.     {name:"costume7",path:"./images/costume7.png"}  
  18. ];  
复制代码

上面是加载图片列表,以下是加载时用的代码:
  1. //开始加载图片  
  2. LLoadManage.load(  
  3.     imgData,  
  4.     function(progress){  
  5.         //绘制进度条  
  6.         loadingLayer.setProgress(progress);  
  7.     },  
  8.     function(result){  
  9.         imglist = result;  
  10.         removeChild(loadingLayer);  
  11.         loadingLayer = null;  
  12.         //初始化游戏  
  13.         gameInit();  
  14.         //加入开始界面  
  15.         addLogo();  
  16.     }  
  17. );  
复制代码

将以上代码写到main函数中,就可以实现加载图片了。LLoadManage类是lufylegend中一个加载图片的类,用它可以方便地加载图片。用法如下:

------------------------------------------------------------------------------
load($list,$onupdate,$oncomplete)

■作用:
读取文件组

■参数:
$list:文件数组
$onupdate:读取中调用函数,一般用来显示游戏进度
$oncomplete:全部文件读取完成后调用函数

■详细说明:
这个函数可以接收一个数组,然后加载数组里的所有文件
------------------------------------------------------------------------------
这样做的好处是可以在使用图片时更方便,只用写path对应的name上去就行了。
整个main函数代码如下:
  1. function main(){  
  2.     //初始化加载层  
  3.     loadingLayer = new LoadingSample3();  
  4.     addChild(loadingLayer);  
  5.     //开始加载图片  
  6.     LLoadManage.load(  
  7.         imgData,  
  8.         function(progress){  
  9.             //绘制进度条  
  10.             loadingLayer.setProgress(progress);  
  11.         },  
  12.         function(result){  
  13.             imglist = result;  
  14.             removeChild(loadingLayer);  
  15.             loadingLayer = null;  
  16.             //初始化游戏  
  17.             gameInit();  
  18.             //加入开始界面  
  19.             addLogo();  
  20.         }  
  21.     );  
  22.     //加载声效音乐  
  23.     plopSound = new LSound();  
  24.     var plopUrl = "./sounds/plop.mp3";  
  25.     plopSound.load(plopUrl);  
  26.     //加载背景音乐  
  27.     backSound = new LSound();  
  28.     var backsoundUrl = "./sounds/back_music.mp3";  
  29.     backSound.load(backsoundUrl);  
  30. }  
复制代码

在上面的代码中,我用LSound类加了背景音乐,这样一来顺便试一下新功能。看看gameInit里代码:
  1. function gameInit(){  
  2.     //初始化层  
  3.     initLayer();  
  4.     //加入时间轴事件  
  5.     backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);  
  6.     //加入鼠标事件  
  7.     backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,onmousedown);  
  8. }
复制代码

initLayer和onmousedown中的代码:
  1. function onmousedown(event){  
  2.     //播放声效音乐  
  3.     plopSound.play();  
  4.     if(showChara == true && stageLayer.childList.length < 6){  
  5.         //加入障碍物  
  6.         addStage();  
  7.     }  
  8. }  
  9. function initLayer(){  
  10.     //加入底板层  
  11.     backLayer = new LSprite();  
  12.     addChild(backLayer);  
  13.     //加入图标层  
  14.     logoLayer = new LSprite();  
  15.     backLayer.addChild(logoLayer);  
  16.     //加入雪花层  
  17.     snowLayer = new LSprite();  
  18.     backLayer.addChild(snowLayer);  
  19.     //加入场景层  
  20.     sceneLayer = new LSprite();  
  21.     backLayer.addChild(sceneLayer);  
  22.     //加入礼物层  
  23.     stageLayer = new LSprite();  
  24.     backLayer.addChild(stageLayer);  
  25.     //加入人物层  
  26.     charaLayer = new LSprite();  
  27.     backLayer.addChild(charaLayer);  
  28.     //加入输出层  
  29.     overLayer = new LSprite();  
  30.     backLayer.addChild(overLayer);  
  31.     //加入游戏结束层  
  32.     gameoverLayer = new LSprite();  
  33.     backLayer.addChild(gameoverLayer);  
  34. }  
复制代码

以上代码都添加了注释,很容易看懂。有几个引擎中的类的用法提一下,LSprite用法:

------------------------------------------------------------------------------
LSprite()

■作用:
LSprite 类是基本显示列表构造块,一个可显示图形并且也可包含子项的显示列表节点。

■可用属性:
type:类型
x:坐标x
y:坐标y
scaleX:X坐标方向上的缩放比例
scaleY:Y坐标方向上的缩放比例
alpha:透明度
rotate:旋转角度
visible:是否可见,当设为false的时候,该LBitmap对象不可视,且内部所有处理都将停止
childList:该对象的所有子项
graphics:指定属于此 LSprite 的 LGraphics 对象,在此 LSprite 中可执行矢量绘图命令。
box2dBody:结合box2dweb后,创建的body2d
mask:遮罩
filters:光晕效果,具体可参照LDropShadowFilter类的介绍
------------------------------------------------------------------------------


addEventListener的用法:
------------------------------------------------------------------------------

addEventListener(type,listener)

■作用:
注册事件侦听器对象,以使侦听器能够接收事件通知。

■参数:
type:事件的类型。
listener:处理事件的侦听器函数。
------------------------------------------------------------------------------  

在加载函数中,我调用了addLogo,它是用来显示开场界面的。由于游戏本身很简单,所以要加一个很绚丽的开场界面。
addLogo的代码如下:
  1. var logoText;  
  2. var startBtn;  
  3. function addLogo(){  
  4.     //加入背景  
  5.     var bitmapData = new LBitmapData(imglist["logoback"],0,0,1024,768);  
  6.     var bitmap = new LBitmap(bitmapData);  
  7.     bitmap.scaleX = 0.6;  
  8.     bitmap.scaleY = 0.6;  
  9.     logoLayer.addChild(bitmap);  
  10.     //加入文字  
  11.     addLogoText();  
  12. }  
复制代码

在其中我给背景添上图片,用到了LBitmapData和LBitmap。用法很多,大家可以自己去API里看看。这里就先不多说了。

addLogoText里的代码:
  1. function addLogoText(){  
  2.     //大标题  
  3.     logoText = new LTextField();  
  4.     logoText.size = 50;  
  5.     logoText.color = "white";  
  6.     logoText.font = "HG行書体";  
  7.     logoText.text = "Christmas";  
  8.     logoText.stroke = true;  
  9.     logoText.lineWidth = 2;  
  10.     logoText.x = 50;  
  11.     logoText.y = 20;  
  12.     logoLayer.addChild(logoText);  
  13.     //加入滤镜效果  
  14.     var titleShadow = new LDropShadowFilter(5,45,"red");  
  15.     for(var i=0;i<2;i++){  
  16.         logoText.filters = [titleShadow];  
  17.         logoLayer.addChild(logoText);  
  18.     }  
  19.     //开始指示  
  20.     logoText = new LTextField();  
  21.     logoText.size = 30;  
  22.     logoText.color = "white";  
  23.     logoText.font = "HG行書体";  
  24.     logoText.text = "Tap to Start Game";  
  25.     logoText.x = 150;  
  26.     logoText.y = 190;  
  27.     logoLayer.addChild(logoText);  
  28.     //加入开始游戏事件  
  29.     logoLayer.addEventListener(LMouseEvent.MOUSE_UP,startGame);  
  30.     //加入滤镜效果  
  31.     var shadow = new LDropShadowFilter(5,45,"black",0);  
  32.     logoText.filters = [shadow];  
  33. }  
复制代码

界面运行出来后,得到了一个静态的结果,游戏嘛就得富有动态,于是我做了一个下雪效果。它在onframe函数中,也就是我们说的时间轴事件中:
  1. if(canSnowing == true){  
  2.     //加入雪花  
  3.     addSnow();  
  4. }  
复制代码

接着看addSnow函数:
  1. function addSnow(){  
  2.     snowLayer.graphics.clear();  
  3.     var snowx = Math.random()*(LStage.width-10)+10;  
  4.     var n = snowChildList.length;  
  5.     while(n--){  
  6.         var s = snowChildList[n];  
  7.         s.y += s.s;  
  8.         snowLayer.graphics.drawArc(2,"white",[s.x,s.y,2,0,2*Math.PI],true,"white");  
  9.     }  
  10.     snowChildList.push({x:snowx,y:0,s:10});  
  11. }  
复制代码

运行代码得到一个相当酷的界面,大家可以看一下:
QQ截图20170117105251.jpg
光有界面也不能叫游戏,接下来就是游戏主题部分。

我们先前提到过类,现在就来用类实战一下。首先来看charactor人物类:
  1. function Charactor(data){  
  2.     base(this,LSprite,[]);  
  3.     //设定x和y坐标  
  4.     this.x = 0;  
  5.     this.y = 0;  
  6.     //设定模式  
  7.     this.mode = "right";  
  8.     this.speed = 5;  
  9.     //加入图片  
  10.     this.data = data;  
  11.     var list = LGlobal.divideCoordinate(227,158,1,1);  
  12.     var bitmapdata = new LBitmapData(imglist[this.data]);  
  13.     //加入动画  
  14.     this.anima = new LAnimation(this,bitmapdata,list);  
  15.     this.anima.setAction(0,1,0,false);  
  16. }  
复制代码

其中有一个LAnimationg方法,它是lufylegend中播放动画的类,使用说明如下:

------------------------------------------------------------------------------

LAnimation(layer,data,list)
  

■作用:
实现简单动画的播放,原理是将一张大的图片,按照保存有坐标的二维数组保存的坐标来逐个显示。

■参数:
layer:LSprite显示层
data:LBitmapData对象
list:一个存有坐标的2维数组
■详细说明:
LAnimation类实现简单动画的播放,用于制作人物行走等效果非常方便
■可用属性:
layer:动画显示时,LAnimation的父级层
dataBitmapData对象
list:坐标数组。
------------------------------------------------------------------------------  
其他的就很容易懂了,Charactor类有个move方法,用于人物移动,如下:

  1. Charactor.prototype.move = function(){  
  2.     //当向右飞行时  
  3.     if(this.mode == "right" && this.x < LStage.width-149){  
  4.         this.anima.setAction(0,1,0,false);  
  5.         this.x += this.speed;  
  6.     }else{  
  7.         this.mode = "left";  
  8.     }  
  9.     //当向左飞行时  
  10.     if(this.mode == "left" && this.x > 0){  
  11.         this.anima.setAction(0,1,0,true);  
  12.         this.x -= this.speed;  
  13.     }else{  
  14.         this.mode = "right";  
  15.     }  
  16. }  
复制代码

这段代码可以使人物移动,将这段代码放在onframe中就可以实现让人物来回移动了。逻辑很简单,大家可以看看。

接着就是实例化人物了。代码如下:
  1. function addChara(){  
  2.     oldMan = new Charactor("player");  
  3.     showChara = true;  
  4.     charaLayer.addChild(oldMan);  
  5. }
复制代码

接着是onframe中的代码:
  1. if(showChara == true){  
  2.     //使人物动起来  
  3.     oldMan.move();  
  4.     //改变时间显示  
  5.     timeText.text = "Time:" + showTime;  
  6.     if(time>0){  
  7.         time -= 30000/(30000/50);  
  8.     }else{  
  9.         playerName = getName();  
  10.         gameOver();  
  11.     }  
  12. }  
复制代码

在这里我门判断时间是否为0,如果为0就游戏结束。当然,这是后话,这里只提一下。

接下来看Stage类,这个很重要,大家一定要认真看哦!
  1. var stageSpeed = 5;  
  2. function Stage(){  
  3.     base(this,LSprite,[]);  
  4.     //取出一个整数,使0<=index<=7成立  
  5.     var index = Math.floor(Math.random()*7);  
  6.     //将index的值取出对应的图片  
  7.     var bitmap = new LBitmap(new LBitmapData(imglist["costume"+index]));  
  8.     //定义礼物的模式  
  9.     this.mode = "";  
  10.     this.addChild(bitmap);  
  11. }  
复制代码

这是Stage类构造器。和Charactor差不多。主要是其方法:
  1. Stage.prototype.run = function(){  
  2.     //让礼物不断下降  
  3.     this.y += stageSpeed;  
  4.     //判断是否到达边缘  
  5.     if(this.y > LStage.height){  
  6.         this.mode = "die";  
  7.     }  
  8.     this.cheackHit();  
  9. }  
  10. Stage.prototype.cheackHit = function(){  
  11.     if(this.y > 170 && this.x > 132 - 33 && this.x < 166){  
  12.         this.mode = "die";  
  13.         point++;  
  14.         changeText();  
  15.     }else if(this.y > 170 && this.x > 293 - 33 && this.x < 330){  
  16.         this.mode = "die";  
  17.         point++;  
  18.         changeText();  
  19.     }else if(this.y > 178 && this.x > 475 - 33 && this.x < 508){  
  20.         this.mode = "die";  
  21.         point++;  
  22.         changeText();  
  23.     }  
  24. }  
复制代码

其实很好理解,在run中,我们让礼物向下移5格,虽然只移5格,但是如果是在onframe中调用,它将不断下降。为了判断礼物是否已经送到家,我用加入cheackHit方法。我们可以用判断坐标的方法来实现。每碰到一次就更改分数,并将mode设置为die,然后在onframe中判断mode,如果mode是"die"就移除这个对象。

实例化Stage类:
  1. function addStage(){  
  2.     var stage = new Stage();  
  3.     if(oldMan.mode == "left"){  
  4.         stage.x = oldMan.x + 70;  
  5.     }else{  
  6.         stage.x = oldMan.x + 30;  
  7.     }  
  8.     stage.y = 30;  
  9.     stageLayer.addChild(stage);  
  10.     stageLayer.scaleX = 0.8;  
  11.     stageLayer.scaleY = 0.8;  
  12. }  
复制代码

onframe完整代码:
  1. function onframe(event){  
  2.     showTime = Math.floor(time/1000) + "s";  
  3.     if(canSnowing == true){  
  4.         //加入雪花  
  5.         addSnow();  
  6.     }  
  7.     if(backSound.playing == false){  
  8.         //播放背景音乐  
  9.         backSound.play();  
  10.     }  
  11.     if(showChara == true){  
  12.         //使人物动起来  
  13.         oldMan.move();  
  14.         //改变时间显示  
  15.         timeText.text = "Time:" + showTime;  
  16.         if(time>0){  
  17.             time -= 30000/(30000/50);  
  18.         }else{  
  19.             playerName = getName();  
  20.             gameOver();  
  21.         }  
  22.     }  
  23.     for(var key in stageLayer.childList){  
  24.         //使用Stage中run函数,让障碍物动起来  
  25.         stageLayer.childList[key].run();  
  26.         if(stageLayer.childList[key].mode == "die"){   
  27.             //移除该成员  
  28.             stageLayer.removeChild(stageLayer.childList[key]);  
  29.         }  
  30.     }  
  31. }  
复制代码

首先我们新加了一个遍历方法,遍历LSprite成员而获取每对象的状态,每遇见一个mode是die的就将它移除。

接下来是加入分数以及时间的函数,没有任何逻辑。大家慢慢看就能看懂的。

  1. function addText(){  
  2.     //加入分数文字  
  3.     pointText = new LTextField();   
  4.     pointText.size = 15;  
  5.     pointText.x = 10;  
  6.     pointText.y = 340;  
  7.     pointText.color = "white";  
  8.     pointText.text = "Point:" + point;  
  9.     pointText.font = "HG行書体";  
  10.     overLayer.addChild(pointText);  
  11.     //加入时间文字  
  12.     timeText = new LTextField();   
  13.     timeText.size = 15;  
  14.     timeText.x = 10;  
  15.     timeText.y = LStage.height - 30;  
  16.     timeText.color = "white";  
  17.     timeText.text = "Time:" + showTime;  
  18.     timeText.font = "HG行書体";  
  19.     overLayer.addChild(timeText);  
  20.     //加入滤镜  
  21.     var shadow = new LDropShadowFilter(0,45,"white",0);  
  22.     overLayer.filters = [shadow];  
  23. }  
  24. function changeText(){  
  25.     pointText.text = "Point:" + point;  
  26. }  
复制代码

以下是游戏结束调用的函数,同样是很简单:
  1. function gameOver(){  
  2.     backLayer.die();  
  3.     //绘制成绩板  
  4.     gameoverLayer.graphics.drawRect(2,"dimgray",[0,0,400,300],true,"lightgray");  
  5.     gameoverLayer.x = 100;  
  6.     gameoverLayer.y = 50;  
  7.     gameoverLayer.scaleX = 0.5,  
  8.     gameoverLayer.scaleY = 0.5,  
  9.     gameoverLayer.alpha = 0.5,  
  10.     gameoverLayer.rotate = 50;  
  11.     var shadow = new LDropShadowFilter(5,45,"black",0);  
  12.     gameoverLayer.filters = [shadow];  
  13.     //通过缓动显示成绩板  
  14.     LTweenLite.to(gameoverLayer,1,{  
  15.         alpha:0.7,  
  16.         scaleX:1,  
  17.         scaleY:1,  
  18.         rotate:0,  
  19.         ease:Back.easeInOut,  
  20.         onComplete:resultFont  
  21.     });  
  22. }  
  23. function resultFont(){  
  24.     var resultArr = ["GAME OVER","Tap to Restart Game","分数:"+point,"评价:"+playerName];  
  25.     for(var i=0;i<resultArr.length;i++){  
  26.         //公有属性  
  27.         resultText = new LTextField();  
  28.         resultText.weight = "bold";  
  29.         resultText.text = resultArr[i];  
  30.         //私有有属性  
  31.         if(i==0){  
  32.             resultText.size = 30;  
  33.             resultText.color = "white";  
  34.             resultText.font = "HG行書体";  
  35.             resultText.x = 70;  
  36.             resultText.y = 20;  
  37.         }else if(i==1){  
  38.             resultText.size = 15;  
  39.             resultText.color = "white";  
  40.             resultText.font = "HG行書体";  
  41.             resultText.x = 105;  
  42.             resultText.y = 60;  
  43.         }else{  
  44.             resultText.size = 20;  
  45.             resultText.color = "white";  
  46.             resultText.font = "HG行書体";  
  47.             resultText.x = 35;  
  48.             resultText.y = 100 + (i-1)*32;   
  49.         }  
  50.         gameoverLayer.addChild(resultText);  
  51.     }  
  52.     //加入鼠标事件  
  53.     backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,function(){  
  54.         //变量清空  
  55.         point = 0;  
  56.         time = 1000*30;  
  57.         showChara = false;  
  58.         //清空全局  
  59.         backLayer.removeAllChild();  
  60.         removeChild(backLayer);  
  61.         //游戏重开  
  62.         gameInit();  
  63.         startGame()  
  64.     });  
  65. }  
复制代码

重开游戏的函数:
  1. function startGame(){  
  2.     //清空画布  
  3.     logoLayer.die();  
  4.     logoLayer.removeAllChild();  
  5.     canSnowing = false;  
  6.     //加入背景  
  7.     var backBitmapdata = new LBitmapData(imglist["background"],0,0,480,360);  
  8.     var backBitmap = new LBitmap(backBitmapdata);  
  9.     backBitmap.scaleX = 1.4;  
  10.     backBitmap.scaleY = 1.4;  
  11.     sceneLayer.addChild(backBitmap);  
  12.     //加入房屋  
  13.     var houseBitmapdata = new LBitmapData(imglist["house"],0,0,480,228);  
  14.     var houseBitmap = new LBitmap(houseBitmapdata);  
  15.     houseBitmap.scaleX = 1.4;  
  16.     houseBitmap.y = 200;  
  17.     sceneLayer.addChild(houseBitmap);  
  18.     //加入人物  
  19.     addChara();  
  20.     //加入文字  
  21.     addText();  
  22. }  
复制代码

好了,运行一下代码:
QQ截图20170117141853.jpg
哈哈~~,还不错吧。


3,源代码下载


本次开发就到这里,想了解详细代码的朋友可以看看。
欢迎回复下载,支持就是最大的鼓励。

游客,如果您要查看本帖隐藏内容请回复



评分

参与人数 1声望 +10 铜板 +10 收起 理由
12421341234 + 10 + 10

查看全部评分

最佳答案
0 
ligui722 发表于 2017-1-18 10:41:31 | 显示全部楼层
wewfrdsfsdfdsfs
最佳答案
0 
ligui722 发表于 2017-1-18 10:41:43 | 显示全部楼层
fwqr32re32r2
最佳答案
0 
ligui722 发表于 2017-1-18 10:41:51 | 显示全部楼层
rwefsdgfdsgdsgds
最佳答案
0 
ligui722 发表于 2017-1-18 10:42:09 | 显示全部楼层
ewfrwefsdgdgd
最佳答案
0 
ligui722 发表于 2017-1-18 11:40:00 | 显示全部楼层
vxbsxcb cxbcxbvcxbcxbxc
最佳答案
0 
ligui722 发表于 2017-1-18 11:40:07 | 显示全部楼层
fdhjdjfdjfdjfghg
最佳答案
0 
ligui722 发表于 2017-1-18 11:40:13 | 显示全部楼层
hkfkfkyfgmjvj
您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐阅读 More>

© 2001-2015 9秒社团

合作伙伴

公司简介 | 联系方式
COPYRIGHT©2015 ZHONGQINGLONGTU NETWORK CO.LTD ALL RIGHTS RESERVED.ICP备11023195号-4
北京中清龙图网络技术有限公司
返回顶部 返回列表