文章目录
前言 : H5小游戏, 在规定时间内, 接掉落块,接到掉落块1,能量减1。接到掉落块2 , 能量加1, 能量满, 游戏成功。 规定时间内,能量条未满或时间到则游戏失败
一、效果
失败效果:
成功效果图:
二、html结构
1.布局
代码如下(示例):
<div class="bg">
</div>
<div class="date-box">
<span >10s</span>
</div>
<div class="box">
<img src="./box.jpg" alt="">
</div>
<div class="result-box">
<div class="result-box-img">
<img src="./gameImg/progress.png" alt="">
</div>
</div>
<div class="dialog">
<div class="img-box">
<img src="./img2/success.png" alt="">
<span class="dialog-result"></span>
<button class="nav-to"></button>
</div>
</div>
<div class="failDialog">
<div class="img-box">
<img src="./img2/lose.jpg" alt="">
<span class="dialog-result"></span>
<button class="again"></button>
</div>
</div>
<div class="gameOverDialog">
<div class="img-box">
<img src="./gameImg/gameOver.png" alt="">
<span class="dialog-result"></span>
<button class="back"></button>
</div>
</div>
2.样式
代码如下(示例):
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
img {
vertical-align: middle;
max-width: 100%;
}
.bg img,
.box img {
width: 100%;
}
.bg {
width: 100%;
height: 100vh;
/* background-image: url('./gameImg/bgIMg.jpg'); */
background-size: 100% 100%;
}
.box {
width: 25vw;
position: fixed;
left: 36%;
bottom: 28vw;
}
.el {
width: 12vw;
position: fixed;
pointer-events: none;
}
.date-box {
position: fixed;
right: 3vw;
top: 3vw;
width: 22vw;
}
.date-box span {
position: absolute;
width: 13vw;
height: 6vw;
line-height: 6vw;
left: 7vw;
top: 2vw;
text-align: center;
color: #d7574f;
font-size: 8vw;
}
.result-box {
position: absolute;
left: 4vw;
top: 194vw;
width: 92%;
height: 18vw;
background-size: 100% 100%;
}
.result-box .result-box-img {
/* width: 18%; */
position: absolute;
left: 25.5%;
bottom: 10%;
height: 14vw;
width: 50%;
overflow: hidden;
}
.result-box .result-box-img img{
height: 14vw;
width: 100%;
position: absolute;
}
.dialog {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
display: none;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, .6);
}
.dialog .img-box {
width: 70vw;
position: relative;
}
.dialog button {
position: absolute;
left: 18vw;
top: 87vw;
border: none;
width: 34vw;
height: 11vw;
opacity: 0;
}
.dialog .again {
left: 26vw;
top: 127vw;
width: 17vw;
height: 7vw;
}
.dialog-result {
position: absolute;
left: 27vw;
top: 37.3vw;
width: 8vw;
font-size: 5vw;
color: #f1f7ee;
height: 8vw;
line-height: 8vw;
text-align: center;
}
.fistDialog {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
display: none;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, .6);
}
.fistDialog .img-box {
width: 70vw;
position: relative;
}
.fistDialog button {
position: absolute;
left: 18vw;
top: 101vw;
border: none;
width: 34vw;
height: 11vw;
opacity: 0;
}
.fistDialog .again {
left: 26vw;
top: 127vw;
width: 17vw;
height: 7vw;
}
.fistDialog-result {
position: absolute;
left: 27vw;
top: 37.3vw;
width: 8vw;
font-size: 5vw;
color: #f1f7ee;
height: 8vw;
line-height: 8vw;
text-align: center;
}
.failDialog,
.gameOverDialog {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
display: none;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, .6);
}
.failDialog .img-box,
.gameOverDialog .img-box {
width: 70vw;
position: relative;
}
.failDialog button,
.gameOverDialog button {
position: absolute;
left: 18vw;
top: 101vw;
border: none;
width: 34vw;
height: 11vw;
opacity: 0;
}
.failDialog .again,
.gameOverDialog .back {
position: absolute;
left: 21vw;
top: 87.3vw;
width: 29vw;
font-size: 5vw;
color: #f1f7ee;
}
3.控制盒子移动
盒子左右移动代码如下(示例):
var startX, startY, endX, endY, changeX, changeY;
$('.box').on("touchstart", function (event) {
event.preventDefault();
if (!event.touches.length) return;
var touch = event.touches[0];
startX = touch.pageX;
endX = startX;
startY = touch.pageY;
endY = startY;
return false
});
$('.box').on("touchmove", function (event) {
event.preventDefault();
if (!event.touches.length) return;
var touch = event.touches[0];
startX = endX;
endX = touch.pageX;
changeX = endX - startX;
startY = endY;
endY = touch.pageY;
changeY = endY - startY;
var ml = (parseInt($(this).css('left')) + changeX);
var tl = (parseInt($(this).css('top')) + changeY);
// console.log(ml)
// 拖到底就不能再拖动
if (ml < 0) {
ml = 0;
}
if ((ml + $(this).outerWidth()) > window.innerWidth) {
ml = window.innerWidth - $(this).outerWidth();
}
$(this).css("left", ml);
});
$('.box').on("touchend", function (event) {
event.preventDefault();
});
3.动态生成图片
let imgArr = ['./gameImg/boom.png'];
let imgArr1 = ['./img2/money.png',];
initElTimer = setInterval(() => {
// 动态生成img
if (Math.random() > 0.4) {
// 增加的
let src = imgArr1[randomNum(0, 0)];
new initEl(src, false);
} else {
new initEl(imgArr[randomNum(0, 0)], true);
}
}, 500)
4.倒计时
setTimeout(() => {
dateTimer = setInterval(() => {
date--;
$('.date-box span').text(date + 's');
if (date <= 0) {
clearInterval(dateTimer);
clearInterval(initElTimer);
$('.el').hide();
}
}, 1000);
}, 1000)
5.生成随机数
function randomNum(minNum, maxNum) {
return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
}
三、JS逻辑
let result = -47;
let imgArr = ['./gameImg/boom.png'];
let imgArr1 = ['./img2/money.png',];
let date = 10;
var flag = 1;
$('.nav-to').on('click', function () {
console.log("跳转页面");
})
let initElTimer = null;
let dateTimer = null
initPage()
function initPage() {
result = -47;
date = 10;
$('.box').css('left', '36%');
$('.result-box img').css('left',"-47vw")
initElTimer = setInterval(() => {
// 动态生成img
if (Math.random() > 0.4) {
// 增加的
let src = imgArr1[randomNum(0, 0)];
new initEl(src, false);
} else {
new initEl(imgArr[randomNum(0, 0)], true);
}
}, 500)
// 倒计时
setTimeout(() => {
dateTimer = setInterval(() => {
date--;
$('.date-box span').text(date + 's');
if (date <= 0) {
clearInterval(dateTimer);
clearInterval(initElTimer);
$('.el').hide();
if (flag == 1) {
console.log('第一次挑战失败');
$('.failDialog').css('display', 'flex');
$('.failDialog .again').on('click', function () {
$('.failDialog').hide();
initPage();
flag++
console.log('flag', flag);
})
} else if (flag >= 2) {
console.log('第二次挑战失败');
$('.gameOverDialog').css('display', 'flex');
$('.gameOverDialog .back').on('click', function () {
$('.gameOverDialog').hide();
console.log('回到首页');
})
}
}
}, 1000);
}, 1000)
}
class initEl {
constructor(imgSrc, isMinus) {
this.imgSrc = imgSrc;
this.isMinus = isMinus;
this.timer = null;
this.el = null;
this.createEl();
}
createEl() {
this.el = document.createElement('img');
this.el.className = 'el';
this.el.src = this.imgSrc;
this.el.setAttribute('style', `left: ${randomNum(0, 80)}vw; top: ${randomNum(0, -40)}vw;`);
document.body.appendChild(this.el);
this.setTimer()
}
setTimer(el) {
this.timer = setInterval(() => {
this.el.style.top = this.el.offsetTop + 10 + 'px';
let bt = $('.box').offset().top,
bh = $('.box').outerHeight(),
bl = $('.box').offset().left,
bw = $('.box').outerWidth();
let t = $(this.el).offset().top,
h = $(this.el).outerHeight(),
l = $(this.el).offset().left,
w = $(this.el).outerWidth();
if ((t + h) > bt) {
// 已超过盒子
// 从上往下的临界值为10px
if (date > 0 && (t + h) - bt < (h + 10)) {
// date 判断是否在有效时间内
if (l + w > bl && l < bl + bw) {
if (this.isMinus) {
result -= 9.6;
} else {
result += 9.6;
}
if (result >= -2) {
result = 0;
clearInterval(dateTimer);
clearInterval(initElTimer);
$('.el').hide();
$('.dialog').css('display', 'flex');
console.log('挑战成功');
$('.result-box img').css('left', result + 'vw')
clearInterval(this.timer);
document.body.removeChild(this.el);
return
}
if (result < -47) {
result = -47;
}
$('.result-box img').css('left', result + 'vw')
// debugger
clearInterval(this.timer);
document.body.removeChild(this.el);
return
}
}
if ((t + h) - bt > window.innerHeight + h) {
clearInterval(this.timer);
document.body.removeChild(this.el);
}
}
}, 20)
}
}
//生成从minNum到maxNum的随机数
function randomNum(minNum, maxNum) {
return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
}
总结
以上就是JS实现接掉落块游戏全部代码,添加了两次机会判断,可控制下落速度、时间。