<报备>HTML5_游戏开发_简单的<找不同汉字版>游戏

转载声明:

转自Yorhom's Game Box

地址为:http://blog.csdn.net/yorhomwang/article/details/8627830

一,准备工作

本次游戏开发需要用到lufylegend.js开源游戏引擎,版本我用的是1.5.2(现在最新的版本是1.6.0)。

引擎下载的位置:http://lufylegend.googlecode.com/files/lufylegend-1.5.2.rar

引擎API文档:http://lufylegend.com/lufylegend/api

首先为了开发方便,我们得先建立一个叫Find_Word的文件夹,然后在里面添加项目,如下:

Find_Word文件夹

|---index.html

|---js文件夹

|---main.js

|---lufylegend-1.5.2.min.js(游戏引擎)

|---lufylegend-1.5.2.js(游戏引擎)

做完这些后就可以开始游戏开发了。

二,制作过程

由于本次游戏开发较为简单,因此,我简单说一下过程。首先,在index.html中加入html代码:

  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <meta charset="UTF-8">  
  5. <title>html5 game</title>  
  6. <script type="text/javascript" src="./js/lufylegend-1.5.2.min.js"></script>  
  7. <script type="text/javascript" src="./js/main.js"></script>   
  8. </head>  
  9. <body>  
  10. <div id="mylegend">loading......</div>  
  11. </body>  
  12. </html>  
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>html5 game</title>
<script type="text/javascript" src="./js/lufylegend-1.5.2.min.js"></script>
<script type="text/javascript" src="./js/main.js"></script> 
</head>
<body>
<div id="mylegend">loading......</div>
</body>
</html>
也许有些朋友会很纳闷,因为他们没有找到canvas标签。其实在lufylegend中,当你调用init()函数时,会自动加入canvas标签,因此你只用写下一个div标签和这个div标签的id就能在html中自动加入canvas。

在main.js调用init()的写法如下:

[javascript] view plain copy print ?
  1. init(50,"mylegend",525,500,main);  
init(50,"mylegend",525,500,main);

init函数第一个参数是页面刷新频率,第二个是canvas加到的div的id,第三个和第四个是页面尺寸,最后一个是页面初始化完成后调用的函数。

接着,我们定义一连串的变量:

[javascript] view plain copy print ?
  1. var backLayer,tileLayer,ctrlLayer,overLayer,gameoverLayer;  
  2. var tileText,overText,gameoverText;  
  3. var col,row;  
  4. var time = 0;  
  5. var selectLayer;  
  6. var checkpoints = [  
  7.     ["籍","藉"],  
  8.     ["我","找"],  
  9.     ["春","舂"],  
  10.     ["龙","尤"],  
  11.     ["曰","日"]  
  12. ];  
  13. var checkpointNo = 0;  
  14. var i0;  
  15. var j0;  
  16. var i,j;  
  17. var partX,partY;  
  18. var overTextContent = ["恭喜您,您过关了","进入下一关","重新开始"];  
  19. var gameoverTextContent = ["对不起,您失败了","重开关卡"];  
  20. var nowLine;  
  21. var setTimeLine;  
var backLayer,tileLayer,ctrlLayer,overLayer,gameoverLayer;
var tileText,overText,gameoverText;
var col,row;
var time = 0;
var selectLayer;
var checkpoints = [
	["籍","藉"],
	["我","找"],
	["春","舂"],
	["龙","尤"],
	["曰","日"]
];
var checkpointNo = 0;
var i0;
var j0;
var i,j;
var partX,partY;
var overTextContent = ["恭喜您,您过关了","进入下一关","重新开始"];
var gameoverTextContent = ["对不起,您失败了","重开关卡"];
var nowLine;
var setTimeLine;
其中我只介绍几个重要的变量,其他的以后会提到。

[javascript] view plain copy print ?
  1. var backLayer,tileLayer,ctrlLayer,overLayer,gameoverLayer;  
var backLayer,tileLayer,ctrlLayer,overLayer,gameoverLayer;
这些代码是在定义层变量,方便以后游戏开发。

[javascript] view plain copy print ?
  1. var tileText,overText,gameoverText;  
var tileText,overText,gameoverText;
这里是在定义游戏中可能出现的字层变量。

[javascript] view plain copy print ?
  1. var checkpoints = [  
  2.     ["籍","藉"],  
  3.     ["我","找"],  
  4.     ["春","舂"],  
  5.     ["龙","尤"],  
  6.     ["曰","日"]  
  7. ];  
var checkpoints = [
	["籍","藉"],
	["我","找"],
	["春","舂"],
	["龙","尤"],
	["曰","日"]
];
这些是定义关卡,在这个二维数组中,每一个数组就是一关,每一个数组中的文字就是关卡中要出现的字。可以看出,这个游戏共5关

接下来就是游戏的函数部分。首先是main函数:

[javascript] view plain copy print ?
  1. function main(){  
  2.     i0 = Math.floor(Math.random()*10);  
  3.     j0 = Math.floor(Math.random()*10);  
  4.   
  5.     initLayer();  
  6.     initCtrl();  
  7.     initTile();  
  8. }  
function main(){
	i0 = Math.floor(Math.random()*10);
	j0 = Math.floor(Math.random()*10);

	initLayer();
	initCtrl();
	initTile();
}
在这里面,我首先给i0和j0赋值,让他们成为任何一个0-10之间的随即数,以便确定哪里是不同的那个字。然后我还在这个程序中初始化了层和控制,以及调用了显示文字的函数initTile(),让我们分别来看看initLayer和initTile中的代码:

initLayer中:

[javascript] view plain copy print ?
  1. function initLayer(){  
  2.     backLayer = new LSprite();  
  3.     addChild(backLayer);  
  4.       
  5.     tileLayer = new LSprite();  
  6.     backLayer.addChild(tileLayer);  
  7.   
  8.     ctrlLayer = new LSprite();  
  9.     backLayer.addChild(ctrlLayer);  
  10. }  
function initLayer(){
	backLayer = new LSprite();
	addChild(backLayer);
	
	tileLayer = new LSprite();
	backLayer.addChild(tileLayer);

	ctrlLayer = new LSprite();
	backLayer.addChild(ctrlLayer);
}
我用lufylegend中LSprite类的方法将层变量定义为了一个容器,以后要显示什么东西,就可以往这些容器中放。其中addChild是把一个东西放进容器的函数,当然放进去的东西也可以是个容器。由此,游戏就有了层次感。如果直接写addChild(xxx)就是把xxx放在游戏最底层。

initTile中:

[javascript] view plain copy print ?
  1. function initTile(){  
  2.     for(i=0;i<row;i++){  
  3.         for(j=0;j<col;j++){  
  4.             tile();  
  5.         }  
  6.     }  
  7. }  
function initTile(){
	for(i=0;i<row;i++){
		for(j=0;j<col;j++){
			tile();
		}
	}
}
这个函数是在进行平铺工作,做法有点像贴瓷砖。关键在于tile(),页面上的东西全都是由它贴上去的。接下来让我们揭示它的真面目:

[javascript] view plain copy print ?
  1. function tile(){  
  2.     tileLayer.graphics.drawRect(3,"dimgray",[j*50,i*50,50,50],true,"lightgray");  
  3.   
  4.     var w = checkpoints[checkpointNo][(i==i0 && j==j0) ? 0 : 1];  
  5.     tileText = new LTextField();  
  6.     tileText.weight = "bold";  
  7.     tileText.text = w;  
  8.     tileText.size = 25;  
  9.     tileText.color = "dimgray";  
  10.     tileText.font = "黑体";  
  11.     tileText.x = j*50+7;  
  12.     tileText.y = i*50+7;  
  13.     tileLayer.addChild(tileText);  
  14. }  
function tile(){
	tileLayer.graphics.drawRect(3,"dimgray",[j*50,i*50,50,50],true,"lightgray");

	var w = checkpoints[checkpointNo][(i==i0 && j==j0) ? 0 : 1];
	tileText = new LTextField();
	tileText.weight = "bold";
	tileText.text = w;
	tileText.size = 25;
  	tileText.color = "dimgray";
	tileText.font = "黑体";
	tileText.x = j*50+7;
	tileText.y = i*50+7;
	tileLayer.addChild(tileText);
}

首先我们先在页面上把格子平铺好,因此用了lufylegend中LGraphics类中的drawRect,并利用它在屏幕上画了100个50*50正方形。

drawRect的几个参数分别是:

第一个:边缘线粗
第二个:边缘线颜色
第三个:[起始坐标x,起始坐标y,矩形宽width,矩形高height]
第四个:是否实心图形
第五个:实心颜色

画好格子后,我们开始给每个格子上写文字。在lufylegend中输出文字很简单,只要定义一个LTextField类并给它的属性填值然后将它addChild就可以完成。

它的属性有:

type类型
x坐标x
y坐标y
text作为文本字段中当前文本的字符串
font文字的格式
size文字大小
color文字颜色
visible是否可见
weight文字粗细
stroke当为true时,可以设置线宽
lineWidth文字线宽
textAlign文字左右对齐方式
textBaseline文字上下对齐方式

