初学JS—JavaScript实现像素鸟小游戏

简介: 初学JS—JavaScript实现像素鸟小游戏

《像素鸟》游戏简单介绍

游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的……所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。

1.功能结构及流程

包含功能 :

 1: 随机背景

2: 进行游戏

3:玩家分数排行榜

2.游戏实现效果展示

image.png

image.png

image.png

3.实现思路

  1. 创建游戏背景板和小鸟,并分别设置相对定位与绝对定位;
  2. 初始化背景图的位置;
  3. 初始化小鸟的位置;
  4. 设置游戏状态,游戏开始时背景和管道全部向左运动,游戏结束全部停止运动;
  5. 使小鸟飞行,其实就是背景图在 X 轴方向的位置不断减小,实现小鸟向右飞行效果;
  6. 设置点击事件,每点击一次小鸟在Y轴的位置减小,实现向上飞的效果;
  7. 创建管道,X 方向上管道和下管道位置相同,Y 方向上上管道和下管道高度随机,但中间要空出200px;
  8. 实现管道向左运动,与背景图向左操作类似,也是在 X 轴方向的位置不断减小
  9. 管道向左运动移出游戏面板最左侧时再回到原位重新执行,实现循环效果
  10. 定义上下管道的临界值,也就是上下管道自身区域
  11. 小鸟位置与上下管道位置重合(相碰撞)时游戏结束

代码展示介绍

游戏界面代码

不多介绍


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Fancy Bird</title>
    <link rel="stylesheet" href="./css/cscs.css">
    <link rel="shortcut icon" href="./birds/birds1.png" type="image/x-icon">
</head>
<body>
    <div class="map">
        <img src="./logo/flappyBird.png" alt="" class="flappyBird">
        <div class="home">
            <img src="./home/start.png" alt="" class="start">
            <img src="./home/ranking.png" alt="" class="ranking">
        </div>
        <div class="ready">
            <img src="./logo/getReody.png" alt="" class="getReody">
            <img src="./home/go.png" alt="" class="go">
        </div>
        <div class="finish">
            <img src="./logo/gameOver.png" alt="" class="gameOver">
            <div class="score">
                <i class="node">66</i>
                <i class="now"></i>
                <img src="./home/gold.png" alt="" class="gold">
            </div>
            <img src="./home/start.png" alt="" class="start2">
            <img src="./home/ranking.png" alt="" class="ranking">
        </div>
    </div>
    <script src="./js/jquery-2.2.0.min.js"></script>
    <script src="./js/game.js"></script>
    <script src="./js/init.js"></script>
</body>
</html>

css样式

不多介绍


* {
    margin: 0;
    padding: 0;
}
.map {
    margin: 20px auto;
    width: 520px;
    height: 855px;
    background: url(../mian/sky1.png);
    position: relative;
    overflow: hidden;
    cursor: pointer;
    text-align: left;
}
p {
    position: absolute;
    font-size: 30px;
}
h4 {
    text-align: center;
    line-height: 10px;
}
.play {
    position: absolute;
    width: 52px;
    height: 45px;
    left: -10%;
    top: -10%;
    background: url(../birds/birds1.png) center;
}
.pillarTop {
    position: absolute;
    width: 52px;
    height: 420px;
    background: url(../TheConduit/pipe2.png) center no-repeat;
    left: 550px;
}
.pillarBottom {
    position: absolute;
    width: 52px;
    height: 420px;
    background: url(../TheConduit/pipe1.png) center no-repeat;
    left: 550px;
    bottom: 0;
}
.del {
    position: absolute;
    right: 10px;
    top: 0;
    font-size: 30px;
}
.flappyBird {
    width: 300px;
    position: absolute;
    top: 204px;
    left: 540px;
}
.home,
.ready {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translateX(-50%);
}
.home {
    left: -50%;
}
.ready {
    transform: translate(-50%, -50%);
    display: none;
}
.ready .go {
    margin-left: 29%;
}
.ready .getReody {
    margin-left: 32px;
}
.gold {
    position: absolute;
    left: 30px;
    top: -545px;
}
.finish {
    width: 250px;
    text-align: center;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    display: none;
}
.score {
    position: relative;
    width: 231px;
    height: 117px;
    background: url(../home/finish.png);
    margin-left: 9px;
    z-index: 999;
}
.score .node {
    position: absolute;
    left: 175px;
    top: 35px
}
.score .now {
    position: absolute;
    left: 175px;
    top: 85px;
}

js代码

