当前位置: 首页 > 编程日记 > 正文

【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(游戏引擎)

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

二,制作过程

由于本次游戏开发较为简单,因此,我简单说一下过程。首先,在index.html中加入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()的写法如下:

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[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);
}

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

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

演示截图:

转载于:https://www.cnblogs.com/jiangxiaobo/p/6004587.html

相关文章:

FTP 命令的使用详解

# 使用Terminal 连接FTP ####Tips: 1 通过!进入本地主机的shell&#xff0c;然后通过exit退出本地主机进入远程服务器shell 2 要把文件下载到哪一个目录 就要先cd 到 哪个目录&#xff0c;再去进行ftp 连接&#xff0c;这样 执行 get 文件 自动下载到目录3 下载的文件的时候…

html 11 内联(行内)

行内元素 <span> 块级元素 <div> <p> <section> <header> <footer> 行内元素&#xff0c;这是高 margin-top margin-bottom 无意义 &#xff0c;无效果&#xff0c;因为它仅仅在行内 &#xff0c;它跳不出行&#xff0c;行多少它就多少。…

宅男抖音某猫协议分析及应用破解

“ 分析传说中的快x&#xff0c;顺便提供破VIP线路及去启动广告方法。”在当今这个由应用市场主导的网络上&#xff0c;流传着一批应用&#xff0c;它们低调又神秘&#xff0c;依赖口碑与独立网站在地下渠道传播&#xff0c;应用市场中从来都找不到它们的身影。这类应用&#x…

AdminLTE的使用

官方文档link1.AdminLTE的必要配置文件<!-- Tell the browser to be responsive to screen width --> <meta content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno" name"viewport"> <!-- Bootstrap 3.3.5 --> …

Linux sendmail发送邮件失败诊断案例(一)

在新服务器上测试sendmail发送邮件时&#xff0c;发现邮件发送不成功&#xff0c;检查日志文件发现如下错误&#xff08;Notice&#xff1a;由于涉及公司服务器&#xff0c;邮箱等&#xff0c;故下面hostname、邮箱地址等信息使用xxx代替&#xff09; tail -40 /var/log/maill…

CentOS 安装Python3

# 基于Linux的 Python3 环境的安装 最近买了一台centOS 阿里云轻量级服务器 自带Python2 准备安装Python3.6 版本的 ## Step * 1 查看当前版本python 的路径 使用以下命令,以便后面安装完毕 建立软链接 > which python 正常情况下会显示python 路径&#xff0c;例如…

某米浏览器黑名单文件破解

“粗粮系统自带浏览器的网址黑名单提取。”某米手机作为高性价比的代表&#xff0c;比起菊厂及OV厂妹风手机&#xff0c;向来被我高看一眼&#xff0c;毕竟雷布斯也是我等码农的典范&#xff0c;以至于我都买过好几件粗粮的产品。虽然它的各个应用&#xff0c;包括系统&#xf…

函数的四种调用模式.上下文调用.call.apply

闭包:函数就是一个闭包,一个封闭的作用域; 返回函数,要返回多个函数就用一个对象封装一下,立即执行函数return回调函数JS动态创建的DOM,不会被搜索引擎抓取,对SEO不友好./*window的name属性*/function fn(){ console.log(this.name);} fn.call({name:"zhangsan"});//…

IOC和DI(转)

1、IoC(Inversion of Control)控制反转和 DI(Dependency Injection)依赖注入 首先想说说IoC&#xff08;Inversion of Control&#xff0c;控制倒转&#xff09;。这是spring的核心&#xff0c;贯穿始终。所谓IoC&#xff0c;对于spring框架来说&#xff0c;就是由spring来负责…

生成公钥链接github

# 生成公钥 连接Git### 1 检查本机是否有公钥 > cd ~/.ssh### 2 如果有的话 直接使用 不要随便删除电脑公钥 没有的话进行生成 生成如下 id_rsa 是 私钥 id_rsa.pub 是公钥 ### 3 生成公钥命令如下 邮箱是你的邮箱地址 终端会提示输入密码 可以以回车带过 如果设置密码…

精确哈克,以贪婪为基础的欺诈式引流法

“ 一种seo手段探讨。”前一段时间&#xff0c;有朋友在后台留言&#xff0c;让我测评一个网站上的信用卡号码生成器&#xff1a;我兴致勃勃&#xff0c;以为是什么黑科技出现了。打开网站&#xff0c;一股熟悉的wordpress风迎面飘来&#xff0c;伴随着风骚的黑色风味。多点击几…

HTML 基础知识(特殊字符的转义)

1. body、head&#xff08;meta&#xff09; <body></body>标签的常见属性&#xff1a; bgcolor&#xff1a;整个页面的背景&#xff1b;text&#xff1a;设置文本颜色link&#xff1a;设置连接颜色&#xff08;&#xff09;&#xff0c;vlink&#xff1a;已经访问…

1 组件化的了解

组件化 概念:讲一个单一的工程的项目&#xff0c;分解成为各个独立的组件&#xff0c;然后按照某一种方式&#xff0c;任意的组织成一个拥有完整业务逻辑的工程 优势 组件的独立–> 独立编写&#xff0c;独立编译&#xff0c;独立运行&#xff0c;独立测试资源的重用–&g…

WebView通过loadDataWithBaseURL加载本地页面卡死

最近开发遇到一个使用 Android WebView加载本地页面进度条始终卡在20%左右不动的情况。打 Log、抓包发现卡在 WebView对象调用 loadDataWithBaseURL方法。 去网上搜了一下解决方案&#xff0c;stackoverflow上有人说是因为 JELLY_BEAN以上版本没有设置 WebView访问文件的权限导…

