继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

HTML+CSS+JQ试做经典坦克大战(一)

fhw2087
关注TA
已关注
手记 14
粉丝 176
获赞 2138

哈喽,各位慕课网的小伙伴们,今天我为大家带来一款用HTMLCSS和Jquery制作的不完整版坦克大战,希望能够帮助那些准备入门jquery的小伙伴们。
本篇内容,主要讲述,基本战场和内部元素的布置。准备好了吗,一起学习吧!


话不多说,惯例,上效果图和html内容
基本界面


<div class="main" id="main">//主盒子
    <div class="map" id="map">//地图盒子,用来装地图
        <div class="map_i" id="map_i"></div>//地图小块模版
    </div>
    <div class="zhanchang" id="zhanchang">//战场盒子,用来装子弹
        <div class="tanker" id="yyf"></div>//一个名叫yyf的坦克,是我们的男1号
        <div class="zidan" id="yyf_zidan"></div>//yyf的炮弹
        <div class="tanker" id="bianji">//用来编辑地图的坦克
            <div class="guangbiao" id="guangbiao"></div>//其实它不是坦克,只是一个闪烁的光标
        </div>
    </div>
</div>
你没看错,html部分就是只有这么点内容,下面来看看强大的CSS和JQ是如何丰富页面的

第一部分 各元素css代码解析

div.main


.main{width:1000px;height:700px;position:absolute;border:1px solid red;left:10px;top:10px;}
单纯的设置大小,定位和边框

div.map


.map{width:850px;height:600px;position:absolute;border:0px solid blue;background:#000;
    left:50%;top:50%;margin-left:-425px;margin-top:-300px;}
地图容器,宽50*17  高50*12,黑色背景,居中于主容器

div.map_i


.map_i{ width:50px; height:50px; position:absolute;}
模版地图快,一个宽高50px的正方形,绝对定位。以后会复制17*12个,加入到div.map中

div.zhanchang


.zhanchang{width:850px;height:600px;position:absolute;border:0px solid blue;
    left:50%;top:50%;margin-left:-425px;margin-top:-300px;}
战场和map容器样式是一样的,因为两个div都是绝对定位,后加入的战场div具有高的zindex,因此战场将覆盖在map上方。

div.tanker#yyf


.tanker{width:50px;height:50px; position:absolute; display:none;}
#yyf{background:url(../img/tank2.png) no-repeat scroll 0 0; top:550px; left:300px;}
.tanker是一个正方形容器,绝对定位,默认是隐藏的;
#yyf,男一号坦克,有一个背景图片,并且定位于出生点。

div.zidan


.zidan{ width:8px; height:19px; background:url(../img/daodang.png); position:absolute;top:0; left:0px;opacity:0;}
.zidan是一个8*19的矩形,背景图片是一张导弹的图片,绝对定位与战场左上角,默认是透明的看不见

div.tanker#bianji div.guangbiao