禁止页面选择以及鼠标右键


document.oncontextmenu = function () { return false; };
document.onselectstart = function () { return false; };
随机背景移动

这里我有两张背景图片,定义两个随机数,利用定时器使背景的x轴持续减少,然后形成背景移动;使用css的动画一样的效果,因人而异


// 背景移动
const map = document.querySelector('.map');
let mNum = getRandom(1, 2)
map.style.background = "url(./mian/sky" + mNum + ".png)"
let [Mbac, Pbac, y, angle, deg, flag, p, flagg] = [0, 1, 0, 0, -360, false, 0, true];
let [NO1, NO2, NO3, NO4, no5, chicken] = [null, null, null, null, null, null]
function init() {
    NO1 = setInterval(creatorPillar, 1200);
    NO5 = setTimeout(time, 2200);
    NO2 = setInterval(judge, 1000 / 60);
}
function move() {
    Mbac++;
    map.style.backgroundPositionX = "-" + Mbac + "px";
}
玩家控制像素鸟

定义一个定时器持续像素鸟y坐标减少,这样就会慢慢下落,绑定鼠标弹起事件,点击一次需要把像素鸟坐标增加


// 玩家
let play = document.createElement('div');
play.className = 'play';
map.append(play);
function a() {
    Pbac++;
    if (Pbac > 3) Pbac = 1;
    play.style.background = " url(./birds/birds" + Pbac + ".png)";
};
function judge() {
    if (flagg) {
        y += 0.2
        play.style.top = play.offsetTop + y + "px"
    }
    if (!flagg) {
        y -= 4.5
        play.style.top = play.offsetTop + y + "px"
        let time = setTimeout(() => {
            clearTimeout(time);
            flagg = true;
        }, 10);
    }
    if (play.offsetTop <= 50) {
        play.style.top = 50 + "px";
    }
    if (play.offsetTop >= map.offsetHeight - play.offsetHeight) {
        play.style.top = map.offsetHeight - play.offsetHeight + "px";
        stop()
    }
}
document.onmousedown = function () {
    y = -5
}
生成随机柱子

我写的是一个函数 然后定时器调用这个函数,然后生成两个柱子


// 生成柱子
function creatorPillar() {
    let pillarTop = document.createElement('div');
    let pillarBottom = document.createElement('div');
    let random = getRandom(100, 300) / 2
    pillarTop.className = "pillarTop";
    pillarBottom.className = "pillarBottom";
    map.append(pillarTop);
    map.append(pillarBottom);
    pillarTop.style.top = -random + "px"
    pillarBottom.style.bottom = -random + "px"
    NO4 = setInterval(() => {
        pillarTop.style.left = (pillarTop.offsetLeft -= 5) + "px"
        pillarBottom.style.left = (pillarBottom.offsetLeft -= 5) + "px"
        if (pillarTop.offsetLeft <= -100 && pillarBottom.offsetLeft <= -100) {
            pillarTop.remove();
            pillarBottom.remove();
        }
        if (pz(play, pillarTop)) {
            stop();
            siw()
        }
        if (pz(play, pillarBottom)) {
            stop();
            siw()
        }
    }, 20);
}
积分增加

由于我很懒很懒很懒很懒,就用定时器做的增加,可以靠判断来判断像素鸟是否经过了柱子,我没写不代表我不会写奥,因人而异嘛


// 积分
function time() {
    let P = document.createElement('p');
    map.append(P);
    NO3 = setInterval(() => {
        p++;
        P.innerHTML = p;
    }, 1250);
}
function pz(node1, node2) {
    let l1 = node1.offsetLeft;
    let r1 = node1.offsetLeft + node1.offsetWidth;
    let t1 = node1.offsetTop;
    let b1 = node1.offsetTop + node1.offsetHeight;
    let l2 = node2.offsetLeft;
    let r2 = node2.offsetLeft + node2.offsetWidth;
    let t2 = node2.offsetTop;
    let b2 = node2.offsetTop + node2.offsetHeight;
    if (l2 > r1 || r2 < l1 || t2 > b1 || b2 < t1) {
        return false;
    } else {
        return true;
    }
}
function getRandom(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}
function stop() {
    clearInterval(NO1);
    clearInterval(NO2);
    clearInterval(NO3);
    clearInterval(NO4);
    clearInterval(chicken);
    die();
}
function die() {
    document.onclick = null;
    setInterval(() => {
        deg += 7;
        play.style.top = (play.offsetTop += 5) + "px";
        play.style.transform = "rotateZ(" + deg + "deg)";
        if (play.offsetTop <= 0) play.style.top = 0 + "px"
        if (play.offsetTop >= map.offsetHeight - play.offsetHeight) {
            // deg = 90;
            play.style.top = map.offsetHeight - play.offsetHeight + "px"
        }
    }, 100);
    data()
}

