【问题标题】:AS3 hitTestObject to end gameAS3 hitTestObject 结束游戏
【发布时间】:2013-04-22 14:12:50
【问题描述】:

您好,我尝试创建一个类似于太空入侵者的游戏,但发现很难创建一个 hitTestObject,所以如果外星人子弹击中 mc_gun,玩家将失去一条生命,一旦失去三个生命,游戏就结束了被带到一个屏幕,他/她可以在其中输入他们的名字以进入高分表。

我还得做以下,但不知道从哪里开始......

为玩家创造三个生命。 当所有生命都消失时结束游戏。 进入姓名屏幕 高分表。

任何帮助将不胜感激。

这是我在文档正文中的编码...

stop();
var score:Number = 0;
var livesLeft:Number = 3;

var lifesArray:Array = new Array();
lifesArray.push(life1);
lifesArray.push(life2);
lifesArray.push(life3);

addEventListener(Event.ENTER_FRAME, pulse);

function pulse(event:Event):void
{
    checkForHitOnGun();
    checkForHitOnAliens();
    checkForBulletOnBulletHit();
    //checkEndGameCondition 
}

function checkForHitOnGun()
{
    for (var i=0; i<numChildren; i++)
    {
        if (getChildAt(i) is alienbullet)
        {
            var mc_alienbullet:MovieClip = getChildAt(i) as MovieClip;
            for (var j=0; j<numChildren; j++)
            {
                if (getChildAt(j) is gun)
                {
                    var mc_gun:MovieClip = getChildAt(j) as MovieClip;
                    if (mc_alienbullet.hitTestObject(mc_gun))
                    {

                    health -= 10;
                    if (health<1){
                        if(livesLeft<1){
                            gotoAndPlay(2);
                            removeChild(mc_gun);
                            stage.removeEventListener(Event.ENTER_FRAME,pulse);


                        }
                        livesLeft--;
                        lifesArray[livesLeft].visible = false;

                        health=100;
                        if (livesLeft == 0){
                            (endGo);
                            gotoAndPlay(2);
                        }
                    }
                    trace("health =" +health);
                    }
                }
            }
        }
    }
}


function checkForHitOnAliens()
{
    for (var i=0; i<numChildren; i++)
    {
        if (getChildAt(i) is bullet)
        {
            var mc_bullet:MovieClip = getChildAt(i) as MovieClip;
            for (var j=0; j<numChildren; j++)
            {
                if (getChildAt(j) is alien)
                {
                    var mc_alien:MovieClip = getChildAt(j) as MovieClip;
                    if (mc_bullet.hitTestObject(mc_alien))
                    {
                        var tobeDestroyed:MovieClip;
                        if (mc_alien.x > mc_bullet.x)
                        {
                            tobeDestroyed = mc_alien;
                        }
                        else
                        {
                            tobeDestroyed = mc_alien;
                        }
                        var bomb_mc:explosion = new explosion();
                        bomb_mc.x = tobeDestroyed.x;
                        bomb_mc.y = tobeDestroyed.y;

                        var addspaceship:alien = new alien();

                        addspaceship.x = 600;
                        addspaceship.y = Math.random()*(stage.stageHeight);

                        tobeDestroyed.destroy();
                        addChild(bomb_mc);
                        addChild(addspaceship);
                        score++;

                        return;
                    }
                }
                tb_score.text = "" + score;
            }
        }
    }
}

function checkForBulletOnBulletHit()
{
    for (var i=0; i<numChildren; i++)
    {
        if (getChildAt(i) is bullet)
        {
            var mc_bullet:MovieClip = getChildAt(i) as MovieClip;
            for (var j=0; j<numChildren; j++)
            {
                if (getChildAt(j) is alienbullet)
                {
                    var mc_alienbullet:MovieClip = getChildAt(j) as MovieClip;
                    if (mc_bullet.hitTestObject(mc_alienbullet))
                    {
                        var tobeDestroyed:MovieClip;
                        if (mc_bullet.x > mc_alienbullet.x)
                        {
                            tobeDestroyed = mc_bullet;
                        }
                        else
                        {
                            tobeDestroyed = mc_alienbullet;

                        }
                        /*score++;
                        tb_score.text = "" + score;*/
                        var bomb_mc:explosion = new explosion();
                        bomb_mc.x = tobeDestroyed.x;
                        bomb_mc.y = tobeDestroyed.y;

                        tobeDestroyed.destroy();
                        addChild(bomb_mc);
                        /*if (mc_bullet.hitTestObject(mc_alienbullet))
                        {
                        score++;
                        mc_bullet.gotoAndPlay(2);
                        }*/
                        score++;

                        return;
                    }
                    tb_score.text = "" + score;
                }
            }
        }
    }
}
//mc_gun would make the bullet fire only if the gun is clicked. 
//the game is to difficult so i changed it to stage. to make the whole stage the fireing area.
stage.addEventListener(MouseEvent.CLICK, fire);

