用Html做一个“快乐鸟”小游戏

入门学习前端的时候做了这么一个简单的小游戏,为了将自己所学到的知识运用起来。

这里可以看出还是有BUG的,死亡动画不是在死亡的瞬间触发

做这个小游戏用到了:

  • html
  • css
  • jQuery

然后这个小游戏的图片素材用到了:

其实用原生的js也是可以完成的,但是为什么要用jQuery?因为我直接跳过了原生JS的学习...只有等空余的时候,好好的找本书研究一下原生的js。

下面是这个小游戏的大致流程:

其中鸟和管道应该用面向对象来做,但是我原生JS只学习了最基础的部分,而且JS在ES5的时候还没有类的概念,只能使用构造函数来模拟一个类,在ES6的时候才加入了class这个关键字,但是我知道ES6的时候,已经是在完成这个小游戏之后了。

从上面的素材图片只有4张可以看得出来,html和CSS的搭建是没有太大难度的。所以本文着重讲解JS的部分。

这里值得一说的是,我CSS上面是用的子绝父相的定律,来摆放鸟和管道,其中管道的代码如下所示:

/* 上边的管道 */
.tubeTop { 
 width: 90px;
 height: 420px;
 background: url(../image/bird/ColumnSprite.png) no-repeat 0 0;
 background-size: cover;
 transform: rotate(180deg);
}
/* 下边的管道 */
.tubebotton {
 width: 90px;
 height: 420px;
 background: url(../image/bird/ColumnSprite.png) no-repeat 0 0;
 background-size: cover;
 margin-top: 100px;
}

.tube {
 position: absolute;
 top: 0;
}

可以看得出来,其实上下管道用的是一张图片,只是将它旋转了180度,然后包含在一个div中,这样只要设置父盒子的位置,上下的两根管道的位置就不需要再去设置。

模型控制:

其实整个游戏,鸟是没有动的,我是让背景向前移动,这里有一点需要注意背景我并不是拼接了很多张图,而是仅仅用了两张图,一张在可视范围内,一张在可视范围外,当前面的那张移出可视范围的时候,再用JS将它放置到后面那张背景的后面,这样反复,就可以变成一个无限背景。

当管道移除可视范围外的时候,我并没有将它进行销毁,而是用JS重新设置它的位置,因为产生和销毁一个物体的时候,是非常的耗费性能的,如果一个物件能够复用,就需要想办法进行复用。

控制管道和背景的代码,管道的位置控制都是通过css设置它们position:

//控制管道
function tubeControl() {
    var tube = $(".tube");
    //背景1
    var bgImg1 = $(".bgImage")
        .css("left")
        .split("p")[0];
    bgImg1 = bgImg1 - 1 + "px";
    $(".bgImage").css("left", bgImg1);
    if (parseInt(bgImg1) < -1490) {
        bgImg1 = 1500 + "px";
        $(".bgImage").css("left", bgImg1);
    }
    //背景2
    var bgImg2 = $(".bgImage2")
        .css("left")
        .split("p")[0];
    bgImg2 = bgImg2 - 1 + "px";
    $(".bgImage2").css("left", bgImg2);
    if (parseInt(bgImg2) < -1490) {
        bgImg2 = 1500 + "px";
        $(".bgImage2").css("left", bgImg2);
    }
    //草
    var Green = $(".bootonGreen")
        .css("left")
        .split("p")[0];
    Green = Green - 1 + "px";
    $(".bootonGreen").css("left", Green);
    if (parseInt(Green) < -1490) {
        Green = 1500 + "px";
        $(".bootonGreen").css("left", Green);
    }
    var Green2 = $(".bootonGreen2")
        .css("left")
        .split("p")[0];
    Green2 = Green2 - 1 + "px";
    $(".bootonGreen2").css("left", Green2);
    if (parseInt(Green2) < -1490) {
        Green2 = 1500 + "px";
        $(".bootonGreen2").css("left", Green2);
    }
    for (var i = 0; i < tube.length; i++) {
        var left = tube
            .eq(i)
            .css("left")
            .split("p")[0];
        if (left < -250) {
            left = 1550 + "px";
            var top = -myRondom(210) + "px";
            tube.eq(i).css("left", left);
            tube.eq(i).css("top", top);
        } else {
            left -= 1;
            tube.eq(i).css("left", left);
        }
    }
}

当管道已经移出可视范围的时候,给它一个随机数重新设置它的位置:

// 随机数
function myRondom(muth) {
    return Math.floor(Math.random() * muth);
}
//Math.random()是随机生成0~1之间的小数
for (var i = 0; i < tube.length; i++) {
    var left = tube
        .eq(i)
        .css("left")
        .split("p")[0];
    if (left < -250) {
        left = 1550 + "px";
        var top = -myRondom(210) + "px";
        tube.eq(i).css("left", left);
        tube.eq(i).css("top", top);
    } else {
        left -= 1;
        tube.eq(i).css("left", left);
    }
}

控制鸟的方式我是一直让它向下走:

