在这个信息爆炸的时代,开发者们肩负着前所未有的责任与挑战,以屈原名言 路漫漫其修远兮,吾将上下而求索 为指引,使用HTML制作一个赛龙舟小游戏,以此激励广大开发者在技术征途上不断求索,追求极致。
该游戏所涉及到的技术只有HTML、CSS、JS,所以这里只需要用到一些前端开发idea,后端以及数据库都没有用到,使用HBuilderX或者WebStorm都可以,这一小节主要介绍在HBuilderX中创建项目以及开发的过程。
打开开发工具,在左上角点击下图所选择的图标,选择项目

左侧tab选择普通项目,右侧选择空项目或者基本HTML项目均可,输入项目名称以及位置后在右下角点击保存即可创建一个项目。

准备一些带有端午元素的素材图片,粽子,龙舟等,将素材存放至上述步骤所创建的images文件夹中。
分别引入layui以及jqmeter.min.js,前者用于快速构建网页界面的同时将JS动态化渲染;后者则是用于实现进度条加载动画。

选中项目,选择新建HTML文件,它会在创建该页面的同时自动默认创建结构标签,只需要在body标签中进行开发即可。

在body中新建一个div,设置唯一ID,同时通过css设置其背景图
增加一个开始游戏的按钮,通过设置定位的方式将其固定在界面上实现效果如下。

.start{
width: 310px;
height: 120px;
position: absolute;
left: 50%;
top: 200px;
margin-left: -155px;
padding: .3em .8em;
border: 1px solid rgba(0,0,0,.1);
background: #58a linear-gradient(hsla(0,0%,100%,.2),transparent);
border-radius: .2em;
box-shadow: 0 .05em .25em rgba(0,0,0,.5);
outline: none;
color: white;
text-shadow: 0 -.05em .05em rgba(0,0,0,.5);
font-size: 60px;
line-height: 1.5;
cursor: pointer;
z-index: 999;
background-color: #6b0;
}
使用script标签引入外部插件,同时在js中给开始按钮增加对应的点击事件
/*******************点击开始按钮*****************************/
$(".start").on("click",function () {
});
jqmeter使用起来非常简单,在HTML结构中增加一个div标签,同时在点击按钮后调用该进度条插件。注意:该进度条插件有两个必填的参数:goal和raised。此外还有一些可用的参数,其中一些参数也可以使用css来实现,如颜色参数;

$('#jqmeter-container').jQMeter({
goal:'$100',
raised:'$100',
animationSpeed :5000,
counterSpeed: 5000
});
设置audio标签,当点击开始时自动进行播放
设置定时函数随机生成障碍物,通过变量控制所生成的坐标。

var leftSkip=0,speed=2000;
var target=$(window).height(),skip=0,score=0;
var blockInter= setInterval(blockFn,speed);
function blockFn() {
$(".block").animate({
top:target
},speed,"linear",function () {
leftSkip=Math.random()*250;
$(".block").css({"top":-70, "left":leftSkip});
});
};
通过操作dom元素的方式获取keydown键盘事件,这里有针对性的写一些常用的按键即可,如A、D、方向键等。KeyDown()功能:检查用户是否按了键盘上指定的键。语法:KeyDown ( keycode )参数 keycode:KeyCode枚举类型或integer类型,指明要检测的按键或某个键的ASCII值返回值Boolean。如果用户按了keycode参数指定的按键,函数返回TRUE,否则返回FALSE。

$(document).keydown(function (ev) {
var left=$(".car").offset().left;
var top=$(".car").offset().top;
//龙舟移动
switch (ev.which) {
case 65://a
$(".car").offset({left:Math.max(left-10,$(".box").offset().left)});
break;
case 68://d
$(".car").offset({left:Math.min(left+10,
$(".box").offset().left+$(".box").width()-$(".car").width())});
break;
case 37:
$(".car").offset({left:Math.max(left-10,$(".box").offset().left)});
break;
case 39:
$(".car").offset({left:Math.min(left+10,
$(".box").offset().left+$(".box").width()-$(".car").width())});
break;
});
键盘事件定义的属性
| 属性 | 说明 |
|---|---|
| keyCode | 该属性包含键盘中对应键位的键值 |
| charCode | 该属性包含键盘中对应键位的Unicode编码,仅DOM支持 |
| target | 发生事件的节点(包含元素),仅DOM支持 |
| srcElement | 发生事件的元素,仅IE支持 |
| shiftKey | 是否按下Shift键,如果按下返回true,否则为false |
| ctrlKey | 是否按下Ctrl键,如果按下返回true,否则为false |
| altKey | 是否按下Alt键,如果按下返回true,否则为false |
| metaKey | 是否按下Meta键,如果按下返回true,否则为false,仅DOM支持 |
键位和码值对照表
| 键位 | 码值 | 键位 | 码值 |
|---|---|---|---|
| 0~9(数字键) | 48~57 | A~Z(字母键) | 65~90 |
| Backspace(退格键) | 8 | Tab(制表键) | 9 |
| Enter(回车键) | 13 | Space(空格键) | 32 |
| Left arrow(左箭头键) | 37 | Top arrow(上箭头键) | 38 |
| Rigth arrow(右箭头键) | 39 | Down arrow(下箭头键) | 40 |
代码示例:演示了如何使用方向键控制页面元素的移动效果
通过操作dom元素的方式获取audio标签
var explodeAudio=document.getElementById("explode");
设置为play
explodeAudio.play();
explodeAudio.currentTime=0;
使用clearInterval清除全局定义的定时器
clearInterval(blockInter);
clearInterval(scoreInter);
clearInterval(backInter);
clearInterval(colorInter);
通过layui弹出层将最终分数进行提示

$(".box .block").css("background","url(\"images/explode.png\")")
var index =layer.alert("
"+"
"+"失败!最终得分:"+score,{
title:false,
closeBtn:0,
btn: ['重来']
},function () {
window.location.reload();
});
设置定时器,根据所获取的分数加载不同的关卡背景

var colorInter= setInterval(colorFn,10000);
function colorFn() {
color>50?color-=10:color=50;
lv+=1;
backColor="rgb("+color+','+color+','+color+')';
//speed值
speed<=100?speed=100:speed-=100;
$(".speed").text("speed:"+speed);
$(".box").css("background",backColor);
}
根据不同的分数提示不同的级别

$(".lv").text("Lv"+lv);
var index= layer.open({
type:1,
content:$(".lv"),
time:1000,
scrollbar:false,
move:false,
title:false,
closeBtn:false,
shade:0,
offset: '100px'
});
layer.style(index, {
background:"rgba(0,0,0,0)",
border: "none",
boxShadow: "none"
});
因外部JS较大,就没有全部通过代码块的方式放在文章中,这里主要讲解了一下实现思路跟部分关键代码,对游戏感兴趣的可以直接在文章里下载代码包。
最后祝大家端午安康,记得吃粽子,无论咸甜,都是粽情粽义。