使用Mouse.Event删除随机生成的精灵

时间:2014-01-28 19:10:19

标签: actionscript-3

我正在为我的班级制作一个游戏,在屏幕顶部生成不同的化学元素作为精灵,然后跌落。制作了不同的类型,我希望学生根据他们在游戏中的位置鼠标悬停在特定类型上。   我的问题是如何正确选择删除它们的功能?我尝试了很多不同的方法,但遇到了很多麻烦。我为了使每个元素编写的代码示例如下,然后我有一个单独的函数来向下移动所有创建的精灵。

var spriteArray:Array = new Array();
var halogenArray:Array = new Array("F", "Cl", "Br", "I");
var rndnum:Number = Math.random();              
//Halogens
if (rndnum < 0.05)
{
var halo:Sprite = new Sprite();  
halo.graphics.beginFill(0x00FF00, 1);
halo.graphics.drawCircle(7.5, 7.5, 15);
halo.graphics.endFill();
halo.addEventListener(MouseEvent.MOUSE_OVER, removeElement);
halo.x = Math.random()*500 + 50;
halo.y = -18;
var textField = new TextField();
textField.text = halogenArray[int(Math.random()*4)];
textField.width = 30; 
textField.height = 30;
textField.x = (15 - textField.textWidth)/2; // center it horizontally
textField.y = (15 - textField.textHeight)/2; // center it vertically
halo.addChild(textField);
spriteArray.push(halo);
addChild(halo);
}

2 个答案:

答案 0 :(得分:0)

我相信你正在寻找这样的东西:

//give your textfields a name, it isn't totally necessary as we can do getChildAt(0)
//but it's more readable, and if you decide to add more children before you
//add the text field, then this will still work

var textField = new TextField();
textField.text = halogenArray[int(Math.random()*4)];
textField.width = 30; 
...
textField.name = "haloTx"; //for tracking later

//assuming you have some variable set to the correct answer
var correctAnswer:String = "F";

function removeElement( e:MouseEvent ):void {
    var element:TextField = ( e.target as Sprite ).getChildByName( "haloTx" );

    //if we have the correct element, remove from parent and list
    if ( element && element.text == correctAnswer ) {
        var index:int = spriteArray.indexOf( e.target as Sprite );
        removeChild( spriteArray.splice( index, 1 )[0] );
    }
}

虽然@VBCPP是对的,但在单独的课程中这样做绝对是组织上最好的方式。这可能看起来像:

class ElementSprite extends Sprite {
    public var textField:TextField;

    //pass shapeArgs as string, so say a circle at x=7.5, y=7.5, and radius=15 -- shapeArgs = "7.5, 7.5, 15"
    public function ElementSprite( element:String, drawShape:String="Circle", shapeArgs:String="7.5, 7.5, 15", fillColor:uint=0x00FF00 ) {
        //set textfield properties etc. or textFormat
        textField = new TextField();
        textField.text = element;
        addChild( textField );

        //if you passed some arguments to draw our shape
        if ( shapeArgs != "" ) {
            graphics.beginFill( fillColor );
            graphics[ "draw" + drawShape ].apply( this, shapeArgs.split( "," ) );
        }
    }

    public function get currentElement():String { return textField.text }
}

然后你会在if语句中使用它if (rndnum < 0.05)

var elementSprite:ElementSprite = new ElementSprite( "A" );
//elementSprite.x = set your x;
//elementSprite.y = set your y;
addChild(elementSprite);

那将替换if语句中的所有当前代码。如果您有任何问题可以随意发表评论,这就是一个有效的例子。

答案 1 :(得分:0)

你在什么时候挣扎?

我假设它是在确定卤素的类型。 在你的删除功能中,我假设你已经找到了所需的类型,然后你将它与之比较     element.getChildAt(0)的.text 你可以通过循环遍历spriteArray中的每个元素,或者使用mouseEvent的目标来获取元素

我的建议是使用卤素类来包含grapics&amp; textfield,以及用于保存对象的向量。然后更容易获得类型,而不是搜索精灵的匿名孩子。