代码要自己先看懂哦!

拿走不谢!~~~~~



目录
相关文章
|
28天前
|
JavaScript 前端开发
JavaScript基础&实战 JS中正则表达式的使用
这篇文章介绍了JavaScript中正则表达式的使用,包括正则表达式的创建、匹配模式、字符串匹配、拆分、搜索、匹配和替换等方法,并通过示例代码展示了如何应用这些技术。
JavaScript基础&实战 JS中正则表达式的使用
|
28天前
|
JavaScript 前端开发
JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象
这篇文章介绍了JavaScript中的数组、Date对象、Math对象以及包装类(String、Number、Boolean),并详细讲解了数组的创建、方法(如forEach、push、pop、unshift、slice、splice)和遍历操作,以及工厂方法创建对象和原型对象的概念。
JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象
|
28天前
|
JavaScript 前端开发
JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
这篇文章介绍了JavaScript中对象的基本概念和操作,包括对象属性和方法的使用、对象字面量的创建、函数的定义和作用域的概念,以及全局作用域和局部作用域的区别和特性。
JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
|
11天前
|
Java 数据库连接 数据库
从零到精通:揭秘 Hibernate 构建持久层服务的全过程,你离数据持久化大师还有多远?
【8月更文挑战第31天】本文详细介绍了如何从零开始使用 Hibernate 构建一个持久层服务。首先,通过在 Maven 项目中添加必要的依赖,确保项目具备使用 Hibernate 的条件。接着,配置 `hibernate.cfg.xml` 文件以连接 MySQL 数据库,并设置了基本属性。然后定义了一个简单的 `User` 实体类及其映射关系。此外,还创建了一个 `HibernateUtil` 工具类来管理 `SessionFactory`。
24 0
|
13天前
|
缓存 JavaScript 前端开发
Vue.js与JavaScript性能优化终极揭秘:掌握这些技巧,让你的Web应用飞一般地流畅!
【8月更文挑战第30天】随着前端应用复杂度的增加,性能优化变得至关重要。本文深入探讨了如何利用Vue.js和JavaScript实现高效的应用性能。主要内容包括:优化组件设计以减少不必要的渲染,采用异步组件与懒加载技术加速应用启动,利用虚拟滚动和分页处理大数据集,改进Vuex使用方式以及合理运用浏览器缓存等策略。通过具体示例和最佳实践,帮助开发者充分挖掘Vue.js潜力,打造高性能的前端应用。
28 0
|
13天前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
11 0
|
13天前
|
JavaScript 前端开发 API
揭秘Vue.js与JavaScript融合的神秘力量:如何一键解锁高效响应式Web应用的终极秘籍?
【8月更文挑战第30天】随着前端技术的发展,Vue.js凭借其轻量级、易上手和高度响应式的特性,在前端开发领域迅速崛起,成为构建现代Web应用的首选框架之一。Vue.js与JavaScript深度融合,使开发者能高效灵活地打造美观且功能强大的应用。本文将作为实战指南,带您深入了解Vue.js与JavaScript结合的奥秘,揭示构建高效响应式Web应用的秘籍。从Vue.js的基础开始,逐步介绍如何利用其数据驱动视图的特点,结合JavaScript的高级特性,如定时器、Promise、async/await等,提升应用的交互性和用户体验。
9 0
|
21天前
|
存储 JavaScript 前端开发
JavaScript:揭秘网页背后的魔法,一探究竟JS的神奇力量!
【8月更文挑战第22天】JavaScript(JS)始于1995年,以网页动态效果闻名。随Node.js等技术发展,JS现广泛用于服务器端、桌面及移动应用开发。JS是解释型语言,在浏览器中直接运行。基本语法涵盖变量声明、数据类型、运算符及控制结构。变量可用`var`、`let`或`const`声明,支持多种数据类型如`Number`、`String`。函数是代码的基本单元,支持匿名及箭头函数。对象用于表示复杂数据结构。ES6引入了类、模块等新特性。异步编程通过回调、Promises及async/await实现。掌握这些基础知识,有助于开发者构建高质量的Web应用。
28 0
|
2月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
69 2
|
2月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
62 4