PDA

Просмотр полной версии : кастомное изменение размеров дочерних элементов Sprite


KokoZzz
25.01.2013, 16:35
у меня имеется порядка 4 вложенных спрайтов. изменение размеров по средствам width || height происходит у корневого. могу ли я как то предотвратить изменение scaleX && scaleY у дочерних элементов?


stage.scaleMode = StageScaleMode.NO_SCALE;

не помогло

Tails
25.01.2013, 16:38
Конкретно изменение Scale дочерних элементов не меняется. Визуально они деформируются, потому что на них применяется матрица трансформаций корневого спрайта.

KokoZzz
25.01.2013, 16:40
есть ли способ изменить родительский объект, не влияя на дочерние?

strangedk
25.01.2013, 16:50
Думаю, можно наследоваться от Sprite, и переопределить scaleX/scaleY или width/height

Но вообще это плохая практика, полагаю. Если трансформация не должна влиять на детей, тогда это не должны быть дети, пусть будут в отдельном контейнере, и все дела.

KokoZzz
25.01.2013, 17:10
они должны лежать в этом контейнере, но высоту и ширину мне надо задавать самостоятельно.
можете мне подсказать, как переопределить свойство width?


override public function set width(value:Number):void{
//каким образом мне задать ширину компонента, не передавая свойство детям?
super.width = value;
}

strangedk
25.01.2013, 17:12
наоборот, переопределять нужно у детей. без вызова super
но повоторюсь, это ойойой какой костыль

iflamberg
25.01.2013, 17:17
каким образом мне задать ширину компонента, не передавая свойство детям?
Да никак, как вы не поймете. Дело в том, что если у спрайта-родителя вы измените width или scaleX, то у ребенка они не изменятся вообще! Просто родительская матрица искажения будет наложена на весь контейнер. Можно только компенсировать

override public function set width(value:Number):void{
var k:Number = super.width/value;
child.width *= k; //компенсируем ребенку изменение ширины родителя
super.width = value;
}

strangedk
25.01.2013, 17:20
ойойой какой костыль

всё равно печаль :)

KokoZzz
25.01.2013, 17:21
спасибо. буду читать мануалы.

expl
25.01.2013, 18:08
у меня имеется порядка 4 вложенных спрайтов. изменение размеров по средствам width || height происходит у корневого. могу ли я как то предотвратить изменение scaleX && scaleY у дочерних элементов?

- у корневого изменяются размеры
- у дочерних не должны
Зачем тогда изменять у корневого? В нём что-то кроме дочерних есть? В нем что-то нарисовано?
Тогда берём это нарисованное, ложим в корневой и меняем размеры нарисованного, а корневой не трогаем.

Нужно чтобы размеры нарисованного менялись автоматом при изменении width и height корневого?
Тогда просто перегружаем width и height корневого, _не трогая_ нативные width и height корневого:

private var _width:Number = 100;
override public get width():Number { return _width; }
override public set width(value:Number):void {
_width = value;
_spriteWithDrawings.width = value;
}

Tails
25.01.2013, 18:20
Думаю, можно наследоваться от Sprite, и переопределить scaleX/scaleY или width/height

Но вообще это плохая практика, полагаю. Если трансформация не должна влиять на детей, тогда это не должны быть дети, пусть будут в отдельном контейнере, и все дела.

А вот я не согласен. В том, что-бы переопределить width или height нет ничего плохого. Просто объект будет сам себя перерисовывать как надо, а не масштабироваться.
Например простейшая кнопка с закруглёнными краями и текстовым полем внутри.

strangedk
25.01.2013, 21:03
А потом вам вдруг нужно главному контейнеру сделать scaleX = scaleY = 0.5, и тадаааам, перепиши еще десяток классов.

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

KokoZzz
28.01.2013, 18:37
всем спасибо, разбил компоненты на разные слои =)