PDA

Просмотр полной версии : Как узнать количество элементов с alpha =1


grafillo!
29.08.2014, 17:52
Есть спрайт PrivatePeopleSprite в него добавляются мувиклипы msg, некоторые из них становятся alpha=0 - невидимыми, как подсчитать количество видимых msg? Возможно ли это?

var msg:msg = new msg;
PrivatePeopleSprite:Sprite;
PrivatePeopleSprite.addChild(msg);

Gerbert
29.08.2014, 18:17
Рекурсивно обойти всех чилдов DOC PrivatePeopleSprite и проверить их альфу.

MikroAcse
29.08.2014, 18:57
var transparentMsgs:Array = [];
for(var i:int = 0; i < PrivatePeopleSprite.numChildren; i++) {
var child:DisplayObject = PrivatePeopleSprite.getChildAt(i);
if(child is msg && child.alpha == 0) {
transparentMsgs.push(child);
}
}

Результат: transparentMsgs

GBee
29.08.2014, 19:30
MikroAcse количество видимых, а у вас массив в результате.
numChildren постоянно теребить не очень хорошо, по крайней мере раньше было.

caseyryan
29.08.2014, 19:45
var a:int = PrivatePeopleSprite.numChildren;
var numTransparent:int = 0;
for (var i:int = 0; i < a; i++) {
if (PrivatePeopleSprite.getChildAt(i).alpha == 0) numTransparent++;
}
trace(numTransparent);

Gerbert
29.08.2014, 20:59
Так ещё короче:)
var length:int = 5
var count:int;

while(length-- > 0)
if(PrivatePeopleSprite.getChildAt(length).alpha == 0)
count++;

caseyryan
29.08.2014, 22:49
тогда уж
var length:int = PrivatePeopleSprite.numChildren;
а в цикле вообще можно
while(length--)

п.с. плохая практика писать без фигурных скобок. Так можно в один момент добавить туда код, который, казалось бы, должен выполняться, а он не будет. Можно ни один час голову поломать над поиском причин, особенно в большом проекте

Gerbert
29.08.2014, 23:38
тогда уж
Точно!) Это я проверил в итерации свойство length и забыл вернуть numChildren.
п.с. плохая практика писать без фигурных скобок. Так можно в один момент добавить туда код, который, казалось бы, должен выполняться, а он не будет.
Это надо быть вообще невменяемым, чтобы видя такой код, добавить в него что-то так, что бы он не работал и ещё после этого несколько часов искать проблему :)
Лично я против скобок!

in4core
30.08.2014, 04:27
Всем спать! Хорош бредни разводить все должно быть так, иначе это не учение :

var msg:Msg = new Msg();
opa_ept: privatePeopleCLASSSUKA= new privatePeopleCLASSSUKA();
opa_ept.addChild(msg);
trace( opa_ept.alphaChildren )

caseyryan
30.08.2014, 11:47
Лично я против скобок!
Ну это пока. Не всё можно писать без скобок. А когда в коде в одних местах есть скобки, в других нет, это смотрится как бардак. Компилятор все равно скобки добавит

MikroAcse
30.08.2014, 12:49
Блин, ребят. Я перепутал. Там нужно alpha == 1.

MikroAcse количество видимых, а у вас массив в результате.
Действительно. Но думаю суть понятна.

numChildren постоянно теребить не очень хорошо, по крайней мере раньше было.
Это новичёк. Ему еще рано знать об оптимизации.

Все остальные вообще только усложнили задачу.

Лично я против скобок!
Мне жаль того, кто читает твой код.

Gerbert
30.08.2014, 13:33
Это новичёк. Ему еще рано знать об оптимизации.
Для Вас это была трудно усвояемая информация чтоль?)

Мне жаль того, кто читает твой код.
Мне жаль устаревших людей, которые так думают.

nubideus
30.08.2014, 14:56
Компилятор все равно скобки добавитв байткоде скобок нет

