Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.10.2014, 21:40
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 1  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Сменить координаты маски.

Вопрос не сложный, но что-то запутался.

Мне нужно натянуть текстуру на текст - цифра "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.blendMode =  BlendMode.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);
			}
		}
	}
Все отлично, все работает. Но теперь мне нужно сдвинуть либо текстуру так чтобы маска была в её пределах, либо маску в пределах текстуры. И получается что либо маска обрезается, либо вообще ничего не видно.
Где можно задать координаты маски или текстуры?
__________________
In Code We Trust

Старый 14.10.2014, 21:28
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>Где можно задать координаты маски или текстуры?
координаты маски это тупо 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));
так работает, но я не поручусь, что оно не вылезет боком где-нибудь

Старый 15.10.2014, 12:24
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 3  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Привет!
Цитата:
исправно двигает картинку на цифре
Дело в том, что мне и цифру нужно двигать и маску тоже. Небольшая мини-игра - найти силуэт на фоне.
И текстура должна на цифре рандомно переместится и цифра на сцене.
Цитата:
так работает, но я не поручусь, что оно не вылезет боком где-нибудь
Вот именно проблема в том, что в верхних позициях сцены цифра обрезается.
__________________
In Code We Trust

Старый 15.10.2014, 12:25
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 4  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Вот пример во вложении
Изображения
 
__________________
In Code We Trust

Старый 15.10.2014, 14:20
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>> Дело в том, что мне и цифру нужно двигать и маску тоже.
все равно не оч. понятно в чем трабл
просто когда двигаем цифру, надо двигать и подложку тоже, а когда маску, то только подложку
Код 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;		
			}
 
		}
 
	}
 
}

Старый 15.10.2014, 17:51
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 6  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Цитата:
// с зажатым Ctrl двигаем только картинку
вот не двигается ничего) код 1 в 1.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:24.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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