簡體   English   中英

AS3 indexof數組對象屬性

[英]AS3 indexof array object property

我正在嘗試完成《太空侵略者》游戲的背景知識。 我想在任意位置生成星星,將它們滾動到舞台底部,然后在每顆星星消失后添加新星星。 我猜想問題出在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();
        }
    }       

}

我建議研究諸如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;
    }
}

為什么不僅僅在屏幕頂部替換它,而不是僅僅創建一個新的星星?
至於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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM