Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   отслеживание изменения размеров спрайта (http://www.flasher.ru/forum/showthread.php?t=199688)

evgen4ik 22.05.2013 16:58

отслеживание изменения размеров спрайта
 
Здравствуйте.
Подскажите пожалуйста, можно ли отслеживать изменение размеров объектов Bitmap и Sprite, и, если да, то как?

ProcXel.A 22.05.2013 17:08

Код AS3:

import flash.display.Sprite;
import flash.events.Event;
 
var s:Sprite = new Sprite();
s.graphics.beginFill( 0 );
s.graphics.drawRect( -100, -100, 200, 200 );
s.x = s.y = 250;
this.addChild( s );
 
s.addEventListener( "RESIZE", SpriteResize );
stage.addEventListener( MouseEvent.CLICK, Click );
 
function SpriteResize( e:Event ):void {
        trace( e.type, s.width );
}
 
function Click( e:MouseEvent ):void {
        s.width = 200 * ( Math.sin( getTimer() / 1000 ) + 1 );
        s.dispatchEvent( new Event( "RESIZE" ) );
}


evgen4ik 23.05.2013 17:58

Только кастомное событие? другого способа отследить изменение размеров экранных объектов нет?

СлаваRa 23.05.2013 18:04

Я бы и пример выше использовать не стал.
Если у вас свои объекты, которые наследуются от DisplayObject, вы можете переопределить акцессоры width\height, или вам придется проверять изменения в ручную.

ProcXel.A 23.05.2013 18:22

Напиши классы наследуемые от битмап и спрайтов и добавь к свойствам ширины и высоты отправку события.
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class MySprite extends Sprite {
 
                public function MySprite() {
                        // constructor code
                }
 
                public override function set width( value:Number ):void {
                        super.width = value;
                        this.dispatchEvent( new Event( "RESIZE" ) );
                }
 
        }
 
}

Код AS3:

import flash.events.MouseEvent;
import flash.events.Event;
 
var s:MySprite = new MySprite();
s.graphics.beginFill( 0x000000 );
s.graphics.drawRect( 0, 0, 200, 200 );
this.addChild( s );
 
s.addEventListener( "RESIZE", Trace );
stage.addEventListener(MouseEvent.CLICK, Click );
 
function Trace( e:Event ):void {
        trace( s.width );
}
 
function Click( e:MouseEvent ):void {
        s.width = Math.random() * 100 + 100;
}

Будет удобно. Вот так раз: my_sprite.width = 100; и сразу событие придет.

incvizitor 24.05.2013 11:51

@ProcXel.A

1 - такие сеттеры лучше писать вот так:
Код AS3:

public override function set width( value:Number ):void {
        if(super.width == value)
        {
            return;
        }
        super.width = value;
        this.dispatchEvent( new Event( "RESIZE" ) );
}

2 - кроме width/height есть еще scaleX, scaleY, transform, skewX, skewY, graphics, и самое приятное - добавление/удаление и изменение перечисленных свойств у детей. Так что, задача не столь тривиальна как кажется.

caseyryan 24.05.2013 12:09

Зачем вообще писать Event("RESIZE")? когда у Event уже есть константа Event.RESIZE?

Wolsh 24.05.2013 12:27

Цитата:

и самое приятное - добавление/удаление и изменение перечисленных свойств у детей.
x, y, z и rotation'ы забыл))

СлаваRa 24.05.2013 13:23

Придется писать свои DO и DOC, но, мне кажется, что задача у ТС намного проще и решается совсем иными способами

Babylon 24.05.2013 13:35

50% использования стандартных ui остальное override :)


Часовой пояс GMT +4, время: 00:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.