本文介绍如何使用HTML、CSS和JavaScript开发一款简易的抓娃娃机小游戏。通过CSS动画实现爪子抓取效果,利用JavaScript控制器处理交互逻辑,完整代码托管于GitHub,适合前端开发者学习动效与交互实现。
前言
前阵子在商场用餐时,注意到一台有趣的抓娃娃机。这台机器是密封结构,底部放置着被捆绑好的龙虾模型。玩家需购买代币尝试抓取,成功后可支付少量加工费,由周边商家代为烹饪成龙虾大餐,这种玩法颇具新意。
其吸引力在于抓取后还需额外支付手工费进行烹饪,这吸引了大量围观者。经过观察发现,爪子的抓力有限,龙虾在水中仍可移动,且个体较大,小爪子似乎难以抓起。
回家后,孩子提出希望我制作一个类似的抓娃娃机游戏。
作为程序员,我认为这一需求不难实现,于是决定为孩子制作一个手机版的简易抓娃娃机。初衷是为了让孩子开心,同时鉴于近期掘金平台有小游戏活动,便整理分享出来。
效果展示

如上图所示,界面包含一个可移动的抓手以及几个礼物样品,设有左右移动和抓取按钮。尽管素材简单,但整体效果仍具备抓娃娃机的特征。
资源获取
代码托管在GitHub,在线预览地址可能因资源路径问题无法访问。如需源码,请前往Git仓库自行获取。
布局实现
布局部分较为简单,直接提供代码。用户可根据实际需求进行自定义调整。
<div class="page-portrait" id="page-portrait">
<div id="pageContainer" class="page-container game-box">
<div class="poster-main">
<ul class="poster-list">
<li class="item lw1"><img src="images/dx-lw1.png" alt=""></li>
<li class="item lw2"><img src="images/dx-lw2.png" alt=""></li>
<li class="item lw3"><img src="images/dx-lw3.png" alt=""></li>
<li class="item lw4"><img src="images/dx-lw4.png" alt=""></li>
<li class="item lw5"><img src="images/dx-lw5.png" alt=""></li>
<li class="item lw6"><img src="images/dx-lw6.png" alt=""></li>
</ul>
</div>
<div id="stop" class="button"></div>
<div id="left" class="left-btn"></div>
<div id="right" class="right-btn"></div>
<div class="zhua-top">
<span class="zhua-zuo"></span>
<span class="zhua-zhu"></span>
<div class="zhua zhuamove"></div>
</div>
</div>
</div>CSS部分使用了多个运动关键帧来处理爪子的动画效果,具体代码如下。
@keyframes run {
0% {
background-image: url(../images/dx-zhua3.png);
}
25% {
background-image: url(../images/dx-zhua2.png);
}
50% {
background-image: url(../images/dx-zhua1.png);
}
75% {
background-image: url(../images/dx-zhua2.png);
}
100% {
background-image: url(../images/dx-zhua3.png);
}
}
@keyframes zhuashou {
0% {
top: 360px;
background-image: url(../images/dx-zhua1.png);
}
100% {
top: 360px;
background-image: url(../images/dx-zhua2.png);
}
}
@keyframes zhuadown {
0% {
top: 138px;
background-image: url(../images/dx-zhua1.png);
}
100% {
top: 360px;
background-image: url(../images/dx-zhua1.png);
}
}
@keyframes zhua-slideUp {
0% {
top: 360px;
background-image: url(../images/dx-zhua2.png);
}
100% {
top: 138px;
background-image: url(../images/dx-zhua2.png);
}
}
@keyframes img-slideUp {
0% {
top: 23px;
}
100% {
top: -200px;
}
}JavaScript代码创建了一个控制器类,用于处理事件响应及动画效果的交替逻辑。
var Carousel = {
data: {
result: 1
},
init: function () {
Carousel.control();
},
stop: function () {
$(".zhua").removeClass("zhuamove").addClass("zhuadown");
$(".zhua-zhu").addClass("zhudown");
var timer01 = setTimeout(function () {
$(".zhua").removeClass("zhuadown").addClass("zhuashou");
var timer03 = setTimeout(function () {
$(".zhua").removeClass("zhuashou").addClass("zhuaup");
$(".zhua-zhu").removeClass("zhudown").addClass("zhuup");
$(".poster-list .lw" + (Carousel.data.result + 1)).addClass("img-slideUp");
clearTimeout(timer03);
timer03 = null;
}, 800);
var timer02 = setTimeout(function () {
$(".zhua").removeClass("zhuaup").removeClass("zhuaup1");
$(".zhua-zhu").removeClass("zhuup");
clearTimeout(timer02);
timer02 = null;
alert("恭喜您抽中一等奖~");
Carousel.start();
}, 2500);
clearTimeout(timer01);
timer01 = null;
}, 1000);
},
start: function () {
$(".zhua").addClass("zhuamove");
$(".zhua").removeClass("zhuadown").removeClass("zhuaup1").removeClass("zhuaup");
$(".poster-list .item").removeClass("img-slideUp").removeClass("img-slideOutUp");
},
zhuaMove: function (num) {
switch (num) {
case 0:
$(".zhua-top").animate({
left: -145,
},300);
break;
case 1:
$(".zhua-top").animate({
left: 0,
},300);
break;
case 2:
$(".zhua-top").animate({
left: 145,
},300);
break;
}
},
control: function () {
$("#left").on("click", function () {
Carousel.data.result--;
if (Carousel.data.result <= 0) {
Carousel.data.result = 0;
}
Carousel.zhuaMove(Carousel.data.result);
});
$("#stop").click(Carousel.stop);
$("#right").on("click", function () {
Carousel.data.result++;
if (Carousel.data.result >= 2) {
Carousel.data.result = 2;
}
Carousel.zhuaMove(Carousel.data.result);
});
},
};总结
CSS目前有许多新特性可以解决工作中的动效及兼容性问题。建议有兴趣的开发者多查阅文档,编写感兴趣的小Demo,或为孩子制作小游戏,这同样能带来成就感。
到此这篇关于HTML+CSS+JS实现抓娃娃机游戏的文章就介绍到这了,更多相关JS抓娃娃机内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!