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 实例设置为不接收鼠标事件本身,因为它会阻止单击事件到达其后面的对象。代码将类似于

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 回答