2

最初の質問。優しくしてください。

ゲーム キャラクターの単純な (私が望んでいた) キーボード制御のムービー クリップを作成しています。ムービークリップには 5 つのフレームがあり、それぞれにプレイヤーが矢印キーを押したとき、上下に歩いたとき、安定したときなどの簡単なアニメーションが含まれています。

メイン アプリケーション クラス ファイルで簡単なプロトタイプを作成したところ、完全に動作しました。currentFrame と totalFrames もトレースしましたが、これも正しいです。キーを押すと正しいフレームが再生され、totalFrames が 5 であると表示されます。

ただし、マルチレベルのゲームを作成したいので、アプリケーション クラスをレベル スイッチャーとして使用し、各レベルとオブジェクトは独自のクラスです。この移行中、ムービークリップは機能しなくなります。ステージに追加され、矢印キーで移動できますが、個々のアニメーションは再生されません。5 つのキーフレームのそれぞれでちらつきます。また、トレースすると、currentFrame が 0 (?) で、totalFrames が 1 (?) と表示されます。

.stop または .gotoAndPlay によっても制御されません。

助けてください!

これは、正常に動作する単一クラスのバージョンです。

package
{
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

[SWF(width="650", height="450",backgroundColor="#FFFFFF", frameRate="60")]

public class CharacterMovieclip extends MovieClip
{
    //Create and initialize the vx and vy variables
    public var vx:int = 0;
    public var vy:int = 0;                  


    [Embed(source="../swfs/characterRes.swf", symbol="Character")]
    public var Character:Class;
    public var character:MovieClip = new Character();


    public function CharacterMovieclip()
    {

        //Add Character
        stage.addChild(character);
        character.x = 200;
        character.y = 100;
        character.gotoAndStop(1);

        //Add the event listeners
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);     
        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    }
    public function keyDownHandler(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT)
        {
            vx = -5;
            character.gotoAndStop(4);
        }
        else if (event.keyCode == Keyboard.RIGHT)
        {
            vx = 5;
            character.gotoAndStop(5);
        }
        else if (event.keyCode == Keyboard.UP)
        {
            vy = -5;
            character.gotoAndStop(2);
        }
        else if (event.keyCode == Keyboard.DOWN)
        {
            vy = 5;
            character.gotoAndStop(3);
        }
    }
    public function keyUpHandler(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT 
            || event.keyCode == Keyboard.RIGHT)
        {
            vx = 0;
            character.gotoAndStop(1);
        } 
        else if (event.keyCode == Keyboard.DOWN 
            || event.keyCode == Keyboard.UP)
        {
            vy = 0;
            character.gotoAndStop(1);
        } 
    }
    public function enterFrameHandler(event:Event):void
    {   
        //Move the player 
        character.x += vx 
        character.y += vy;
        trace(character.currentFrame);
        trace(character.totalFrames);
        trace(character.x);

    }   

 }
}

しかし、いくつかのクラスで試してみると、それはすべて地獄になります。キャラクタークラスはこちら。

package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;

public class Character extends MovieClip
{
    [Embed(source="../swfs/characterRes.swf", symbol="Character")]
    private var CharacterImage:Class;

    //Private properties
    private var _characterImage:DisplayObject = new CharacterImage();
    private var _character:MovieClip = new MovieClip();

    //Public properties
    public var vx:int = 0;
    public var vy:int = 0;

    public function Character()
    {
        _character.addChild(_characterImage);
        this.addChild(_character);  
    }
 }
}

次に、キャラクター オブジェクトが LevelOne クラスに追加されます。

package
{
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

public class LevelOne extends Sprite
{
    //Declare the variables to hold
    //the game objects
    private var _character:Character;
    private var _background:Background;

    //A variable to store the reference
    //to the stage from the application class
    private var _stage:Object;

    public function LevelOne(stage:Object)
    {
        _stage = stage; 
        this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
    }
    private function addedToStageHandler(event:Event):void
    {
        startGame();
        this.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
    }
    private function startGame():void
    {
        //Create Game Objects
        _character = new Character();
        _background = new Background();

        //Add them to stage
        this.addChild(_background);
        _background.x = 0;
        _background.y = 0;

        this.addChild(_character);
        _character.x = 300;
        _character.y = 50;
        _character.gotoAndStop(1);


        //Event listeners
        _stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
        _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); 
        this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    }
    private function enterFrameHandler(event:Event):void
    {   
        //Move the game character and check its stage boundaries
        _character.x += _character.vx; 
        _character.y += _character.vy;
        checkStageBoundaries(_character);

                    trace(_character.currentFrame);
        trace(_character.totalFrames);
        trace(_character.x);
    }
    private function checkStageBoundaries(gameObject:MovieClip):void
    {
        if (gameObject.x < 50)
        {
            gameObject.x = 50;
        }
        if (gameObject.y < 50)
        {
            gameObject.y = 50;
        }
        if (gameObject.x + gameObject.width > _stage.stageWidth - 50)
        {
            gameObject.x = _stage.stageWidth - gameObject.width - 50;
        }
        if (gameObject.y + gameObject.height > _stage.stageHeight - 50)
        {
            gameObject.y = _stage.stageHeight - gameObject.height - 50;
        }
    }
    private function keyDownHandler(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT)
        {
            _character.vx = -5;
            _character.gotoAndStop(4);
        }
        else if (event.keyCode == Keyboard.RIGHT)
        {
            _character.vx = 5;
            _character.gotoAndStop(5);
        }
        else if (event.keyCode == Keyboard.UP)
        {
            _character.vy = -5;
            _character.gotoAndStop(2);

        }
        else if (event.keyCode == Keyboard.DOWN)
        {
            _character.vy = 5;
            _character.gotoAndStop(3);
        }
    }
    private function keyUpHandler(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT 
            || event.keyCode == Keyboard.RIGHT)
        {
            _character.vx = 0;
            _character.gotoAndStop(1);
        } 
        else if (event.keyCode == Keyboard.DOWN 
            || event.keyCode == Keyboard.UP)
        {
            _character.vy = 0;
            _character.gotoAndStop(1);
        }
    }

}
}

そして、Main アプリケーション クラスによって levelOne がステージに追加されます。

package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.MovieClip;

[SWF(width="650", height="450", 
backgroundColor="#FFFFFF", frameRate="60")]

public class Main extends Sprite
{
    private var _levelOne:LevelOne;

    public function Main()
    {
    _levelOne = new LevelOne(stage);
        stage.addChild(_levelOne);  
    }

}
}

このすべてのどこかで、私の MovieClip が個々のアニメーションの再生を停止します。ステージ上では、矢印キーで移動できますが、キーフレーム アニメーションは再生されません。(そして、トレースはその再生フレームを 0 と考えているようで、フレームも 1 つしかありません。)

どんな助けでも大歓迎です。頭が痛い。

4

1 に答える 1