function birdDown() {
    var bird = $(".bird")
        .css("top")
        .split("p")[0];
    bird = parseInt(bird) + 1 + "px";
    $(".bird").css("top", bird);
}

然后鸟的动画部分就是让图片来回切换就可以达到动起来的效果,但是开篇的BUG也是在这里产生的,因为这个切换图片设置了延迟,所以在鸟死亡的时候,可能这个图片还没有进行切换:

//让鸟动起来
function birdAnima() {
    var bird = $(".bird");
    setInterval(function() {
        if (window.die) {
            $(".bird").css(
                "background-position",
                "-128px 0px"
            );
            return;
        }
        bird.css("background-position", "-64px 0px");
        setTimeout(function() {
            bird.css(
                "background-position",
                "0px 0px"
            );
        }, 250);
    }, 500);
}

我在怎么判断鸟是否撞到管道然后触发死亡状态的地方卡了一会,最后我是通过鸟的盒子的上下左右的坐标因为他们都是绝对定位,而我给了整个可视窗口相对定位,所以当它们的坐标相同时,它们之间就会重叠,然后和管道的坐标进行一个判断:

//判断鸟的位置
function gameControl() {
    // 地面为bottom 100px
    var birdBottom = $(".bird")
        .css("bottom")
        .split("p")[0];
    if (parseInt(birdBottom) <= 80) {
        death();
    }
    var tube = $(".tube");
    var birdTop = parseInt(
        $(".bird")
            .css("top")
            .split("p")[0]
    );
    var birdLeft = parseInt(
        $(".bird")
            .css("left")
            .split("p")[0]
    );
    for (var i = 0; i < tube.length; i++) {
        var top =
            parseInt(
                tube
                    .eq(i)
                    .css("top")
                    .split("p")[0]
            ) + 420;
        var left = parseInt(
            tube
                .eq(i)
                .css("left")
                .split("p")[0]
        );
        if (birdTop < top || birdTop + 34 > top + 100) {
            if (
                birdLeft + 64 > left + 10 &&
                birdLeft < left + 90
            ) {
                death();
            }
        }
        if (left < 300) {
            console.log(birdLeft, left + 90);
        }
        if (
            birdLeft > left + 90 &&
            birdLeft < left + 101
        ) {
            addScroe();
        }
    }
}

得分的判断也在这个函数中,当小鸟飞过管道的某一位置,就调用addScroe()这个方法

为了保证分数和死亡只有一个,所以我将他们设置为全局变量window.die和window.playScroe,如果撞到地板和管道,就调用death()函数,同时将die设置为true:

//死亡状态
function death() {
    window.die = true;
    $(".gameEnd span").text("您的得分:" + window.playScroe);
    $(".gameEnd").fadeToggle(200);
}
注:声明变量时不加window也是全局变量,但是加上的话更明显,一眼就可以知道它是全局变量。

最后是重新开始函数,将管道背景鸟的位置复位:

//重新开始
function Recovery() {
    window.die = false;
    window.playScroe = 0;
    $("#scroe").text(window.playScroe);
    var tube = $(".tube");
    var wid = 400;
    for (var i = 0; i < tube.length; i++) {
        var left = wid + "px";
        var top = -myRondom(210) + "px";
        tube.eq(i).css("top", top);
        tube.eq(i).css("left", left);
        wid += 300;
    } //背景1
    var bgImg1 = $(".bgImage").css("left", "0px");
    //背景2
    var bgImg2 = $(".bgImage2").css("left", "1500px");
    //草
    var Green = $(".bootonGreen").css("left", "0px");
    var Green2 = $(".bootonGreen2").css("left", "1500px");
    Green2 = Green2 - 1 + "px";
    var bird = $(".bird").css({
        left: "200px",
        top: "400px"
    });
}

整个小游戏大致的思路就是这样了,如果有什么疑问或者有什么错误的地方欢迎在评论指出~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 1.初识 微信小游戏目前的主要入口有下面几个:群或好友分享识别小游戏二维码微信聊天列表页面下拉后出现最近玩过的小游...
    勇敢的_心_阅读 2,919评论 0 6
  • 小游戏与小程序的区别? 小游戏是小程序的一个类目,小游戏是微信开放给小程序的更多的能力,让小程序开发者有了开发游戏...
    极乐叔阅读 18,090评论 0 19
  • 相依相伴 第二十二章 回门这天,李泽君和素华早早的等在门口,看到马车停下,俩口子很热情的招待女儿和女婿 “振君,慧...
    安洛语阅读 375评论 3 5
  • 自从前年年底从河北涿州回来,心里就一直惦念着那个乡下的铁万表叔。 说起铁万表叔,他是我奶奶二妹妹的儿子,我管奶奶的...
    达文溪阅读 454评论 6 6
  • 第一章 加载和执行 知识点 由于页面在加载遇到script标签时,会下载并执行js文件,从而阻塞包括页面绘制在内的...
    jacktown阅读 355评论 0 0