举一个简单的例子方便大家理解:

[javascript] view plain copy print ?
  1. var backLayer,title;   
  2. function main(){   
  3.     backLayer = new LSprite();   
  4.     addChild(backLayer);   
  5.     title = new LTextField();   
  6.     title.size = 30;   
  7.     title.color = "#ff0000";   
  8.     title.text = "文字显示测试";   
  9.     backLayer.addChild(title);   
  10. }  
var backLayer,title; 
function main(){ 
    backLayer = new LSprite(); 
    addChild(backLayer); 
    title = new LTextField(); 
    title.size = 30; 
    title.color = "#ff0000"; 
    title.text = "文字显示测试"; 
    backLayer.addChild(title); 
}
当大家了解完了LTextField类,那理解我的代码就简单了,首先我设定了文字的内容:

[javascript] view plain copy print ?
  1. var w = checkpoints[checkpointNo][(i==i0 && j==j0) ? 0 : 1];  
var w = checkpoints[checkpointNo][(i==i0 && j==j0) ? 0 : 1];

这行代码的意思是当画一个方块时,判断画的那一块是第几行第几个,也就是i和j,然后看看是不是和j0和i0相等,如果相等,说明那一块就是与其他不同的那一块。然后到关卡数组中取出字。可以从数组checkpoints看出,当遇到的是与其他不同的那一块时,就取下标为0的那一个字,否则就取下标为1的那一个字。所以,当是第一关时,我们要找的字就是“籍”,而其余的字是“藉"。

接下来就处理字的位置,因为如果不处理,所有字都会堆在一起。处理位置的几行代码如下:

[javascript] view plain copy print ?
  1. tileText.x = j*50+7;  
  2. tileText.y = i*50+7;  
tileText.x = j*50+7;
tileText.y = i*50+7;

接着我们来看看游戏时间的实现:

[javascript] view plain copy print ?
  1. function addTimeLine(){  
  2.     overLayer.graphics.drawRect(5,"dimgray",[500,0,20,500],true,"lightgray");  
  3.     overLayer.graphics.drawLine(15,"lightgray",[510,3,510,497]);  
  4.     overLayer.graphics.drawLine(15,"red",[510,3,510,497]);  
  5.     setTimeLine = setInterval(function(){drawTimeLine();},100);  
  6. }  
  7. function drawTimeLine(){  
  8.     nowLine = 3+((time/5)*495)/10;  
  9.     overLayer.graphics.drawLine(15,"lightgray",[510,3,510,497]);  
  10.     overLayer.graphics.drawLine(15,"red",[510,nowLine,510,497]);  
  11.     time++;  
  12.     if(time>50){  
  13.         clearInterval(setTimeLine);  
  14.         gameOver();  
  15.     }  
  16. }  
function addTimeLine(){
	overLayer.graphics.drawRect(5,"dimgray",[500,0,20,500],true,"lightgray");
	overLayer.graphics.drawLine(15,"lightgray",[510,3,510,497]);
	overLayer.graphics.drawLine(15,"red",[510,3,510,497]);
	setTimeLine = setInterval(function(){drawTimeLine();},100);
}
function drawTimeLine(){
	nowLine = 3+((time/5)*495)/10;
	overLayer.graphics.drawLine(15,"lightgray",[510,3,510,497]);
	overLayer.graphics.drawLine(15,"red",[510,nowLine,510,497]);
	time++;
	if(time>50){
		clearInterval(setTimeLine);
		gameOver();
	}
}
我还是用graphics来实现的,只不过用的是里面的drawLine,参数是:

第一个:线粗
第二个:线颜色
第三个:[起始坐标x,起始坐标y,结束坐标x,结束坐标y]

实现减短时间条时,我先画一个颜色为lightgray的线使时间条清空一遍,再让画笔每100毫秒就移至3+((time/5)*495)/10,然后让这个坐标与510的位置连线。这样反复清屏加重绘,便实现了减短时间条。

下一步,我们要实现鼠标事件,先看代码:

[javascript] view plain copy print ?
  1. function onDown(){  
  2.     var mouseX,mouseY;  
  3.     mouseX = event.offsetX;  
  4.     mouseY = event.offsetY;  
  5.   
  6.     partX = Math.floor((mouseX)/50);  
  7.     partY = Math.floor((mouseY)/50);  
  8.     isTure(partX,partY);  
  9.   
  10.     alert(partX+","+partY);  
  11. }  
function onDown(){
	var mouseX,mouseY;
	mouseX = event.offsetX;
	mouseY = event.offsetY;

	partX = Math.floor((mouseX)/50);
	partY = Math.floor((mouseY)/50);
	isTure(partX,partY);

	alert(partX+","+partY);
}

