AS3索引数组对象属性

时间:2014-01-09 21:37:07

标签: actionscript-3

我正在尝试完成Space Invaders游戏的背景。我想在随机位置生成星星,将它们滚动到舞台的底部,然后在每个星星消失后添加新星。我猜问题就在于indexOf方法,我试图用它来寻找明星的价值。 我知道这可能是一个愚蠢的错误,我是初学者:)

我目前的主要班级:

public class Main extends Sprite
{
    private var ship:Ship = new Ship();
    private var numStars:int = 80;
    private var starArray:Array = new Array();

    public function Main():void
    {
        stage.addChild(ship);
        ship.x = stage.stageWidth / 2 - ship.width / 2;
        ship.y = stage.stageHeight / 2 - ship.height / 2;
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        for (var i:int = 0; i < numStars; i++)
        {
            createStar();
        }
    }
    public function createStar():void
    {
        var newStar:Star = new Star();
            starArray.push(newStar);
            stage.addChildAt(newStar,1);
            newStar.x = Math.random() * stage.stageWidth;
            newStar.y = Math.random() * stage.stageHeight;
            newStar.alpha = Math.random();
            newStar.rotation = Math.random()*360;
            newStar.scaleX = Math.random();
            newStar.scaleY = Math.random();
    }

    public function keyDownHandler(e:KeyboardEvent):void
    {
        if (e.keyCode == Keyboard.UP)
        {
            ship.accelerationY = -0.3;
        }
        if (e.keyCode == Keyboard.DOWN)
        {
            ship.accelerationY = 0.3;
        }
        if (e.keyCode == Keyboard.LEFT)
        {
            ship.accelerationX = -0.3;
        }
        if (e.keyCode == Keyboard.RIGHT)
        {
            ship.accelerationX = 0.3;
        }
    }

    public function keyUpHandler(e:KeyboardEvent):void
    {
        if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
        {
            ship.accelerationX = 0;
            ship.accelerationY = 0;
        }
        if (e.keyCode == Keyboard.LEFT || e.keyCode == Keyboard.RIGHT)
        {
            ship.accelerationY = 0;
            ship.accelerationX = 0;
        }
    }

    public function enterFrameHandler(e:Event):void
    {
        //acceleration
        ship.vx += ship.accelerationX;
        ship.vy += ship.accelerationY;
        //friction
        ship.vx *= ship.friction;
        ship.vy *= ship.friction;
        if (Math.abs(ship.vx) < 0.1)
        {
            ship.vx = 0;
        }
        if (Math.abs(ship.vy) < 0.1)
        {
            ship.vy = 0;
        }

        ship.rotation = ship.vx * 2;
        //set speed limit
        if (ship.vx > ship.speedLimit)
        {
            ship.vx = ship.speedLimit;
        }
        if (ship.vx < -ship.speedLimit)
        {
            ship.vx = -ship.speedLimit;
        }
        if (ship.vy > ship.speedLimit)
        {
            ship.vy = ship.speedLimit;
        }
        if (ship.vy < -ship.speedLimit)
        {
            ship.vy = -ship.speedLimit;
        }
        //set stage boundaries
        if (ship.x < 0)
        {
            ship.x = 0;
        }
        if (ship.y < 0)
        {
            ship.y = 0;
        }
        if (ship.x + ship.width > stage.stageWidth)
        {
            ship.x = stage.stageWidth - ship.width;
        }
        if (ship.y + ship.height > stage.stageHeight)
        {
            ship.y = stage.stageHeight - ship.height;
        }
        ship.x += ship.vx;
        ship.y += ship.vy;

        //star enter frame code
        for (var i:int = 0; i < numStars; i++)
        {
            starArray[i].y += 0.5 + Math.random() * 2;
        }
        if (starArray.indexOf(starArray.y) > stage.stageHeight) //if y property of any star is higher than stage height, create a new star
        {
            createStar();
        }
    }       

}

2 个答案:

答案 0 :(得分:0)

我建议查看像TweenLite这样基于时间的动画的补间实用程序:(http://www.greensock.com/tweenlite/

还建议查看对象池,重用对象而不是创建新对象。作为一名新程序员学习的好事。

你的问题在哪里是正确的

通过以下更改,我的程序正常运行:

---------change these lines-------------

//star enter frame code
for (var i:int = 0; i < numStars; i++)
{
    starArray[i].y += 0.5 + Math.random() * 2;
}
if (starArray.indexOf(starArray.y) > stage.stageHeight) //if y property of any star is higher than stage height, create a new star
{
    createStar();
}

---------to this-------------

//star enter frame code
for (var i:int = 0; i < numStars; i++)
{
    var star:Star = starArray[i];
    star.y += 0.5 + Math.random() * 2;
    if (star.y>stage.stageHeight){
        //dont create a new star -- memory leak
        //move the same star to a new random location
        star.y = 0;
    }
}

答案 1 :(得分:0)

为什么不在屏幕外面的顶部更换它呢? 至于indexOf,它只返回传递的对象数组中的索引。在这种情况下,您传递的数组的y值没有该属性 相反,将位置检查代码移动到游戏循环中的for循环中。这样,你已经拥有了一个超出边界的星的索引(你的i变量),如果是,只需重新定位它并节省一些内存!

for (var i:int = 0; i < numStars; i++)
{
    starArray[i].y += 0.5 + Math.random() * 2;
    if(starArray[i].y > stage.stageHeight)
    {
        // Repositions the star between x: 0 to stageWidth, y: -5 to -15
        starArray[i].y = Math.random() * -10 - 5;
        starArray[i].x = Math.random() * stage.stageWidth;
    }
}