Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Stage3D] Сменить координаты маски. (http://www.flasher.ru/forum/showthread.php?t=209119)

Astraport 13.10.2014 21:40

Сменить координаты маски.
 
Вопрос не сложный, но что-то запутался.

Мне нужно натянуть текстуру на текст - цифра "8" допустим.

Код AS3:

num = new TextField (200, 250, '', 'Arial', 200);
addChild(num);
num.text = '8';
 
image = new ImageLoader();
image.source = 'assets/7.jpg';// текстура
image.addEventListener(Event.COMPLETE, imageLoaded);
 
bg = new MaskedSprite();
addChild(bg);
bg.addChild(image);
bg.mask = num;

Собственно класс MaskedSprite
Код AS3:

public class MaskedSprite extends Sprite
        {
                public var mask:DisplayObject;
                private static const MASK_MODE_INVERTED:String = "maskinverted";
 
                public function MaskedSprite()
                {
                        BlendMode.register(MASK_MODE_INVERTED, Context3DBlendFactor.ZERO, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA, false);
                }
 
                override public function render(support:RenderSupport, parentAlpha:Number):void
                {
                        var _this:MaskedSprite = this;
 
                        if (mask != null)
                        {
                                RenderTexturePool.instance.getTemporal(function(eraserTexture:RenderTexture):void {
                                        RenderTexturePool.instance.getTemporal(function(composedTexture:RenderTexture):void {
                                                eraserTexture.clear();
                                                composedTexture.clear();
 
                                                eraserTexture.draw(new Quad(eraserTexture.width, eraserTexture.height, 0xFFFFFF));
                                                mask.blendModeBlendMode.ERASE;
 
                                                mask.visible = true;
                                                eraserTexture.draw(mask, mask.getTransformationMatrix(Starling.current.root));
                                                mask.visible = false;
 
                                                for (var n:int = 0; n < numChildren; n++) composedTexture.draw(getChildAt(n), support.modelViewMatrix);
 
                                                var eraserImage:Image = new Image(eraserTexture);
                                                eraserImage.blendMode = MASK_MODE_INVERTED;
 
                                                composedTexture.draw(eraserImage);
 
                                                support.pushMatrix();
                                                support.loadIdentity();
                                                new Image(composedTexture).render(support, parentAlpha);
                                                support.popMatrix();
                                        });
                                });
                        }
                        else
                        {
                                super.render(support, parentAlpha);
                        }
                }
        }

Все отлично, все работает. Но теперь мне нужно сдвинуть либо текстуру так чтобы маска была в её пределах, либо маску в пределах текстуры. И получается что либо маска обрезается, либо вообще ничего не видно.
Где можно задать координаты маски или текстуры?

silin 14.10.2014 21:28

>>Где можно задать координаты маски или текстуры?
координаты маски это тупо bg.x, не?
во всяком случае, для твоего примера
Код AS3:

this.addEventListener(EnterFrameEvent.ENTER_FRAME, function(e:Event):void { bg.x--; } );

исправно двигает картинку на цифре

можно двигать и image внутри самой маски, но тогда в MaskedSprite отрисовывать содержимое надо "как есть", т.е.
Код AS3:

for (var n:int = 0; n < numChildren; n++)
        //composedTexture.draw(getChildAt(n), support.modelViewMatrix);
        composedTexture.draw(getChildAt(n));

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

Astraport 15.10.2014 12:24

Привет!
Цитата:

исправно двигает картинку на цифре
Дело в том, что мне и цифру нужно двигать и маску тоже. Небольшая мини-игра - найти силуэт на фоне.
И текстура должна на цифре рандомно переместится и цифра на сцене.
Цитата:

так работает, но я не поручусь, что оно не вылезет боком где-нибудь
Вот именно проблема в том, что в верхних позициях сцены цифра обрезается.

Astraport 15.10.2014 12:25

Вложений: 1
Вот пример во вложении

silin 15.10.2014 14:20

>> Дело в том, что мне и цифру нужно двигать и маску тоже.
все равно не оч. понятно в чем трабл
просто когда двигаем цифру, надо двигать и подложку тоже, а когда маску, то только подложку
Код AS3:

public class Main extends Sprite 
{
        private var image:Image;
        private var num:Sprite;
        private var bg:MaskedSprite;
 
        [Embed(source = "pic.png")] public static const pic_png:Class;
        public function Main():void
        {
 
                num = new Sprite;
                var tf:TextField = new TextField (200, 250, '8', 'Arial', 200);
                num.addChild(tf);
 
                image = Image.fromBitmap(new pic_png());
                bg = new MaskedSprite();
                bg.addChild(image);
 
                num.addChild(bg);
                bg.mask = tf;
 
                addChild(num);
 
                num.addEventListener(TouchEvent.TOUCH, num_touch);
 
 
        }
 
        private function num_touch(e:TouchEvent):void
        {
                var touchMoved:Touch = e.getTouch(num, TouchPhase.MOVED);
                if (touchMoved)
                {
                        var del:Point = touchMoved.getMovement(this);
                        // с зажатым Ctrl двигаем только картинку
                        // без Ctrl двигаем саму маску вместе с картинкой
                        if (e.ctrlKey)
                        {
                                bg.x += del.x;
                                bg.y += del.y;
                        }else
                        {
                                num.x += del.x;               
                                num.y += del.y;               
                        }
 
                }
 
        }
 
}


Astraport 15.10.2014 17:51

Цитата:

// с зажатым Ctrl двигаем только картинку
вот не двигается ничего) код 1 в 1.

Добавлено через 1 час 35 минут
В общем разобрался. Там фезеровский навигатор мне мешал, путал координаты. Спасибо.


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

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