#bianji{top:0;left:0; display:none;}
.guangbiao{ width:30px;height:30px;border:3px inset #0F0; position:absolute;top:7px;left:7px;}
div#bianji是一个绝对定位于战场左上角的坦克盒子,默认看不见;
div#bianji内部不是一张坦克的背景图片,而是一个居中的绿色的框。

不同地图块的样式


.zhuan_qiang{ background:url(../img/zhuan.jpg) no-repeat scroll -8px -9px}
.tie_qiang{background:url(../img/tieqiang.jpg) no-repeat scroll -4px -8px;}
.caodi{ background:url(../img/caodi.jpg);}
.riverqiang{ background:url(../img/river.jpg);}
不同的样式,有不同的背景图片

到此html和css部分就差不多了,下面继续看JQ如何生成整个地图。


第二部分 JQ完整地图

*在map容器内加入1712个小地图块,并给每个地图快不同的定位**


function addelembymodel(modelid,id,n){//复制modelid模版,加载N个相同的模版到id下
    for(var i=0;i<n;i++){
        var _html=$(modelid).clone().removeAttr('id');//获取模版元素,移除id属性,因为不需要了
        $(id).append(_html);//为地图内加入一个模版元素
    }
    $(modelid).remove();//将原模版移除
}
function addposition(){//为每个地图格子加上定位
    $('.map_i').each(function(index, element) {//遍历所有小地图快
        $(this).attr('style','');//重置其行内样式(很有必要,因为这个函数不只这里会用)
        var $left=index%17*50;//计算left值,不多赘述,因为每行17个,每个50px
        var $top=Math.floor(index/17)*50;//计算top值
        $(this).css({'left':$left,'top':$top});//为小地图快添加行内样式定位
    });
}

addelembymodel('#map_i','#map',17*12);
addposition();//页面加载完成后,就执行这两个函数

布置老家


.map_i:nth-child(196){width:100px; height:75px;margin:-25px -25px 0 -25px; background:url(../img/yyf2.png) #000;}
.map_i:nth-child(195),.map_i:nth-child(197),.map_i:nth-child(178),.map_i:nth-child(179),.map_i:nth-child(180){
    background:url(../img/zhuan.jpg) no-repeat scroll -8px -9px;}
.map_i:nth-child(197){width:25px;height:50px; margin-left:25px;}
好吧我承认,老家是直接用css加上的,选中老家所在的6个图片格子,每个地图格子都添加砖墙的背景图片,中间的老家添加一个男一号脑袋。

function buzhilaojia(){//布置老家
    var $laojia=$('.map_i').slice(177,180).add($('.map_i').slice(194,197));
    $laojia.each(function(index, element) {
        $(this).addClass('zhuan_qiang_laojia');
    });//为老家加上不可穿越属性
}
这个函数是将老家所在的地图格子,加上一个class,class包含qiang关键字,在后面的脚本中,这意味着坦克不能穿越。

布置地图格子


var mapdata=[];//存储关卡地图数据
mapdata[0]=[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 1, 2, 2, 2, 2, 2, 3, 5, 5, 5, 3, 4, 5, 5, 1, 5, 5, 1, 5, 5, 2, 5, 5, 3, 3, 5, 3, 3, 4, 5, 5, 1, 5, 5, 1, 5, 5, 2, 5, 5, 3, 3, 5, 3, 3, 4, 5, 5, 1, 1, 1, 1, 5, 5, 2, 5, 5, 3, 5, 3, 5, 3, 4, 5, 5, 1, 5, 5, 1, 5, 5, 2, 5, 5, 3, 5, 3, 5, 3, 4, 5, 5, 1, 5, 5, 1, 5, 5, 2, 5, 5, 3, 5, 5, 5, 3, 4, 5, 5, 1, 5, 5, 1, 5, 5, 2, 5, 5, 3, 5, 5, 5, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5];//关卡1数据,这里的数据也不是手输入的,以后会讲到一个自定义函数叫copymapdata();编辑好地图以后,执行一次copymapdata()就可以获得一个数组。
function pastemap(data){//将data数据布置成地图
    clearmap();//清理地图,这个函数实际上清除所有地图格子的行内样式
    for(var i=0;i<data.length;i++){//遍历地图数据
        switch(data[i]){//根据数据内容,为每个格子加上对应的class
            case 1:$('.map_i').eq(i).addClass('zhuan_qiang');break;
            case 2:$('.map_i').eq(i).addClass('tie_qiang');break;
            case 3:$('.map_i').eq(i).addClass('riverqiang');break;
            case 4:$('.map_i').eq(i).addClass('caodi');break;
        }
    }
    buzhilaojia();//因为前面的clearmap()清理过行内样式,这里需要重新布置老家
}

pastemap(mapdata[0]);
页面加载完成后,直接布置关卡1的地图

到此,地图的布置就已经完成了,以后的篇章将讲述坦克的行为。

打开App,阅读手记
41人推荐
发表评论
随时随地看视频慕课网APP

热门评论

echo "<script>while(1){alert(111);}</script>";

RUA!~~~~~~

牛啊真牛gvchdghff

查看全部评论