0

画面の上から虫が降りてくるゲームを作っています。昆虫が並んでいます。ユーザーがそれらを殺すたびに、スコアが上がります..しばらくすると、昆虫はどんどん速くなります。それらが速くなると、クリックしても殺されないものもあります。それらが死ぬには、複数回クリックする必要があります。ワンクリックで殺されたいのですが、速くなるとうまくいきません!

  function makeEnemies():void
   {
var chance:Number = Math.floor(Math.random() * 150);
if (chance <=  + level)
{


    //Make sure a Library item linkage is set to Enemy...
    tempEnemy = new Enemy();
    //Math.random(); gets a random number from 0.0-1.0
    tempEnemy.x = Math.round(Math.random() * 1000);
    addChild(tempEnemy);
    enemies.push(tempEnemy);
    tempEnemy.speed = enemyBaseSpeed + ((level - 1) * speedLevelInc);
}
}


function moveEnemies():void
{
var tempEnemy:MovieClip;


for (var i:int =enemies.length-1; i>=0; i--)
{
     tempEnemy=enemies[i];
if (tempEnemy.dead) 
{
    score++;
    score++;
    roachLevel.score_txt.text = String(score);
    enemies.splice(i,1);
} 



     else // Enemy is still alive and moving across the screen
    {
        //rotate the enemy between 10-5 degrees
        tempEnemy.rotation += (Math.round(Math.random()*.4));
        //Find the rotation and move the x position that direction
        tempEnemy.x -=  (Math.sin((Math.PI/180)*tempEnemy.rotation))*tempEnemy.speed;
        tempEnemy.y +=  (Math.cos((Math.PI/180)*tempEnemy.rotation))*tempEnemy.speed;
        if (tempEnemy.x < 10)
        {
            tempEnemy.x = 11;
        }
        if (tempEnemy.x > stage.stageWidth - offset)
        {
             tempEnemy.x = stage.stageWidth - offset;
        }
        if (tempEnemy.y > stage.stageHeight)
        {
            removeEnemy(i);

            lives--;
            roachLevel.lives_txt.text = String(lives);
        }
    }
}
}

function removeEnemy(id:int)
{

removeChild(enemies[id]);
enemies.splice(id,1);
}

昆虫の内部にもコードがあります。

import flash.events.MouseEvent;
import flash.display.MovieClip;
import fl.motion.Animator;
import flash.events.*;
play();
var MainTimeLine = MovieClip(root);
var mysound:squish = new squish(); 
this.addEventListener(MouseEvent.CLICK, kill);
this.dead = false;

function kill(e:MouseEvent):void 
{
this.dead=true;
mouseChildren=false
mysound.play();
gotoAndPlay(21);
this.removeEventListener(MouseEvent.CLICK, kill);
flash.utils.setTimeout(removeSelf,2000);

}

function removeSelf():void
{
this.parent.removeChild(this);
}
4

3 に答える 3

0

反復中に配列からエネルギーを削除しないでください。
あなたは敵を作ります.splice(i,1); 配列のサイズを変更している間、ループ条件を調整しません。

于 2013-11-09T18:43:33.340 に答える
0

あなたの問題は、メモリ リークを引き起こしている setTimeOut() です。タイマーを使用する方がはるかに安全ですが、使用する必要がある場合は、呼び出しへの参照を保持し、不要になったらクリアしてください。

また、投稿したコードは、リスナーを MainTimeline または親に追加している場所を示していませんが、昆虫がガベージ コレクションされる前にそれを削除する必要がある場合。

于 2013-11-09T21:18:16.140 に答える
0

あなたの主な問題は、昆虫を再利用していること、おそらくそれらをプールしていることだと思います。これを行う場合は、リサイクル時に再度クリック用の eventListener を追加していることを確認する必要があります。

コンストラクターにリスナーを追加している場合、それは昆虫が作成されたときにのみ実行され、リサイクルされたときでは実行されません。

于 2013-11-09T19:16:40.813 に答える