0

私は現在、Lynda.comでAS3ゲームのチュートリアルを行っていますが、MouseEvent.CLICKと子インデックスの問題に遭遇しています。ゲームは単純なコンパクトカメラであり、プレイヤーは接近しすぎる敵を近づきすぎる前にすべて撃つ必要があります。最初は機能しますが、追加したカスタムカーソルが敵の後ろに表示されます。ただし、インデックスを調整しようとすると(addChildAt関数を使用し、コードのaddChild(cursor)行を敵のコンテナー初期化子の下に移動しました)、クリックすると敵を削除するはずのクリック時の対話は行われません。動作します。

私のドキュメントクラス:

package {
import flash.display.*;
import flash.utils.*;
import flash.events.*;
import flash.ui.*;

public class Game extends MovieClip {
    public var cursor:Cursor;
    public var enemy:Enemy;
    public var numberOfEnemies:uint;
    public var enemyContainer:MovieClip;
    public var enemyTimer:Timer;

    public function Game() {
        addEventListener(Event.ADDED_TO_STAGE, init);
        Mouse.hide();
    }

    public function init(event:Event):void {
        cursor = new Cursor;
        addChild(cursor);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, dragCursor);

        numberOfEnemies = 10;
        enemyTimer = new Timer(1000, numberOfEnemies);
        enemyContainer = new MovieClip();
        addChild(enemyContainer);

        enemyTimer.addEventListener(TimerEvent.TIMER, createEnemies);
        enemyTimer.start();
    }

    public function dragCursor(event:MouseEvent) {
        cursor.x = this.mouseX;
        cursor.y = this.mouseY;
    }

    public function createEnemies(event:TimerEvent):void {
        enemy = new Enemy();
        enemy.x = 25 + Math.random() * (stage.stageWidth - 75);
        enemy.y = 25 + Math.random() * (stage.stageHeight - 75);
        enemyContainer.addChild(enemy);
        enemy.timerStart();
    }
}
}

私の敵のクラス:

package {
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.ui.Mouse;
import flash.events.*;

public class Enemy extends MovieClip {
    public var scaleObj:Number = 0.50;
    public var growTimer:Timer;

    public function Enemy() {
        scaleX = scaleObj;
        scaleY = scaleObj;
        addEventListener(MouseEvent.CLICK, shootEnemy);
    }

    public function timerStart() {
        growTimer = new Timer(50);
        growTimer.addEventListener(TimerEvent.TIMER, objectGrow);
        growTimer.start();
    }

    public function objectGrow(event:TimerEvent):void {
        if(scaleObj <= 1.0) {
            scaleObj += 0.01;
            scaleX = scaleObj;
            scaleY = scaleObj;
        }
        else {
            killEnemy();
        }
    }

    public function killEnemy():void {
        this.parent.removeChild(this);
        growTimer.stop();
    }

    public function shootEnemy(event:MouseEvent):void {
        killEnemy();
    }
}
}

カーソルクラスもありますが、パッケージとクラスの定義者以外にコードはありません。ご不明な点やご意見がございましたら、お気軽にお問い合わせください。

4

2 に答える 2

1

クリックイベントが背後のオブジェクトに到達するのをブロックするため、カーソルインスタンス自体がマウスイベント自体を受け取らないように設定します。コードは次のようになります

cursor = new Cursor;
cursor.mouseEnabled = false;
cursor.mouseChildren = false;
于 2013-01-02T20:00:03.560 に答える
1

Cursor オブジェクトは Enemy オブジェクトの上にあるため、マウス クリックを傍受している可能性があります。

カーソルクラスで設定することにより、カーソルがマウスイベントをインターセプトするのを停止できます。

this.mouseEnabled = false;
this.mouseChildren = false;

また、理想的には、独自のマウス カーソルを手動で作成するのではなく、ネイティブのマウス カーソルを使用する必要があります。例については、この Adob​​e チュートリアルをご覧ください。

于 2013-01-02T20:01:51.100 に答える