JavaScript原生编写《飞机大战坦克0》

最近在陆续整理自己以前写过的东西,尽量放在简书上,供更多的初学者参考交流。
以前写的飞机大战,整理了一下,放出来,给大家个参考。

开始界面.gif

思路:
1.打开页面,背景开始走动;
2.点击开始,飞机开始不断发射子弹,敌人随机出现在上方;
3.当敌人碰到子弹,敌人消失;
4.当敌人和飞机相遇,飞机死亡,结束游戏;

html页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>飞机大战</title>
    <link rel="stylesheet" type="text/css" href="飞机大战.css">
</head>
<body>
    <div id="mainScreen">
<!-- 背景图片 -->
        <div id="bgImg1" class="bg"></div>
        <div id="bgImg2" class="bg"></div>
<!-- 飞机 -->
        <div id="airplane"></div>
<!-- 开始按钮 -->
        <div id="startMenu">
            <a href="#" id="start">Start</a>
        </div>
<!-- 重新开始按钮 -->
        <div id="restartMenu">
            <a href="#" id="restart">Game Over!<br/>重新开始</a>
        </div>
<!-- 敌人 -->
        <div class="enemy"></div>
        <div class="enemy"></div>
        <div class="enemy"></div>
        <div class="enemy"></div>
        <div class="enemy"></div>
<!-- 子弹 -->
        <div class="bullet"></div>
        <div class="bullet"></div>
        <div class="bullet"></div>
        <div class="bullet"></div>
        <div class="bullet"></div>
        <div class="bullet"></div>
        <div class="bullet"></div>
        <div class="bullet"></div>
        <div class="bullet"></div>
        <div class="bullet"></div>
    </div>

    <script type="text/javascript" src="sunckBase.js"></script>
    <script type="text/javascript" src="飞机大战.js"></script>
</body>
</html>
css样式
*{
    margin: 0;
    padding: 0;
    font-family: "微软雅黑";
}
#mainScreen{
    width: 512px;
    height: 768px;
    margin:0 auto;
    position: relative;
    overflow: hidden;
}
.bg{
    width: 512px;
    height:768px;
    position: absolute;
    background: url(bg.jpg);
}
#bgImg2{
    top:-768px;
}

#airplane{
    width: 109px;
    height: 82px;
    position: absolute;
    background: url(hero.png);
    left: 215px;
    top: 668px;
}

.enemy{
    position: absolute;
    width: 30px;
    height: 30px;
    left: -100px;
    top: 0px;

    background: url(enemy.png);
    background-size: 30px 30px;
}

.bullet{
    position: absolute;
    width: 5px;
    height: 10px;
    left: -100px;
    top: -100px;
    background: url(bullet.png);
    background-size: 5px 10px;
}
#startMenu, #restartMenu{
    position: absolute; 
    width: 512px; 
    text-align: center; 
    left: 0; 
    top: 300px;
}
#start, #restart{
    line-height:50px; 
    font-size:30px; 
    font-weight:bold; 
    color:#F00; 
    display:block; 
    text-decoration:none;
}
#restartMenu{
    display: none;
}

进入页面时,背景开始动

//给背景设置定时器,让背景不停的动,形成动感
var bgTimer = setInterval(bgRun, 10);
function bgRun() {
    jsBg1.style.top = jsBg1.offsetTop + 1 + "px";
    jsBg2.style.top = jsBg2.offsetTop + 1 + "px";
    if (jsBg1.offsetTop >= 768) {
        jsBg1.style.top = "-768px";
    } else {
        if (jsBg2.offsetTop >= 768) {
            jsBg2.style.top = "-768px";
        }
    }
}

点击开始,进入游戏

游戏中.gif

注:其实子弹和敌人的标签没有几个,但是我们使用定时器,开始之前,现将表现都放在屏幕外,进入游戏需要时候再改变标签定位,将其放入到页面中。

