射击类游戏的开发过程(Flash)(四)

      Flash 2005-12-14 10:50
4、利用hittest进行碰撞监测:


碰撞监测主要应用到两个方面,一是敌机与子弹的碰撞,二是飞机与敌机的碰撞(晕!)所以需要做一些
碰撞的动画出来,显示飞机的坠毁。我方飞机被击中以后,显示GameOver的画面。这里必须要说明的是
谁碰撞谁的问题,因为对子弹的飞出界的处理是删除。对敌机飞出界的处理是重新设置位置。敌机的数目
是确定的,但是子弹的数量不确定。所以这里做这样的碰撞判断:

for (var h = 1; h <= numEnemy; h++)
{
if (this.hitTest(_root["enemy"+h]))
{
this.removeMovieClip();
_root["enemy"+h].play();
}
}

完整的代码是这样:

_root[newname].onEnterFrame = function()
{
var bullet_speed = 10;
this._x += bullet_speed;

if (this._x > 555)
{
this.removeMovieClip();
}

for (var h = 1; h <= numEnemy; h++)
{
if (this.hitTest(_root["enemy"+h]))
{
this.removeMovieClip();
_root["enemy"+h].play();
}
}
}
这就可以监测是否每个敌机都被子弹碰撞到,因为敌机的数量始终保持着3个不变,即使被碰撞到,也不做删除处理,而是对子弹做删除处理。

而是直接播放坠毁动画,播放完之后,回到并停止在第一帧,调用reset()函数。所以,在
敌机坠毁动画的最后一帧这样写:

图片如下:

this.reset();
gotoAndStop(1);

对我方飞机的碰撞判断是这样的:

if (this.hitTest(_root.hero))
{
_root.gotoAndStop(2);
}

完整的代码是:

onClipEvent (load)
{
function reset()
{
this._x = 550;
this._y = math.random() * 300;

enemySpeed = (Math.random() * 6) + 1;
}

reset();
}

onClipEvent (enterFrame)
{
this._x -= enemySpeed;

if (this._x < -10)
{
reset();
}
if (this.hitTest(_root.hero))
{
_root.gotoAndStop(2);
}

}

因为其余的几架敌机都是对它的复制,所以碰撞监测也会对其余几架起作用。
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}