PDA

Просмотр полной версии : правильный removeChild()?


Xex
07.11.2007, 22:05
Вот еще вопрос возник.

Пытаюсь сделать игру, в ней круочки(movieClip'ы), которые динамически создаются на сцене идут из левого края сцены в правый.

Создаются кружочки по таймеру:
function spawn(event:TimerEvent):void
{
circle = new mcCircle();
addChild(circle);
circle.name = "circle" + n;
n++;
}

Задача человека успевать убивать эти кружочки, пока они не дошли до правого края сцены(кружки стартуют с x=0 и y=random, потом просто идут влево пока их не убьют или они не дойдут до края)

Проверка попал человек в кружок или нет идет по координате Y.То есть, когда скрипт ловит CLICK, он проверяет Y-мышки и если он около Y-кружка, то кружок играет анимацию и изчезает.

Я сделал проверку и проигрыш анимации. Осталось только убрать кружок со сцены.

Проблема в том что при event'е CLICK, он проверяет все кружочки вот так:

for(i=0; i<n; i++) {
if((event.stageY > getChildByName("ctu"+i).y-40)&&(event.stageY < getChildByName("ctu"+i).y+20)&&(event.stageX + 20 > getChildByName("ctu" + i).x)) {
(getChildByName("ctu" + i) as MovieClip).play();
}
}

где n - общее кол-во кружочков.
Если просто сделать removeChild(getChildByName("ctu"+i)) то при повторной проверке он выдаст ошибку, т.к. какого-то кружочка уже нет и соответственно child'а с именем например "ctu2" тоже нет.

Единственный выход, это после того как кого-то убили, тут же переназначать все имена этих child'ов, осталось только понять как.

p.s. Может кто-нибудь прокоментировать процесс создания кружочков на сцене? Просто я не очень понимаю структуру классов, если есть какие-то замечания я был бы рад услышать как можно сделать лучше. Спасибо.

7thsky™
08.11.2007, 01:17
Нда, а не легче ли сделать нормально, повесить клик листинер на сами кружочки, и тогда не надо будет так страшно пробегать по всем кружочкам и судорожно искать на кого ж именно нажали, или на крайний случай при создании складывайти созданные кружочки в массив и с ним работайте уж...

123avr.com
08.11.2007, 01:58
Привет. Мой совет - создай класс для мувиклипа-кружочка и в нем пропиши MouseEvent.MOUSE_DOWN или MouseEvent.CLICK.

Сам класс может так выглядеть:

package
{

import flash.display.MovieClip;
import flash.events.MouseEvent;

public class Kruzhocheg extends MovieClip
{
public function Kruzhocheg ()
{//tut kod budet ispolniatsia pri vyhode na scenu (konstruktor)

//funkcija kotoraja vyzyvajetsia pri nazhatiji
this.addEventListener(MouseEvent.CLICK, ubratSharik);

}

private function ubratSharik(event:MouseEvent):void
{
//ubitajem samogo sebia
this.removeChild();
}



}
}


Сохраняем как Kruzhocheg.as и кладем рядом с FLA файлом

Потом в Library нажимаем правой кнопкой на своем мувике -> Linkage-> и в "Class" пишем : Kruzhocheg.as . Далше работаешь с ним так же как и ранше - грузишь на сцену с помощью addChild(). А вот проверку кликнули на нем или нет уже осущствлять вручную не надо ;) Просто кружочег будет сам пропадать когда на нем кликнут . :yahoo:

Это так, в двух словах. :confused:

Ну а если лень все переделывать - то в цикле if своем пропиши проверку
if :


for(i=0; i<n; i++) {

if (getChildByName("ctu"+i)!=null){

if((event.stageY > getChildByName("ctu"+i).y-40)&&(event.stageY < getChildByName("ctu"+i).y+20)&&(event.stageX + 20 > getChildByName("ctu" + i).x)) {
(getChildByName("ctu" + i) as MovieClip).play();
}
}
}




Помоему должно сработать :)

Xex
08.11.2007, 10:15
ругается на this.removeChild();
говорит что ему нужен 1 аргумент.
Я пробывал removeChild(this);
пробовал removeChild(this as DisplayObject);

это все не помогает.

Так как же из класса удалить самого себя?

etc
08.11.2007, 10:39
Прочтите справку к методу removeChild, а не применяйте метод тыка.

DimG
08.11.2007, 11:36
Дело в том, что removeChild(object) удаляет дочерний объект, а чтобы сделать данный объект дочерним, нужно обращаться из его родителя: parent.removeChild(this), при этом желательно делать проверку на существование родителя:parent!=null.
Удачи!

123avr.com
08.11.2007, 14:23
Да да, это я маху дал. Но как бы я теоретически писал, а не конкретно :) именно parent.removeChild(ваш обьект). В вашем случае parent.removeChild(this) :)

librio
08.11.2007, 19:01
Не в тему может...
но удержаться сложно!

Конечно дело каждого как именовать... но смотря на то, как классы называют "Kruzhocheg" без слез нельзя.
Люди, советуя новичку класс с таким именем, мы воспитываем в нем пофигистическое отношение к качеству кода!
Двигаясь дальше, начнутся переменные типа "napravlenie", "skorost" и тому подобное.

Начнете работать над проектом в команде - вас за такое побьют! Пожалуйста, цените качество и красоту кода, а так же нервы других :)

Xex
08.11.2007, 21:06
Большое спасибо всем)

Работает)