0

以下は、通りに市民を生成するクラスです。彼らは左右に歩き、どちら側を向くか、移動速度、y 位置が割り当てられます。以前はコンストラクター内で関数 setUpCitizens() を使用していましたが、レベルとリスナーの削除に問題があるため、ADDED_TO_STAGE と REMOVED_FROM_STAGE を使用したいと考えていました。

package 
{
import flash.display.*;
import flash.events.*;
import flash.utils.getTimer;
import flash.utils.Timer;

public class Citizen extends MovieClip
{
    private var dx:Number;// speed and direction
    private var lastTime:int;// animation time

    public function Citizen(side:String, _speed:Number, yPos:Number)
    {   
        var side = side;
        var speed = _speed;
        var yPos = yPos;

        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(event:Event):void
    {
        setUpCitizens();
        addEventListener(Event.REMOVED_FROM_STAGE,    onRemovedFromStage);
    }

    private function onRemovedFromStage(event:Event):void
    {
        removeAllCitizens();
        this.removeEventListener(Event.ENTER_FRAME,moveCitizen);
    }

    private function setUpCitizens():void
    {
        if (side == "left")
        {
            this.x = -40;// start to the left
            dx = _speed;// walk left to right
            this.scaleX = 1;// reverse
        }
        else if (side == "right")
        {
            this.x = 5720;// start to the right
            dx =  -  _speed;// walk right to left
            this.scaleX = -1;
        }// not reverse

        this.y = yPos;// vertical position
        this.gotoAndStop(Math.floor(Math.random()*9+1));
        // set up animation;
        this.addEventListener(Event.ENTER_FRAME,moveCitizen);
        lastTime = getTimer();
    }

    private function removeAllCitizens():void
    {
        removeEventListener(Event.ENTER_FRAME,moveCitizen);
        parent.removeChild(this);
    }

このエラーが発生しています:
エラー

私はこのようにクラスを呼び出します:

var c:Citizen = new Citizen(side,speed,yPos);

これは、親クラス オブジェクト Level1 から呼び出されます。また、生成されたすべての子を参照し、それらをすべて削除してゲームを高速化しようとしても問題があります...

ご提案ありがとうございます。

4

1 に答える 1

2

メソッド内で変数を作成すると、それらはそのメソッド内にのみ存在します。Citizen コンストラクターは var speed、var size、および var yPos を作成しますが、そのメソッドが終了するとすぐに、これらの変数は失われます。それらをクラス プロパティ (dx や lastTime など) に格納する必要があります。citizenSpeed:Number のようなものをクラス プロパティに追加し、Citizen コンストラクターで、渡されたパラメーターをその変数に割り当てます。つまり、

public class Citizen extends MovieClip
{
    private var dx:Number;// speed and direction
    private var lastTime:int;// animation time
    //added lines
    private var citizenSpeed:Number;
    private var citizenSide:String;
    private var citizenYPos:Number;

    public function Citizen(_side:String, _speed:Number, _yPos:Number)
    {   
        citizenSide = _side;
        citizenSpeed = _speed;
        citizenYPos = _yPos;

        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

...

そして、setUpCitizens() で、それらのメンバー変数 (citizenSpeed など) を参照するだけです。

あなたが得ているエラーは、 setUpCitizens() に、その時点で範囲外であるため、何も知らない変数を参照しているコードが含まれているためです。

それが役立つことを願っています!

B.

于 2012-12-28T11:07:02.467 に答える