这一段代码很好理解,首先我取出鼠标位置,然后 将它除以50并取整,得出点的是哪一格,然后将点的那一格作为参数送进isTure,在里面我判断了参数值是否与i0和j0符合,如果符合,就调用处理胜利的函数。

isTure的内容如下:

[javascript] view plain copy print ?
  1. function isTure(x,y){  
  2.     if(x==j0 && y==i0){  
  3.         clearInterval(setTimeLine);  
  4.         overLayer.graphics.drawRect(5,"dimgray",[(LGlobal.width - 420)*0.5,80,420,250],true,"lightgray");  
  5.         selectLayer.graphics.drawRect(5,"dimgray",[(LGlobal.width - 250)*0.5,230,250,50],true,"darkgray");  
  6.   
  7.         for(var i=0;i<overTextContent.length;i++){  
  8.             overText = new LTextField();  
  9.             overText.weight = "bold";  
  10.             overText.color = "dimgray";  
  11.             overText.font = "黑体";  
  12.             if(i==0){  
  13.                 overText.text = overTextContent[i];  
  14.                 overText.size = 35;  
  15.                 overText.x = (LGlobal.width - overText.getWidth())*0.5;  
  16.                 overText.y = 120;  
  17.                 overLayer.addChild(overText);  
  18.             }else if(i==1){  
  19.                 if(checkpointNo == checkpoints.length-1){  
  20.                     overText.text = overTextContent[i+1];  
  21.                     overText.size = 20;  
  22.                     overText.x = (LGlobal.width - overText.getWidth())*0.5;  
  23.                     overText.y = 240;   
  24.                     selectLayer.addChild(overText);  
  25.                     checkpointNo = 0;  
  26.                 }else{  
  27.                     overText.text = overTextContent[i];  
  28.                     overText.size = 20;  
  29.                     overText.x = (LGlobal.width - overText.getWidth())*0.5;  
  30.                     overText.y = 240;  
  31.                     selectLayer.addChild(overText);  
  32.                 }  
  33.             }  
  34.         }  
  35.     }  
  36.     tileLayer.removeEventListener(LMouseEvent.MOUSE_DOWN,onDown);  
  37. }  
function isTure(x,y){
	if(x==j0 && y==i0){
		clearInterval(setTimeLine);
		overLayer.graphics.drawRect(5,"dimgray",[(LGlobal.width - 420)*0.5,80,420,250],true,"lightgray");
		selectLayer.graphics.drawRect(5,"dimgray",[(LGlobal.width - 250)*0.5,230,250,50],true,"darkgray");

		for(var i=0;i<overTextContent.length;i++){
			overText = new LTextField();
			overText.weight = "bold";
			overText.color = "dimgray";
			overText.font = "黑体";
			if(i==0){
				overText.text = overTextContent[i];
				overText.size = 35;
				overText.x = (LGlobal.width - overText.getWidth())*0.5;
				overText.y = 120;
				overLayer.addChild(overText);
			}else if(i==1){
				if(checkpointNo == checkpoints.length-1){
					overText.text = overTextContent[i+1];
					overText.size = 20;
					overText.x = (LGlobal.width - overText.getWidth())*0.5;
					overText.y = 240; 
					selectLayer.addChild(overText);
					checkpointNo = 0;
				}else{
					overText.text = overTextContent[i];
					overText.size = 20;
					overText.x = (LGlobal.width - overText.getWidth())*0.5;
					overText.y = 240;
					selectLayer.addChild(overText);
				}
			}
		}
	}
	tileLayer.removeEventListener(LMouseEvent.MOUSE_DOWN,onDown);
}

最后还有一些代码作为赢或输后的处理,很简单,我一笔带过:

