我們現(xiàn)在開始為球添加checkBricks()方法,它就好象我們先前定義的checkWalls()方法。
MovieClip.prototype.move = function (pGame) { this.vx = pGame.speed * Math.cos (-45 * Math.PI / 180) ; this.vy = pGame.speed * Math.sin (-45 * Math.PI / 180) ; this.x = this._x ; this.y = this._y ; this.onEnterFrame = function () { this.x += this.vx ; this.y += this.vy ; this.checkWalls (pGame) ; this.checkBricks (pGame) ; this._x = this.x ; this._y = this.y ; } } ;
MovieClip.prototype.checkBricks = function (pGame) { for (var cl in pGame.timeline.brick_board) { //將brick_board里的電影剪輯的名字附給cl var clip = pGame.timeline.brick_board[cl]; if (clip.hitTest(this.x, this.y, true)) { var u = clip._y; var d = clip._y + clip._height; var l = clip._x; var r = clip._x + clip._width; var bounce = 0; clip.life--; if ( clip.life == 0) clip.removeMovieClip(); if (this._x <= l && this.x >= l) { this.x = l; this.vx *= -1; bounce = 1; } else if (this._x >= r && this.x <= r) { this.x = r; this.vx *= -1; bounce = 1; } if (this._y <= u && this.y >= u) { this.y = u; this.vy *= -1; bounce = 1; } else if (this._y >= d && this.y <= d) { this.y = d; this.vy *= -1; bounce = 1; } if (!bounce) { trace ("Houston, we have a problem!"); this.vy *= -1 ; trace (this.x + ":" + this._x + ":" + l + ":" + r); trace (this.y + ":" + this._y + ":" + d + ":" + u); } pGame.checkEndLevel (); } } } ;
首先深呼吸一下,上面的代碼不會(huì)像你想象的那么糟糕。在下面的部分,我會(huì)解釋這些代碼的 for (var cl in pGame.timeline.brick_board) { var clip = pGame.timeline.brick_board[cl];
由于for...in的循環(huán),我們能夠一個(gè)跟一個(gè)地檢測包含在pGame.timeline.brick_board里所有的電影剪輯并將名字附給c1,為了使代碼更加容易理解和容易修改,我定義了一個(gè)名為clip的容器(我們可以理解為一個(gè)在主時(shí)間軸上調(diào)用磚塊的絕對(duì)路徑),這是一個(gè)很重要的方法,所以你一定要明白它做的作用。 if (clip.hitTest(this.x, this.y, true)) {
這是我們第一次在游戲中運(yùn)用hitTest()這個(gè)方法,要注意我們這里是用了檢測點(diǎn)碰撞的方法,這樣就是假設(shè)球?yàn)橐粋(gè)點(diǎn),那么就沒有了寬度,但這當(dāng)然是不現(xiàn)實(shí)的,那么就意味著我們的游戲不是100%的準(zhǔn)確了。 但很幸運(yùn)地說,這個(gè)游戲沒必要100%的準(zhǔn)確,只要充分的準(zhǔn)確就可以了,如果球很大的話,那么最好是用電影剪輯和電影剪輯的碰撞來檢測碰撞(myMovieClip.hitTest(target))。 OK,現(xiàn)在我們知道球碰撞了磚塊了,然后我們要找出球和磚塊的哪個(gè)面發(fā)生了碰撞。 (注:這里的磚塊的注冊(cè)點(diǎn)是在左上角) var u = clip._y; //上面 var d = clip._y + clip._height; //下面 var l = clip._x; //左面 var r = clip._x + clip._width; //右邊
這樣就重新得到磚塊邊界變量。注:這里的磚塊的注冊(cè)點(diǎn)是在左上角 var bounce = 0; clip.life--; if ( clip.life == 0) { clip.removeMovieClip();//刪去磚塊 }
bounce變量將告訴我們是否我們已經(jīng)碰撞了,顯然地,當(dāng)球碰撞了磚塊,磚塊的"life"變量將會(huì)減少,但減為0的時(shí)候,磚塊將會(huì)被刪除。
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁 基于 as1.0 的擋板游戲 [5] 下一頁 基于 as1.0 的擋板游戲 [7]
◎進(jìn)入論壇Flash專欄版塊參加討論
|