[HTML5游戏开发]简单的《找不同汉字版》,来考考你的眼力吧

2024-06-01 13:48

本文主要是介绍[HTML5游戏开发]简单的《找不同汉字版》,来考考你的眼力吧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 本次 游戏 开发需要用到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(游戏引擎)
  
  做完这些后就可以开始游戏开发了。[color=ize:18px]二,制作过程
  由于本次游戏开发较为简单,因此,我简单说一下过程。首先,在index.html中加入html代码:
  <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>html5 game</title>
<script type="text/ JAVA script" 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()的写法如下:
  init(50,"mylegend",525,500,main);
init函数第一个参数是页面刷新频率,第二个是canvas加到的div的id,第三个和第四个是页面尺寸,最后一个是页面初始化完成后调用的函数。
  
  接着,我们定义一连串的变量:
  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;其中我只介绍几个重要的变量,其他的以后会提到。
  
  var backLayer,tileLayer,ctrlLayer,overLayer,gameoverLayer;这些代码是在定义层变量,方便以后游戏开发。
  
  var tileText,overText,gameoverText;这里是在定义游戏中可能出现的字层变量。
  
  var checkpoints = [
["籍","藉"],
["我","找"],
["春","舂"],
["龙","尤"],
["曰","日"]
];这些是定义关卡,在这个二维数组中,每一个数组就是一关,每一个数组中的文字就是关卡中要出现的字。可以看出,这个游戏共5关
  
  接下来就是游戏的函数部分。首先是main函数:
  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中:
  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中:
  function initTile(){
for(i=0;i<row;i++){
  for(j=0;j<col;j++){
   tile();
  }
}
}这个函数是在进行平铺工作,做法有点像贴瓷砖。关键在于tile(),页面上的东西全都是由它贴上去的。接下来让我们揭示它的真面目:
  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 文字上下对齐方式

  举一个简单的例子方便大家理解:
  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类,那理解我的代码就简单了,首先我设定了文字的内容:
  
  var w = checkpoints[checkpointNo][(i==i0 && j==j0) ? 0 : 1];
  
  这行代码的意思是当画一个方块时,判断画的那一块是第几行第几个,也就是i和j,然后看看是不是和j0和i0相等,如果相等,说明那一块就是与其他不同的那一块。然后到关卡数组中取出字。可以从数组checkpoints看出,当遇到的是与其他不同的那一块时,就取下标为0的那一个字,否则就取下标为1的那一个字。所以,当是第一关时,我们要找的字就是“籍”,而其余的字是“藉"。
  接下来就处理字的位置,因为如果不处理,所有字都会堆在一起。处理位置的几行代码如下:
  tileText.x = j*50+7;
tileText.y = i*50+7;
  
  接着我们来看看游戏时间的实现:
  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的位置连线。这样反复清屏加重绘,便实现了减短时间条。
  下一步,我们要实现鼠标事件,先看代码:
  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的内容如下:
  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 ;
    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;游戏论坛:http://www.jiushun8.com

selectLayer.addChild(overText);
     checkpointNo = 0;
    }else{
     overText.text = overTextContent;
     overText.size = 20;
     overText.x = (LGlobal.width - overText.getWidth())*0.5;
     overText.y = 240;
     selectLayer.addChild(overText);
    }
   }
  }
}
tileLayer.removeEventListener(LMouseEvent.MOUSE_DOWN,onDown);
}
  
  最后还有一些代码作为赢或输后的处理,很简单,我一笔带过:
  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;
   gameoverText.size = 35;
   gameoverText.x = (LGlobal.width - gameoverText.getWidth())*0.5;
   gameoverText.y = 120;
   gameoverLayer.addChild(gameoverText);
  }else if(i==1){
   gameoverText.text = gameoverTextContent;
   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
  演示截图:
  



  

  



   希望大家多支持,谢谢捧场。http://www.shengshiyouxi.com
   ---------------------2013年3月30日更新---------------------
   1,加入滤镜效果
   2,修改了进入游戏后鼠标事件失灵的bug(感谢网友:qq407653296)
   游戏截图:
  

10834.jpg (23.76 KB, 下载次数: 0)

下载附件

2013-5-8 10:17 上传



  

这篇关于[HTML5游戏开发]简单的《找不同汉字版》,来考考你的眼力吧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021184

相关文章

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

HTML input 标签示例详解

《HTMLinput标签示例详解》input标签主要用于接收用户的输入,随type属性值的不同,变换其具体功能,本文通过实例图文并茂的形式给大家介绍HTMLinput标签,感兴趣的朋友一... 目录通用属性输入框单行文本输入框 text密码输入框 password数字输入框 number电子邮件输入编程框

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h