Так можно в один момент добавить туда код, который, казалось бы, должен выполняться, а он не будетне аргумент. слабоумие в программировании как бы вообще не приветствуется

Все остальные вообще только усложнили задачу.Мне жаль того, кто читает твой код.ты так говоришь, будто бы идеальный код написал
var transparentMsgs:Array = [];
for(var i:int = 0; i < PrivatePeopleSprite.numChildren; i++) {
var child:DisplayObject = PrivatePeopleSprite.getChildAt(i);
if(child is msg && child.alpha == 0) {
transparentMsgs.push(child);
}
}
> var transparentMsgs:Array = []; - array вместо vector
> child is msg && - зачем
> transparentMsgs.push(child); - почему вообще коллекция
если в задаче поставлена задача найти количество видимых элементов, а не их самих.

Gerbert, если говорить о размерах
var length:int = PrivatePeopleSprite.numChildren;
var count:int = 0;

while(PrivatePeopleSprite.getChildAt(--length).alpha > 0 && count++, length);

caseyryan привел единственный возможный правильный пример, еще бы только вместо a len и вместо == >

Gerbert
30.08.2014, 15:19
Gerbert, если говорить о размерах
Круть!

КорДум
30.08.2014, 15:26
Вы туалетную бумагу экономите, я не пойму? ИМО раздуваете холивары на ровном месте.

СлаваRa
31.08.2014, 00:44
в байткоде скобок нет

не аргумент. слабоумие в программировании как бы вообще не приветствуется

ты так говоришь, будто бы идеальный код написал

> var transparentMsgs:Array = []; - array вместо vector
> child is msg && - зачем
> transparentMsgs.push(child); - почему вообще коллекция
если в задаче поставлена задача найти количество видимых элементов, а не их самих.

Gerbert, если говорить о размерах
var length:int = PrivatePeopleSprite.numChildren;
var count:int = 0;

while(PrivatePeopleSprite.getChildAt(--length).alpha > 0 && count++, length);

caseyryan привел единственный возможный правильный пример, еще бы только вместо a len и вместо == >

На однострочный while ругаться будет, как минимум, компилятор. На любой нормальной работе, на первый раз, вас попросят написать такое нормально, раз на 3й уволят...

UPD1:
ну а еще этот код неправильный, т.к. он, на первом же витке, упадет с 2006 ошибкой, для пустого контейнера.

GBee
31.08.2014, 12:19
UPD1:
ну а еще этот код неправильный, т.к. он, на первом же витке, упадет с 2006 ошибкой, для пустого контейнера.

, length);
Точно упадет?

ИМО раздуваете холивары на ровном месте.
Новые люди -старые холивары. С нетерпением жду МВЦ от Gerbertа :о)

array вместо vector
Вот чего вы этот вектор так любите, неудобный просто жуть.

Добавлено через 5 минут
Мне жаль устаревших людей, которые так думают.
Я из устаревших, всегда оборачиваю подобное от греха подальше. И глазу есть за что зацепиться, а не раскладывать ветку. И никаких египетских обычаев :оР

mikhailk
31.08.2014, 12:33
Я по жизни постоянно наблюдаю программистов, которые уже через месяц-другой смотрят на собственный код, мягко говоря, с недоумением в духе "а что у меня тут делается?" или "а зачем я это сделал так?". А когда на это накладывается копипастинг одних и тех же фрагментов непонятно чего делающего кода по разным приложениям, базирующимся на якобы одном энжине, наступает полный ахтунг.

На мой взгляд, простые задачи нужно решать, во-первых, более просто (если не сказать, тупо), а во-вторых, более универсально.

Например, я бы сделал так (но ни в коем случае не настаиваю):

1) В классе Utils разместил бы функцию подсчета детей вообще по некоторому общему критерию с проверками на пустоту и существование:


