Удалите случайно сгенерированные спрайты с помощью Mouse.Event
Я делаю игру для своего класса, в которой различные химические элементы генерируются в виде спрайтов в верхней части экрана, а затем падают вниз. Различные типы сделаны, и я хочу, чтобы студенты указывали на конкретные типы в зависимости от того, где они находятся в игре. У меня вопрос, как написать функцию, чтобы удалить их, когда они правильно выбраны? Я пробовал много разных способов, но у меня много проблем. Ниже приведен пример кода, который я написал для создания каждого элемента, а затем у меня есть отдельная функция для перемещения всех созданных спрайтов.
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 ответа
В какой момент вы боретесь?
Я предполагаю, что это в определении типов галогенов. В вашей функции удаления, я предполагаю, что у вас уже есть нужный тип, вы бы сравнили его с element.getChildAt(0).text, и вы бы получили элемент либо зацикливаясь на каждом элементе в spriteArray, либо используя цель mouseEvent
Я предлагаю использовать галогеновый класс для хранения графического и текстового полей, а также вектор для хранения объектов. Тогда будет проще получить тип, чем искать анонимных потомков спрайта.
Я считаю, что вы ищете что-то вроде этого:
//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 (rndnum < 0.05)
:
var elementSprite:ElementSprite = new ElementSprite( "A" );
//elementSprite.x = set your x;
//elementSprite.y = set your y;
addChild(elementSprite);
Это заменит весь ваш текущий код в операторе if. Это все рабочий пример, если у вас есть вопросы, не стесняйтесь комментировать.