微信出现“已停止访问该网页”或“关于潜在的违法或违规内容”怎么办?如何获取被屏蔽的网页的网址?...

点击上方↑↑↑蓝字[协议分析与还原]关注我们今天介绍一个微信使用技巧。微信出现“已停止访问该网页”或“关于潜在的违法或违规内容”怎么办&#xff1f;如何获取被屏蔽的网页的网址&#xff1f;由于微信严格的管控措施&#xff0c;经常会导致一些分享的网址被微信屏蔽&#…

self.navigationController push到指定控制器

1 返回到当前页面上面第三级控制器int idx (int)[[self.navigationController viewControllers]indexOfObject:self]; [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:(idx -3)] animated:YES];2 //遍…

Google搜索的常用技巧

个人搜索方案 1、选择合适的搜索词&#xff0c;一些行业术语或专家名字可以带来更加高质量的结果。 2、搜索词手动使用空格分隔&#xff0c;先进行第一次搜索&#xff0c;看搜索结果标题是否满足预期&#xff0c;如果不满足&#xff0c;采用更换关键词&#xff0c;添加关键词&a…

hdu 1085 Holding Bin-Laden Captive!

Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of China! “Oh, God! How terrible! ” Don’t be so afraid, guys. Although he hides in a cave of…

GPS NMEA-0183协议常用报文数据格式

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 整理的GPS有关的协议分析资料。”之前分析一些车载设备的流量时&#xff0c;有部分经验&#xff0c;在这里和大家分享。产生这些流量的设备通常是实体终端设备&#xff0c;里面装有处理芯片&#xff0c;与GPS通信&#xff0c;也通…

【tyvj1052】【树状dp】没有上司的舞会

描述 Ural大学有N个职员&#xff0c;编号为1~N。他们有从属关系&#xff0c;也就是说他们的关系就像一棵以校长为根的树&#xff0c;父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会&#xff0c;要求与会职员的快乐指数最大。但是&#xff0c;没有职员…

java中memcached

http://www.oschina.net/code/snippet_250396_9181 转载于:https://www.cnblogs.com/suifengbingzhu/p/3737053.html

01内存管理-概述

内存管理 内存消耗内存管理模型语言架构减少内存使用的实践 1 内存消耗 栈大小 每一个线程都有专有的栈空间&#xff0c;栈内存在线程存在期间自由使用。 每一个函数都有其自己的栈帧&#xff0c;所有的变量都会载入到方法的栈帧中&#xff0c;并且消耗一定的内存。 &…

linux下unzip解压报错“symlink error: File name too long”怎么办?提供解决方案。

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 分享unzip工具的一个bug。”最近在研究菠菜站&#xff0c;中间用到了Spidermonkey&#xff0c;碰到一些小波折&#xff0c;在这里分享出来&#xff0c;以便大家快速跳坑。从全球最大的男性交友网站GitHub上把Spidermonkey-master…

EF-Linq将查询结果转换为Liststring

List<int> id_list new List<int>() { 1 };//测试数据...List<string> guid_list (from uinfo in db.UserInfowhere id_list.Contains(uinfo.ID)select new{uid uinfo.Guid}).ToList().Select(u > u.uid).ToList<string>(); 转载于:https://www.c…

hdu 2594 kmp

这个题和kmp算法的共同点&#xff0c;也就是可以用kmp解的原因&#xff0c;在于当前缀所在串&#xff08;kmp中的模式串&#xff09;字符pj≠后缀所在串(kmp中文本串)字符tj时&#xff0c;应使前缀串(kmp中模式串)尽量往右移动最大位移&#xff0c;而暴力算法则是每次移动位移为…

途游斗地主加密协议分析及破解

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 分析途游斗地主的加密协议。”作为一个手机棋牌游戏厂商&#xff0c;途游是排得上号的&#xff0c;它的途游斗地主一直很火热&#xff0c;隐约记得&#xff0c;这个厂商一直在搞斗地主的全国竞技赛事&#xff0c;并蹭上了体育总局…

URI、URL以及URN的区别

首先&#xff0c;URI&#xff0c;是uniform resource identifier&#xff0c;统一资源标识符&#xff0c;用来唯一的标识一个资源。而URL是uniform resource locator&#xff0c;统一资源定位器&#xff0c;它是一种具体的URI&#xff0c;即URL可以用来标识一个资源&#xff0c…

[转]使用设计模式改善程序结构(二)

使用设计模式改善程序结构&#xff08;二&#xff09; 在本系列的 第一篇文章中&#xff0c;描述了如何通过设计模式来指导我们的程序重构过程&#xff0c;并且着重介绍了设计模式意图、动机的重要性。在本文中我们将继续上篇文章进行讨论&#xff0c;这次主要着重于设计模式的…

iOS arm 64 的了解

ARM 简介&#xff1a;ARM处理器是英国Acorn有限公司设计的低功耗成本的第一款RISC微处理器。全称为Advanced RISC Machine。百度介绍 iOS设备中的处理器都是基于ARM架构的。 arm设备真机i386&#xff08;iphone5,iphone5s以下的模拟器&#xff09;x86_64(iphone6以上的模拟器…

wireshark和tcpdump抓包TCP乱序和重传怎么办?PCAP TCP排序工具分享

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ 介绍TCP排序方法&#xff0c;分享一个Windows版的TCP排序工具。” 在分析协议的过程中&#xff0c;不可避免地需要抓包。 无论抓包条件如何优越&#xff0c;无论Windows下使用wireshark还是Linux下使用tcpdump&#xff0c;无论是…