Actionscript 3得分计入hitTestObject

时间:2012-12-13 08:32:36

标签: actionscript-3 flash

我一直在使用Flash CS5开发这款简单的汽车游戏。汽车必须避免汽车垂直移动并拿起硬币。我有三种类型的硬币,在拾取时增加1,2和3个分数点。我的问题是,当我用汽车撞上硬币时​​,它会通过汽车并提供更多积分。我也有从舞台上删除它的问题...到目前为止的代码:

var spex:Number = 0;
var spey:Number = 4;
var score:uint;
var cars:Array = new Array  ;
var db:Number = 2;
var db_coins:Number = 1;
var i:Number = 0;
for (i=0; i<=db; i++)
{
    var traffic_mc:MovieClip = new traffic  ;
    cars.push(addChild(traffic_mc));
    cars[i].x = -500 * Math.random();
    cars[i].y = Math.random() * 400;
    trace(cars[i].y);
}

for (i=0; i<=db_coins; i++)
{
    var coin_y:MovieClip = new coin_yellow  ;
    coin_y.x = -500 * Math.random();
    coin_y.y = Math.random() * 400;
    addChild(coin_y);
    var coin_r:MovieClip = new coin_red  ;
    coin_y.x = -500 * Math.random();
    coin_y.y = Math.random() * 400;
    addChild(coin_r);
    var coin_b:MovieClip = new coin_blue  ;
    coin_b.x = -500 * Math.random();
    coin_b.y = Math.random() * 400;
    addChild(coin_b);
}

stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown);
function keydown(k:KeyboardEvent):void
{
    if (k.keyCode == 37)
    {
        spex -=  4;

    }
    if (k.keyCode == 39)
    {
        spex +=  4;
    }
}
stage.addEventListener(Event.ENTER_FRAME, go);
function go(e:Event):void
{
    this.auto.x +=  spex;
    if (this.auto.x < 25)
    {
        this.auto.x = 25;
        spex = 0;
    }
    if (this.auto.x > 286)
{
    this.auto.x = 286;
    spex = 0;
    }
    for (i=0; i<=db; i++)
    {
        if (cars[i].hitTestObject(this.auto))
        {
            trace("GAME OVER");
            stage.removeEventListener(KeyboardEvent.KEY_DOWN, keydown);
            stage.removeEventListener(Event.ENTER_FRAME, go);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, retry);
        }
        cars[i].y +=  spey;
        if (cars[i].y > 600)
        {
            cars[i].y = -50;
            cars[i].x = Math.random() * 251;
        }
    }

    for (i=0; i<=db_coins; i++)
    {
        if (coin_y.hitTestObject(this.auto))
        {
            score +=  1;
            updateScore();
        }
        coin_y.y +=  spey-2;
        if (coin_y.y > 600)
        {
            coin_y.y = -50;
            coin_y.x = Math.random() * 251;
        }
        if (coin_r.hitTestObject(this.auto))
        {
            score +=  2;
            updateScore();
        }
        coin_r.y +=  spey-2;
        if (coin_r.y > 600)
        {
            coin_r.y = -50;
            coin_r.x = Math.random() * 251;
        }
        if (coin_b.hitTestObject(this.auto))
        {
            score +=  3;
            updateScore();
        }
        coin_b.y +=  spey-2;
        if (coin_b.y > 600)
        {
            coin_b.y = -50;
            coin_b.x = Math.random() * 251;
        }
    }
}

stage.addEventListener(KeyboardEvent.KEY_DOWN, retry);
function retry(k:KeyboardEvent):void
{
    if (k.keyCode == 32)
    {
        stage.addEventListener(Event.ENTER_FRAME, go);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown);
        for (i=0; i<=db; i++)
        {
            cars[i].y = -300 * Math.random();
            cars[i].x = Math.random() * 251;
        }

        for (i=0; i<=db_coins; i++)
        {
            coin_y.y = -300 * Math.random();
            coin_y.x = Math.random() * 251;
            coin_r.y = -300 * Math.random();
            coin_r.x = Math.random() * 251;
            coin_b.y = -300 * Math.random();
            coin_b.x = Math.random() * 251;
        }
        spex = 0;
        spey = 4;
        score = 0;
        scorecounter.text = "Score: " + score.toString();
    }
}

//Scorecount

function init():void
{
    score = 0;
    scorecounter.text = "Score: " + score.toString();
}

function updateScore():void
{
    scorecounter.text = "Score: " + score.toString();
}

init();

2 个答案:

答案 0 :(得分:0)

我认为你应该创建一个像hited:Boolean这样的变量并检查首次点击。硬币问题发生导致硬币没有击中一次,它会击中一段时间​​导致你移动它的每一帧并且随着运动它再次击中。因此,您必须检查并制定正确的“if-else”条件。

答案 1 :(得分:0)

有一个比你决定使用的解决方案更好的解决方案。 spex是您用来滚动游戏的变量。当你在汽车上运行hitTestObject时,只需输入spex = 0;这将使比赛停止。

我同意mitim对硬币使用removeChild()而不是仅仅将它们堆积在舞台上。