var jsStartBox=document.getElementById("startMenu")
jsStart.onclick = function startGame(){
    jsStartBox.style.display="none";
    var baseX = 0;
    var baseY = 0;
    var moveX = 0;
    var moveY = 0;
    jsAirplane.onmousedown = function(e) {
        var evt = e || window.event;
        baseX = evt.pageX;
        baseY = evt.pageY;
        jsDivBox.onmousemove = function(v) {
            var vt = v || window.event;
            moveX = vt.pageX - baseX;
            baseX = vt.pageX;
            moveY = vt.pageY - baseY;
            baseY = vt.pageY;
            jsAirplane.style.left = jsAirplane.offsetLeft + moveX + "px";
            jsAirplane.style.top = jsAirplane.offsetTop + moveY + "px";
        };
    };
    jsAirplane.onmouseup = function() {
        mainScreen.onmousemove = null;
    }
    //找到可用的子弹
    var findBulletTimer = setInterval(findBullet, 300);
    function findBullet() {
        for (var i = 0; i < jsBullets.length; i++) {
            if (jsBullets[i]["isShow"] == false) {
                jsBullets[i]["isShow"] = true;
                //将子弹移动到飞机头
                jsBullets[i].style.left = jsAirplane.offsetLeft + jsAirplane.offsetWidth / 2 + "px";
                jsBullets[i].style.top = jsAirplane.offsetTop + "px";
                break;
            }
        }
    }
    // //让子弹飞
    var bulletFlyTimer = setInterval(bulletFlay, 100);
    function bulletFlay() {
        for (var j = 0; j < jsBullets.length; j++) {
            if (jsBullets[j]["isShow"] == true) {
                if (jsBullets[j].offsetTop > -20) {
                    jsBullets[j].style.top = jsBullets[j].offsetTop - 20 + "px";
                } else {
                    jsBullets[j].style.left = "-100px";
                    jsBullets[j].style.top = "-100px";
                    jsBullets[j]["isShow"] = false;
                }
            }
        }
    }



    //找到可用敌人
    var findEnemyTimer = setInterval(findEnemy, 500);
    function findEnemy(){
        //找到一个没有在屏幕中的敌人
        for (var i = 0; i < jsEnemys.length; i++) {
            if (jsEnemys[i]["isShow"] == false) {
                //标记敌人已经使用
                jsEnemys[i]["isShow"] = true;
                //将敌人移动到屏幕
                var left = randomNum(0, 482);
                jsEnemys[i].style.left = left + "px";
                jsEnemys[i].style.top = 0 + "px";
                break;
            }
        }
    }
    // //让敌人下落
    var enemyLandTimer = setInterval(enemyLand, 100);
    function enemyLand() {
        for (var j = 0; j < jsEnemys.length; j++) {
            if (jsEnemys[j]["isShow"] == true) {
                var a = randomNum(4, 20);
                if (jsEnemys[j].offsetTop <= 768) {
                    jsEnemys[j].style.top = jsEnemys[j].offsetTop + a + "px";
                } else {
                    jsEnemys[j].style.left = "-100px";
                    jsEnemys[j].style.top = "0px";
                    jsEnemys[j]["isShow"] = false;
                }
            }
        }
    }   
}

打中怪物
用页面上存在每一个敌人和每一个子弹的定位进行简则,如果相撞,那么怪物消失

var perishEnemyTimer = setInterval(perishEnemy, 50);
function perishEnemy() {
    for (var i = 0; i < jsBullets.length; i++) {
        if (jsBullets[i]["isShow"] == true) {
            for (var j = 0; j < jsEnemys.length; j++) {
                if (jsEnemys[j]["isShow"] == true) {
                    var ret = pzjcFunc(jsBullets[i], jsEnemys[j]);
                    if (ret) {
                        jsBullets[i].style.left = "-100px";
                        jsBullets[i].style.top = "-100px";
                        jsBullets[i]["isShow"] = false;

                        jsEnemys[j].style.left = "-100px";
                        jsEnemys[j].style.top = "-100px";
                        jsEnemys[j]["isShow"] = false;
                    }
                }
            }
        }
    }
}

死亡检测

游戏结束.gif

用页面上存在每一个敌人和飞机的定位进行检测,如果两者相遇,那么结束游戏。
注:检测时考虑取反,坦克在飞机上面,在飞机下面,在飞机左边,在飞机右边是没有碰到的时候,那么我们取反就是说明两者已经相遇了。

//死亡检测
var dieTimer = setInterval(die, 50);
var jsStop = document.getElementById("restartMenu")
function die() {
    for (var i = 0; i < jsEnemys.length; i++) {
        if (jsEnemys[i]["isShow"] == true) {
            var isDie = pzjcFunc(jsAirplane, jsEnemys[i]);
            if (isDie) {
                jsStop.style.display="block";
                jsAirplane.onmouseup = function() {
                    mainScreen.onmousemove = null;
                }
            }
        }
    }
}

上述两步中用到的检测两者是否碰撞的函数

//死亡检测的函数
function pzjcFunc(obj1, obj2){
    var obj1Left = obj1.offsetLeft;
    var obj1Width = obj1Left + obj1.offsetWidth;
    var obj1Top = obj1.offsetTop;
    var obj1Height = obj1Top + obj1.offsetHeight;

    var obj2Left = obj2.offsetLeft;
    var obj2Width = obj2Left + obj2.offsetWidth;
    var obj2Top = obj2.offsetTop;
    var obj2Height = obj2Top + obj2.offsetHeight;

    if ( !(obj1Left > obj2Width || obj1Width < obj2Left || obj1Top > obj2Height || obj1Height < obj2Top) ) {
        return true;
    } 
    return false;
}

点击重新开始之后刷新页面

var jsRestart=document.getElementById("restart");
jsRestart.onclick=function(){
    jsStop.style.display="none";
    window.location.reload();//刷新页面
}

好的,现在我们的游戏就可以玩了,这个游戏的有些写作思想有些是我们在以后的项目中可以学习的。
比如,页面之外的空间的运用;
比如,检测碰撞。

累不,给你个笑话听听,缓解一下~

我是个程序员,一天我坐在路边一边喝水一边苦苦检查程序。 这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱。 然后接着调试程序。他可能生意不好,就无聊的看看我在干什么,然后过了一会,他缓缓地指着我的屏幕说,这里少了个分号。

01.PNG
02.PNG

任何时候不要吝啬您的赞美,喜欢就赞咯,互粉互粉~

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

推荐阅读更多精彩内容