我们现在开始为球添加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 (); } } } ;
首先深呼吸一下,上面的代码不会像你想象的那么糟糕。在下面的部分,我会解释这些代码的 for (var cl in pGame.timeline.brick_board) { var clip = pGame.timeline.brick_board[cl];
由于for...in的循环,我们能够一个跟一个地检测包含在pGame.timeline.brick_board里所有的电影剪辑并将名字附给c1,为了使代码更加容易理解和容易修改,我定义了一个名为clip的容器(我们可以理解为一个在主时间轴上调用砖块的绝对路径),这是一个很重要的方法,所以你一定要明白它做的作用。 if (clip.hitTest(this.x, this.y, true)) {
这是我们第一次在游戏中运用hitTest()这个方法,要注意我们这里是用了检测点碰撞的方法,这样就是假设球为一个点,那么就没有了宽度,但这当然是不现实的,那么就意味着我们的游戏不是100%的准确了。 但很幸运地说,这个游戏没必要100%的准确,只要充分的准确就可以了,如果球很大的话,那么最好是用电影剪辑和电影剪辑的碰撞来检测碰撞(myMovieClip.hitTest(target))。 OK,现在我们知道球碰撞了砖块了,然后我们要找出球和砖块的哪个面发生了碰撞。 (注:这里的砖块的注册点是在左上角) 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();//删去砖块 }
bounce变量将告诉我们是否我们已经碰撞了,显然地,当球碰撞了砖块,砖块的"life"变量将会减少,但减为0的时候,砖块将会被删除。
出处:蓝色理想
责任编辑:qhwa
上一页 基于 as1.0 的挡板游戏 [5] 下一页 基于 as1.0 的挡板游戏 [7]
◎进入论坛Flash专栏版块参加讨论
|