打磚塊

效果如下:


打磚塊

html結(jié)構(gòu)代碼:

<!-- 大盒子 -->
<div class="brickBreaker">
    <!-- 放所有磚塊的盒子 -->
    <div class="bricks"></div>
    <!-- 小球 -->
    <div class="ball"></div>
    <!-- 接小球的滑塊 -->
    <div class="slider"></div>
</div>

css樣式代碼:

.brickBreaker{
    width: 500px;
    height: 500px;
    border:1px solid #333;
    position:relative;
}
.bricks{
    width: 100%;
    height: 300px;
    position:absolute;
    left: 0;
    top: 0;
}
.ball{
    width: 28px;
    height: 28px;
    position:absolute;
    bottom: 30px;
    left: 235px;
    background-color: #0f0;
    border:1px solid #f00;
    border-radius:50%;
}
.slider{
    width: 198px;
    height: 28px;
    border-radius:10px;
    position:absolute;
    bottom: 0;
    left:150px;
    background-color: #aaa;
    border:1px solid #000;
}

js代碼:

// 獲取所有元素
var brickBreaker = document.querySelector('.brickBreaker');
var bricks = brickBreaker.querySelector('.bricks');
var ball = brickBreaker.querySelector('.ball');
var slider = brickBreaker.querySelector('.slider');
// 定義磚塊的大小
var brickWidth = 100;
var brickHeight = 30;
// 計(jì)算磚塊的行數(shù)和列數(shù)
var col = bricks.clientWidth / brickWidth
var row = bricks.clientHeight / brickHeight
// 創(chuàng)建磚塊并放在磚塊的盒子中
for(var i=0;i<row*col;i++){
    var div = document.createElement('div')
    setStyle(div,{
        width:brickWidth + 'px',
        height:brickHeight + 'px',
        backgroundColor:getColor(),
        position:"absolute",
        left:i%col*brickWidth + 'px',
        top:Math.floor(i/col)*brickHeight + 'px'
    })
    bricks.appendChild(div)
}
// 定義小球運(yùn)動(dòng)的x軸和y軸的速度
var speedX = 5; // 默認(rèn)向右移動(dòng)
var speedY = -5; // 默認(rèn)向上移動(dòng)
// 讓滑塊跟隨鼠標(biāo)在x軸移動(dòng)
brickBreaker.onmousemove = function(){
    var e = window.event;
    var x = e.pageX;
    // 滑塊的left = 光標(biāo)位置 - 大盒子左間距 - 大盒子邊框厚度 - 滑塊的寬度/2
    var l = x - this.offsetLeft - 1 - slider.offsetWidth/2;
    // 限制l酱固,不能讓滑塊移動(dòng)到大盒子外面
    if(l<0) l=0
    if(l>this.clientWidth-slider.offsetWidth) l=this.clientWidth-slider.offsetWidth
    // 將計(jì)算好的l設(shè)置給滑塊的left
    slider.style.left = l + 'px'
}   
// 點(diǎn)擊滑塊讓小球開始移動(dòng)
// 定義定時(shí)器變量
var timerId = null;
slider.onclick = function(){
    // 獲取滑塊開始的left和top
    var l = ball.offsetLeft;
    var t = ball.offsetTop;
    timerId = setInterval(function(){
        // 如果小球撞墻了则果,就反彈 - 讓速度從正數(shù)變負(fù)數(shù)/從負(fù)數(shù)變正數(shù)
        if(l<0){
            speedX = -speedX
         }
        if(t<0){
            speedY = -speedY
        }
        if(l>brickBreaker.clientWidth-ball.offsetWidth){
            speedX = -speedX
        }
        // 如果撞到滑塊了碌嘀,就反方向移動(dòng)
        if(collide(ball,slider)){
            speedY = -speedY
        }else{
            // 如果沒有撞到滑塊,但是小球到了滑塊下了谓媒,相當(dāng)于沒有接住小球,游戲結(jié)束
            if(ball.offsetTop + ball.offsetHeight > slider.offsetTop){
                alert("GAME OVER")
                clearInterval(timerId)
            }
        }
        // 如果撞到磚塊了馁菜,就反方向移動(dòng)
        // 遍歷所有磚塊
        for(var i=0;i<bricks.children.length;i++){
            if(collide(ball,bricks.children[i])){
                speedY = -speedY
                // 刪除撞到的這個(gè)磚塊
                bricks.removeChild(bricks.children[i])
                break;
            }
        }
        // 給left和top計(jì)算移動(dòng)距離
        l += speedX;
        t += speedY;
        // 將計(jì)算好的left和top設(shè)置給ball
        ball.style.left = l + 'px'
        ball.style.top = t + 'px'
    },50)
}
// 判斷兩個(gè)標(biāo)簽是否相撞的函數(shù)
function collide(node1, node2){
    // 標(biāo)簽1的左間距 + 標(biāo)簽1的寬度 <= 標(biāo)簽2的左間距 -- 沒有相撞
    if(node1.offsetLeft + node1.offsetWidth <= node2.offsetLeft){
        return false
    }
    // 標(biāo)簽1的左間距 >= 標(biāo)簽2的左間距 + 標(biāo)簽2的寬度 < -- 沒有相撞
    if(node1.offsetLeft >= node2.offsetLeft + node2.offsetWidth){
        return false
    }
    // 標(biāo)簽1的上間距 + 標(biāo)簽1的高度 <= 標(biāo)簽2的上間距 -- 沒有相撞
    if(node1.offsetTop + node1.offsetHeight <= node2.offsetTop){
        return false
    }
    // 標(biāo)簽1的上間距 >= 標(biāo)簽2的高度 + 標(biāo)簽2的上間距 -- 沒有相撞
    if(node1.offsetTop >= node2.offsetHeight + node2.offsetTop){
        return false
    }
    // 其他情況就是相撞
    return true
}
// 設(shè)置樣式的函數(shù)
function setStyle(ele, styleObj){
    for(var attr in styleObj){
        ele.style[attr] = styleObj[attr];
    }
}
// 獲取隨機(jī)顏色的函數(shù)
function getColor(){
    var color = '#';
    for(var i=0;i<3;i++){
        var hex = Math.floor(Math.random() * 256).toString(16)
        hex = hex.length === 1 ? '0' + hex : hex;
        color += hex;
    }
    return color
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末君仆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凫岖,更是在濱河造成了極大的恐慌江咳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥放,死亡現(xiàn)場離奇詭異歼指,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甥雕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門踩身,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人社露,你說我怎么就攤上這事挟阻。” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵附鸽,是天一觀的道長脱拼。 經(jīng)常有香客問我,道長坷备,這世上最難降的妖魔是什么熄浓? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮省撑,結(jié)果婚禮上赌蔑,老公的妹妹穿的比我還像新娘。我一直安慰自己竟秫,他們只是感情好娃惯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸿摇,像睡著了一般石景。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拙吉,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天潮孽,我揣著相機(jī)與錄音,去河邊找鬼筷黔。 笑死往史,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佛舱。 我是一名探鬼主播椎例,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼请祖!你這毒婦竟也來了订歪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肆捕,失蹤者是張志新(化名)和其女友劉穎刷晋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慎陵,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眼虱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了席纽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捏悬。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖润梯,靈堂內(nèi)的尸體忽然破棺而出过牙,到底是詐尸還是另有隱情甥厦,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布寇钉,位于F島的核電站矫渔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摧莽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一顿痪、第九天 我趴在偏房一處隱蔽的房頂上張望镊辕。 院中可真熱鬧,春花似錦蚁袭、人聲如沸征懈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卖哎。三九已至,卻和暖如春删性,著一層夾襖步出監(jiān)牢的瞬間亏娜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工蹬挺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留维贺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓巴帮,卻偏偏與公主長得像溯泣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子榕茧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容