[javascript] view plain copy print ?
  1. function gameOver(){  
  2.     overLayer.graphics.drawRect(5,"dimgray",[(LGlobal.width - 420)*0.5,80,420,250],true,"lightgray");  
  3.     gameoverLayer.graphics.drawRect(5,"dimgray",[(LGlobal.width - 250)*0.5,230,250,50],true,"darkgray");  
  4.   
  5.     for(var i=0;i<gameoverTextContent.length;i++){  
  6.         gameoverText = new LTextField();  
  7.         gameoverText.weight = "bold";  
  8.         gameoverText.color = "dimgray";  
  9.         gameoverText.font = "黑体";  
  10.         if(i==0){  
  11.             gameoverText.text = gameoverTextContent[i];  
  12.             gameoverText.size = 35;  
  13.             gameoverText.x = (LGlobal.width - gameoverText.getWidth())*0.5;  
  14.             gameoverText.y = 120;  
  15.             gameoverLayer.addChild(gameoverText);  
  16.         }else if(i==1){  
  17.             gameoverText.text = gameoverTextContent[i];  
  18.             gameoverText.size = 20;  
  19.             gameoverText.x = (LGlobal.width - gameoverText.getWidth())*0.5;  
  20.             gameoverText.y = 240;  
  21.             gameoverLayer.addChild(gameoverText);  
  22.         }  
  23.     }  
  24.     tileLayer.removeEventListener(LMouseEvent.MOUSE_DOWN,onDown);  
  25. }  
  26. function gameReStart(){  
  27.     i0 = Math.floor(Math.random()*10);  
  28.     j0 = Math.floor(Math.random()*10);  
  29.   
  30.     time = 0;  
  31.   
  32.     tileLayer.removeAllChild();  
  33.     overLayer.removeAllChild();  
  34.     selectLayer.removeAllChild();  
  35.     backLayer.removeChild(selectLayer);  
  36.     backLayer.removeChild(overLayer);  
  37.     if(checkpointNo != checkpoints.length-1){  
  38.         checkpointNo++;  
  39.     }  
  40.     initTile();  
  41.     addEvent();  
  42.     addTimeLine();  
  43. }  
  44. function reTry(){  
  45.     i0 = Math.floor(Math.random()*10);  
  46.     j0 = Math.floor(Math.random()*10);  
  47.   
  48.     time = 0;  
  49.   
  50.     tileLayer.removeAllChild();  
  51.     overLayer.removeAllChild();  
  52.     gameoverLayer.removeAllChild();  
  53.     selectLayer.removeAllChild();  
  54.     backLayer.removeChild(selectLayer);  
  55.     backLayer.removeChild(overLayer);  
  56.     backLayer.removeChild(gameoverLayer);  
  57.   
  58.     initTile();  
  59.     addEvent();  
  60.     addTimeLine();  
  61. }  
function gameOver(){
	overLayer.graphics.drawRect(5,"dimgray",[(LGlobal.width - 420)*0.5,80,420,250],true,"lightgray");
	gameoverLayer.graphics.drawRect(5,"dimgray",[(LGlobal.width - 250)*0.5,230,250,50],true,"darkgray");

	for(var i=0;i<gameoverTextContent.length;i++){
		gameoverText = new LTextField();
		gameoverText.weight = "bold";
		gameoverText.color = "dimgray";
		gameoverText.font = "黑体";
		if(i==0){
			gameoverText.text = gameoverTextContent[i];
			gameoverText.size = 35;
			gameoverText.x = (LGlobal.width - gameoverText.getWidth())*0.5;
			gameoverText.y = 120;
			gameoverLayer.addChild(gameoverText);
		}else if(i==1){
			gameoverText.text = gameoverTextContent[i];
			gameoverText.size = 20;
			gameoverText.x = (LGlobal.width - gameoverText.getWidth())*0.5;
			gameoverText.y = 240;
			gameoverLayer.addChild(gameoverText);
		}
	}
	tileLayer.removeEventListener(LMouseEvent.MOUSE_DOWN,onDown);
}
function gameReStart(){
	i0 = Math.floor(Math.random()*10);
	j0 = Math.floor(Math.random()*10);

	time = 0;

	tileLayer.removeAllChild();
	overLayer.removeAllChild();
	selectLayer.removeAllChild();
	backLayer.removeChild(selectLayer);
	backLayer.removeChild(overLayer);
	if(checkpointNo != checkpoints.length-1){
		checkpointNo++;
	}
	initTile();
	addEvent();
	addTimeLine();
}
function reTry(){
	i0 = Math.floor(Math.random()*10);
	j0 = Math.floor(Math.random()*10);

	time = 0;

	tileLayer.removeAllChild();
	overLayer.removeAllChild();
	gameoverLayer.removeAllChild();
	selectLayer.removeAllChild();
	backLayer.removeChild(selectLayer);
	backLayer.removeChild(overLayer);
	backLayer.removeChild(gameoverLayer);

	initTile();
	addEvent();
	addTimeLine();
}

三,下载和演示位置

演示位置:http://www.lufylegend.com/lufylegend_developers/yorhom_Find_Word/index.html

下载位置:http://files.cnblogs.com/yorhom/Find_Word.rar

演示截图:




希望大家多支持,谢谢捧场。

---------------------2013年3月30日更新---------------------

1,加入滤镜效果

2,修改了进入游戏后鼠标事件失灵的bug(感谢网友:qq407653296)

游戏截图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值