function fire(event:MouseEvent):void
{
    var bulletfire:bullet = new bullet();
    bulletfire.x = mc_gun.x - 20 + mc_gun.width;
    bulletfire.y = mc_gun.y;
    addChild(bulletfire);
}

mc_banner.addEventListener(MouseEvent.CLICK, startGo);

function startGo(event:MouseEvent):void
{
    mc_banner.visible = false;
    mc_instructions.visible = false;
    mc_highscore.visible = false;
    mc_gun.visible = true;
    tb_score.visible = true;
    addEventListener(Event.ENTER_FRAME, pulse);
    var initialspaceship:alien=new alien();

    initialspaceship.x = 600;
    initialspaceship.y=Math.random()*(stage.stageHeight);
    addChild(initialspaceship);

}

function endGo()
{
    mc_gun.visible = false;
    tb_score.visible = false;
    removeEventListener(Event.ENTER_FRAME, pulse);
    mc_banner.visible = true;
    livesLeft--;
    lifesArray[livesLeft].visible = false;
} 

【问题讨论】:

  • 你试过了吗?你在哪里摔倒?什么是对的,什么是错的?请更具体地说明您的问题,因为您的问题很广泛......
  • @NemoStein 如果玩家获得三个生命,我的生命就可以工作,但是当生命全部消失时,我将应用什么编码来结束游戏并清除屏幕的所有元素然后转到显示输入名称以添加到高分表的新屏幕。

标签: actionscript-3 adobe flash-cs5


【解决方案1】:

你的engGo()函数负责减少生命。
这是检查玩家是否永远死亡(0 条生命)并结束游戏的最佳场所。
据我了解阅读您的代码,livesLeft 是您存储玩家生命的地方。
lifesArray[livesLeft].visible = false; 之后添加以下内容:

if (livesLeft <= 0)
{
    defeat();
}

现在您必须从 GamePlay 更改为 HighScore。
如果您在 Flash Pro 中的一帧中工作,您只需移动到具有高分的那一帧

function defeat():void
{
    gotoAndStop("HighScore");
}

否则(您需要在一帧中完成所有操作),您需要清除舞台并在其上添加新内容。

function defeat():void
{
    // First, remove ALL listeners
    removeEventListener(Event.ENTER_FRAME, pulse);
    stage.removeEventListener(MouseEvent.CLICK, fire);

    // Then, we remove everything
    removeChild(...);

    // Finally, you add the new stuff
    addChild(...);
}

如果您使用第二种方法,我建议您将函数解耦并将它们包装在类中,这样您的游戏逻辑将全部集中在一个地方(在一个类中),您的高分屏幕将是在另一个,你可以轻松地交换它们。

【讨论】:

  • 我已经编辑了代码以显示我的生活,但是我认为这是不正确的?你说要在 endGo 中添加生命部分,我该怎么做...?非常感谢您的帮助
  • 你能帮我创造生命吗?我了解功能失败,但无法弄清楚如何创造生命
  • @DP187,“创造生命”是什么意思?
  • 如果你看一下我已经编辑过的代码,所以函数 checkForHitOnGun() 会导致玩家被击中时失去生命。但是我相信我做错了...我将如何给玩家三个生命,一旦生命结束,屏幕转到一个页面,用户可以输入他们的名字,该名字保存到高分表中。我理解你给我的编码。一旦用户失去所有三种生命,它就会运行......我的问题很简单,就是我如何在三种生命中编码,我将把编码放在哪里?谢谢DP
  • 今晚的任何帮助将不胜感激,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多