Просмотр полной версии : Проблемы с областью видимости (оператор this))
Волгоградец
09.01.2008, 16:55
Привет! Если вас не затруднит, помогите разобраться... Вот простенький код:
function ap (){
i ++;
_root.attachMovie("mc", "mc" + i, _root.getNextHighestDepth(), {_x: Math.random()*550, _y: Math.random()*400});
}
r = setInterval (ap, 3000);
hero.onPress = function (){
this.startDrag ();
this.onEnterFrame = function (){
if (this.hitTest(this["mc"+i])){
delete this.onEnterFrame;
this["mc"+i].removeMovieClip ();
this.stopDrag ();
}
}
}
hero.onRelease = function (){
this.stopDrag ();
}
С использованием this (выделено красным цветом) не работает - это очевидно - потому что происходит вызов не того что надо. Использую eval - все работает. Но вроде eval это устаревший способ. Можно ли как то это исправить???
this у вас -- это hero. А мувик в _root аттачится.
Абсолютный
_root["mc" + i]
Относительный
this._parent["mc" + i]
Правильный
var i:Number = 0;
hero.useHandCursor = false;
var mc:MovieClip;
function ap () {
i++;
mc = _root.attachMovie ("mc", "mc" + i, _root.getNextHighestDepth (), {_x:Math.random () * 550, _y:Math.random () * 400});
}
r = setInterval (ap, 3000);
hero.onPress = function () {
this.startDrag ();
this.onEnterFrame = function () {
if (this.hitTest (mc)) {
delete this.onEnterFrame;
mc.removeMovieClip ();
this.stopDrag ();
}
};
};
hero.onRelease = function () {
this.stopDrag ();
};Но меня смущает тот факт, что в вашем коде идет проверка только для последнего созданного элемента, а не всех. Так задумано?
Жень Шень
09.01.2008, 18:31
Ответ:
hero.onPress = function() {
this.startDrag();
this.onEnterFrame = function() {
if (this.hitTest(this._parent["mc"+i])) {
delete this.onEnterFrame;
this._parent["mc"+i].removeMovieClip();
this.stopDrag();
}
};
};
this - ссылка на родителя, в данном слечае на hero.
this._parent равносильно _root - именно туда аттачатся мувики.
Дописано:
ОПЕРЕДИЛИ более шустрые ребятки :quiet:
Волгоградец
09.01.2008, 18:50
iNils, ты прав, задумано было для всех элементов проверку делать. Это я что-то напутал когда писал код.) Поэтому ход с присваиванием имени мувика переменной m не проходит. Просто я думал, что конструкция this["..."] - это как обособленный оператор что ли, который должен возвращать то, что в квадратных скобках независимо от расположения на временной диаграмме.
Вот, с вашей помощью сделал то, что нужно - на сцену аттачатся клипы и происходит проверка на столкновение с каждым из них; если столкновение было - клип удаляется (может кому пригодится):
var i:Number = 0;
hero.useHandCursor = false;
var array:Array = new Array ();
function ap (){
i ++;
_root.attachMovie("mc", "mc" + i, _root.getNextHighestDepth(), {_x: Math.random()*550, _y: Math.random()*400});
array.push ("mc" + i);
}
r = setInterval (ap, 5000);
ap ();
hero.onPress = function (){
this.startDrag ();
this.onEnterFrame = function (){
for (k in array){
if (this.hitTest(_root[array[k]])){
trace (array[k]);
_root[array[k]].removeMovieClip ();
array.splice(k, 1);
trace (array.length);
trace (array + "\n");
}
}
}
}
Спасибо БОЛЬШОЕ!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.