0

このチュートリアルから、カスタムのアニメーション/シューターを作成しようとしています: http://flashadvanced.com/creating-small-shooting-game-as3/

カスタムとは、カスタマイズされた、つまり自分のバージョンのことを意味します。

そのアクション スクリプトには、次の関数を持つタイマー イベント リスナーがあります。

if(starAdded){
removeChild(star);
}

と :

addChild(star);

コードは問題なく動作しますが、シーン 2 でエラーが発生します。

コードはうまく機能し、Google とスタックフローを介して学習しながら、このフラッシュ ファイルにいくつかのコードを追加しました。シーン 2 も追加して、9 秒の映画時間後に呼び出すようにしました。しかし、シーン 2 に移動すると、まだスター オブジェクトが表示され、これらの「スター」オブジェクトをシーン 2 から削除できませんでした。

追加したコードは次のとおりです。

シーン 1:

var my_timer = new Timer(5000,0); //in milliseconds
my_timer.addEventListener(TimerEvent.TIMER, catchTimer);
my_timer.start();


var myInt:int = getTimer() * 0.001;
var startTime:int = getTimer();
var currentTime:int = getTimer();
var timeRunning:int = (currentTime - startTime) * 0.001; // this is how many seconds the game has been running.
demo_txt.text = timeRunning.toString();

function catchTimer(e:TimerEvent)
{
    gotoAndPlay(1, "Scene 2");
}

シーン 2:

addEventListener(Event.ENTER_FRAME,myFunction);
function myFunction(event:Event) {
    timer.stop();
    timer.removeEventListener(TimerEvent.TIMER, timerHandler);
    stage.removeChild(star);
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, cursorMoveHandler);
    my_timer.stop(); // you might need to cast this into Timer object
    my_timer.removeEventListener(TimerEvent.TIMER, catchTimer);
    Mouse.show();
}
stop();

================================================== ===

私はまったく新しい as3 で、StackOverflow でアカウントを作成したばかりです...かなり前から多くのコードを知っていて読んでいますが。

編集された新しい完全なコードは次のとおりです。

//importing tween classes
import fl.transitions.easing.*;
import fl.transitions.Tween;

//hiding the cursor
Mouse.hide();

//creating a new Star instance
var star:Star = new Star();
var game:Game = new Game();
//creating the timer
var timer:Timer = new Timer(1000);
//we create variables for random X and Y positions
var randomX:Number;
var randomY:Number;
var t:int = 0;
//variable for the alpha tween effect
var tween:Tween;
//we check if a star instance is already added to the stage
var starAdded:Boolean = false;
//we count the points
var points:int = 0;

//adding event handler on mouse move
stage.addEventListener(MouseEvent.MOUSE_MOVE, cursorMoveHandler);
//adding event handler to the timer
timer.addEventListener(TimerEvent.TIMER, timerHandler);
//starting the timer
timer.start();
addChild(game);
function cursorMoveHandler(e:Event):void{
    //sight position matches the mouse position
    game.Sight.x = mouseX;
    game.Sight.y = mouseY;
}

function timerHandler(e:TimerEvent):void{
    //first we need to remove the star from the stage if already added
    if(starAdded){
        removeChild(star);
    }

    //positioning the star on a random position
    randomX = Math.random()*500;
    randomY = Math.random()*300;
    star.x = randomX;
    star.y = randomY;
    //adding the star to the stage
    addChild(star);
    //changing our boolean value to true
    starAdded = true;
    //adding a mouse click handler to the star
    star.addEventListener(MouseEvent.CLICK, clickHandler);
    //animating the star's appearance
    tween = new Tween(star, "alpha", Strong.easeOut, 0, 1, 3, true);
t++;
if(t>=5) {
    gotoAndPlay(5);
}
}

function clickHandler(e:Event):void{
    //when we click/shoot a star we increment the points
    points ++;
    //showing the result in the text field
    points_txt.text = points.toString();
}

そしてフレーム 5 で:

//timer.stop();
    //timer.removeEventListener(TimerEvent.TIMER, timerHandler);
    // uncomment lines above if "timer" is something you've made
    stage.removeChild(star);
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, cursorMoveHandler);
    timer.stop(); // you might need to cast this into Timer object
    timer.removeEventListener(TimerEvent.TIMER, timerHandler);
    Mouse.show();
    stop();

現在、この新しい .fla ファイルにはシーン 2 はありません...これが私のフラッシュ ファイルのライブラリ プロパティのスクリーンショットです...: http://i.imgur.com/d2cPyOx.jpg

4

2 に答える 2

0

getChildAtを使用します。


    function catchTimer(e:TimerEvent)
    {
        var childCount:int = this.numChildren - 1;
        var i:int;
        var tempObj:DisplayObject;
        for (i = 0; i < childCount; i++)
        {
        tempObj = this.getChildAt(i);
        this.removeChild(tempObj);
        }
        gotoAndPlay(1, "Scene 2");
    }

これにより、シーン 2 に進む前に、シーン 1 で追加したすべての子が削除されます。

于 2013-05-14T05:31:57.490 に答える
0

シーンを完全に削除することをお勧めします。AS3 ではほとんど廃止されています。代わりにGame、ゲーム内にあるすべてのカーソル、星、およびその他のものを含むオブジェクトを使用し、「スコアボード」がスコアを表示する別のコンテナー クラスであるgotoAndPlay()doを使用する代わりに使用します。removeChild(game); addChild(scoreboard);

コードに関しては、シーンを変更したため、stage実際にstar自分のものを含む有効なハンドルを持つことをやめます。したがって、関数を呼び出す前にこれらすべてを実行gotoAndPlay()してくださいcatchTimer

function catchTimer(e:TimerEvent)
{
    //timer.stop();
    //timer.removeEventListener(TimerEvent.TIMER, timerHandler);
    // uncomment lines above if "timer" is something you've made
    stage.removeChild(star);
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, cursorMoveHandler);
    my_timer.stop(); // you might need to cast this into Timer object
    my_timer.removeEventListener(TimerEvent.TIMER, catchTimer);
    Mouse.show();
    gotoAndPlay(1, "Scene 2");
}

stop()シーン 2 のコードは、何かを追加するまでは単一の- で構成されます。また、そのリスナーを削除するコードがなければ、イベント リスナー、特にフレームに入る必要はありません。シーン 2 にエンター フレーム リスナーを追加し、それを削除することはありませんが、そのコードは 1 回だけ実行する必要があります。

于 2013-05-13T12:03:52.613 に答える