迷宫游戏开发过程(四)

      Flash 2005-12-27 10:27
4、射击

在这个游戏中,射击子弹有两种方式:一是我方控制的射击,一是敌方的自动射击:下面先看我方的射击是如何实现的:
function shoot() {
    attachMovie('bullet', 'bullet'+depth, buldepth);//加载子弹
    buldepth++;//深度
    bullet++;子弹数目限制
    _root['bullet'+depth]._x = boxes.man._x+boxes._x;
    _root['bullet'+depth]._y = boxes.man._y+boxes._y;//子弹位置
    if (motion.length == 0) {
        _root['bullet'+depth].dirx = dirx;
        _root['bullet'+depth].diry = diry;//初始化是的子弹
    } else {
        _root['bullet'+depth].dirx = motion[0][2];
        _root['bullet'+depth].diry = motion[0][3];//子弹的运动的方向
    }
    _root['bullet'+depth].onEnterFrame = function() {
        for (f=0; f<enemies.length; f++) {
            if (this.hitTest(_root.boxes['enemy'+f])) {//如果子弹和敌人碰撞(击中)
                this.removeMovieClip();//删除子弹
                bullet--;//子弹减少
                _root.boxes['enemy'+f].play();//播放被击中动画
            }
        }
        this._x += this.dirx;
        this._y += this.diry;//子弹飞行
        tempo = ((this._x-10)-boxes._x)/20;
        tempk = ((this._y-10)-boxes._y)/20;
        if (boxes['b'+Math.round(tempk)+'_'+Math.round(tempo)]._currentframe == 2) {
            this.removeMovieClip();//如果子弹碰到墙壁,删除子弹
            bullet--;//子弹减少
        } else if (this._x<0 or this._x>boxes._width or this._y<0 or this._y>boxes._height) {
            this.removeMovieClip();//如果子弹飞出界外
            bullet--;
        }
    };
    depth++;
}


如何实现敌方的自动射击:

function checkForEnemy(z) {//参数z是敌方对象
    z.man = z._parent.man;//
    z.manxright = Math.round((z.man._x-(z.man._width/2))/20);
    z.manxleft = Math.round((z.man._x-15)/20);
    z.manybottom = Math.round((z.man._y-15)/20);
    z.manytop = Math.round((z.man._y-(z.man._height/2))/20);//
    for (u=0; u<z.sight.length; u++) {
        if (z.manxleft == z.sight[u][1] or z.manxright == z.sight[u][1]) {
            if (z.manytop == z.sight[u][0] or z.manybottom == z.sight[u][0]) {
                shootEnemy(z, z.sight[u][0], z.sight[u][1]);//在米字射程内就射击
            }
        }
    }
}



function shootEnemy(q, r, s) {//参数r,s是当前“我”所在的位置
    if (!q.shooting) {如果被击中了,就停止射击
        q.shooting = true;
        q.hitman = false;
        boxes.attachMovie('Ebullet', 'Ebullet'+g, 1000+g);//加载敌军子弹mc
        boxes['Ebullet'+g]._x = q._x;
        boxes['Ebullet'+g]._y = q._y;//设置子弹mc的位置
        boxes['Ebullet'+g].difx = s-q.xpos;
        boxes['Ebullet'+g].dify = r-q.ypos;//敌人的位置的数组下标
        boxes['Ebullet'+g].absdifx = Math.abs(s-q.xpos);
        boxes['Ebullet'+g].absdify = Math.abs(r-q.ypos);//
        boxes['Ebullet'+g].bulldirx = (boxes['Ebullet'+g].difx/boxes['Ebullet'+g].absdifx);
        boxes['Ebullet'+g].bulldiry = (boxes['Ebullet'+g].dify/boxes['Ebullet'+g].absdify);//计算x,y的一个运动的比例
        boxes['Ebullet'+g].onEnterFrame = function() {
            this._x += 10*this.bulldirx;
            this._y += 10*this.bulldiry;//子弹飞行
            tempo = (this._x-10)/20;
            tempk = (this._y-10)/20;//转换为数组的下标
            if (boxes['b'+Math.round(tempk)+'_'+Math.round(tempo)]._currentframe == 2) {
                this.removeMovieClip();//如果碰到墙壁
                q.shooting = false;
                // bullet -= 1;
            } else if (this._x<0 or this._x>boxes._width or this._y<0 or this._y>boxes._height) {
                this.removeMovieClip();//如果飞出界外
                q.shooting = false;
                // bullet -= 1;
            }
            if (this.hitTest(q.man)) {//如果击中
                this.removeMovieClip();
                q.shooting = false;
                q.man.health -= 10;//健康值下降
                if (q.man.health>0) {//如果没被消灭
                    q.man._alpha = q.man.health;//透明度下降
                } else {//否则。。。
                    q.man._alpha = q.man.health;
                    health.text = q.man.health;
                    q.man.removeMovieClip();
                    gameOver('lose');
                }
            }
        };
        g++;
    }
}

一般的子弹的发射需要经过这样的几个步骤:
1、事件触发
mc.onKeyDown=function(){
if(Key.getCode==90){
... ....
2、子弹mc加载并指定初始位置(当前的man或者enemy所在的位置)

attachMovie("bullet"...
bullet._x=...
bullet._y=...

3、onEnterFrame事件的运用(修改x,y的值来让子弹的位置改变)

bullet._x+=speed
bullet._y+=speed

4、处理子弹的击中或者出界
if()
击中:
hitTest()
出界是位置的判断

处理的结果是删除子弹和击中的目标
bullet.removeMovieClip();
man.removeMovieClip();

标签集:TAGS:
回复Comments() 点击Count()

回复Comments

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