public static function getChildCountByCriteria( container : DisplayObjectContainer, criteriaFunction : Function ) : uint
{
if ( !container || criteriaFunction == null ) return 0;

var childCountTotal : uint = container.numChildren;
if ( childCountTotal == 0 ) return 0;

var childCountByCriteria : uint = 0;
for ( var i : uint = 0; i < childCountTotal; i++ )
{
if ( criteriaFunction( container.getChildAt( i ) ) ) childCountByCriteria++;
}
return childCountByCriteria;

}



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


var visibleChildCount : uint = Utils.getChildCountByCriteria(
PrivatePeopleSprite,
function ( child : DisplayObject ) : Boolean
{
return child.visible && child.alpha > 0;
}
);


Что касается упаковки кода в две-три строчки - знаю лично одного крупного программиста, который на этом сдвинут, и у него каждый деплой как сталинградская битва.

Ну и 'PrivatePeopleSprite' я оставил в варианте автора, но так, конечно, нельзя писать.

Gerbert
31.08.2014, 13:02
Новые люди -старые холивары. С нетерпением жду МВЦ от Gerbertа :о)
Ждете, что я буду спрашивать? Могу только Вас научить.

nubideus
31.08.2014, 14:14
если человек не знает, что он пишет, значит он аутист.

var length:int = PrivatePeopleSprite.numChildren;
var count:int = 0;

while(length-- && (PrivatePeopleSprite.getChildAt(length).alpha > 0 && count++, 1));
while(length--) PrivatePeopleSprite.getChildAt(length).alpha > 0 && count++;

На однострочный while ругаться будет, как минимум, компиляторfd, полет нормальный:
var i:uint = 10;
while (i-- && (1), i > 0);
без строгого режима можно
while(length--) count += PrivatePeopleSprite.getChildAt(length).alpha > 0;

уволят...щито поделать

простые задачи нужно решать, во-первых, более просто (если не сказать, тупо), а во-вторых, более универсально.раз уж забивать болт на производительность, то писать надо так:
public static function getChildren(container:DisplayObjectContainer):Vector.<DisplayObject> {
if(!container) return null; // ха-ха
var result:Vector.<DisplayObject> = new Vector.<DisplayObject>(container.numChildren, true);
for (var i:uint = 0; i < result.length; i++ ){
result[i] = container.getChildAt(i);
}
return result;
}
getChildren(PrivatePeopleSprite).filter(function(el:DisplayObject):Boolean{return el.alpha > 0;}).lengthвернуть массив универсальнее, чем десяток методов работы с getChildAt

mikhailk
31.08.2014, 15:32
то писать надо так:

К производительности прямого отношения все это не имеет. Пока там не тысячи чайлдов. Не в этом узкое место флеша.

Кстати, при попытке вызвать 'getChildren(PrivatePeopleSprite).filter(' от пустого спрайта будет эксепшн, так что либо в try/catch оборачивайте, либо обрабатывайте по-человечески.


вернуть массив универсальнее, чем десяток методов работы с getChildAt

Можно и массив возвращать. Только дело ведь не столько в том, чтобы сегодня написать какую-нибудь хрень и обеспечить, чтобы она худо бедно работала. Надо потом, открыв код, самому понять, что именно делает этот кусок кода. А в идеале - и чтобы если коллега откроет твой код, у него тоже не возникло вопросов.

Но, тут каждый сам себе злобный буратино. Говорю же, никогда не настаиваю на том, как надо писать.

nubideus
31.08.2014, 16:23
Кстати, при попытке вызвать 'getChildren(PrivatePeopleSprite).filter(' от пустого спрайта будет эксепшношибка будет только тогда, когда аргументом будет передано null. ну и два параметра там не дописано

либо обрабатывайте по-человеческиа ты научи

GBee
31.08.2014, 23:19
Ждете, что я буду спрашивать? Могу только Вас научить.
Как раз ожидаю, что начнете учить. Спрашивает не так много, а советчиков тут пруд пруди. :p