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

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

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

Регистрация: Jan 2008
Сообщений: 36
По умолчанию Маски - принцип работы.

Код:
var container : Sprite = new Sprite();
//container.cacheAsBitmap = true;
addChild(container);

for (var i:Number = 0;i<40;i++) {
	var circle : Sprite = new Sprite();
	circle.graphics.beginFill(Math.random()*0xFFFFFF);	
	var xpos : Number = Math.random()*200;
	var ypos : Number = Math.random()*200;
	var radius : Number = Math.random()*10+10;
	circle.graphics.drawCircle(xpos,ypos,radius);
	circle.graphics.endFill();
	container.addChild(circle);
}

var masker : Sprite = new Sprite();
masker.graphics.beginFill(0xFF0000);
masker.graphics.drawRect(0,0,100,100);
masker.graphics.endFill();
masker.x = 0;
masker.y = 0;
container.mask = masker;
masker.x = 0;

stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler)

function onKeyDownHandler(e : KeyboardEvent) {
	if (e.keyCode == Keyboard.RIGHT) {		
		masker.x+=10;
		trace(masker.x);		
	}
	if (e.keyCode == Keyboard.LEFT) {		
		masker.x-=10;
		trace(masker.x);
	}
}
Итак все просто. На сцене спрайт(container), в котором лежат много спрайтов - кружочков. Создаем спрайт(masker), рисуем в нем квадрат и применяем его маской к контейнеру.

На кнопки влево\вправо двигаем маску и следим за происходящим.

С текущим кодом ничего двигаться не будет, но стоит лишь раскомментировать вторую строчку и все работает.

Кто-нибудь знает почему - так?

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

Регистрация: Jan 2004
Адрес: Moscow
Сообщений: 389
Отправить сообщение для DRAGOnoid с помощью ICQ
вообще странно очень что у тебя этот код заработал даже при
container.cacheAsBitmap = true;
ты забыл поаставить
addChild(masker);
вместо последнего
masker.x = 0;

а вместо
var masker : Sprite = new Sprite();
я бы посоветовал писать
var masker : Shape = new Shape();

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

Регистрация: Jan 2008
Сообщений: 36
Цитата:
ты забыл поаставить
addChild(masker);
Чтобы маска работала, она совсем не обязательно должна быть в дисплей листе. Читаем мануалы.

Старый 20.01.2008, 02:36
DRAGOnoid вне форума Посмотреть профиль Отправить личное сообщение для DRAGOnoid Посетить домашнюю страницу DRAGOnoid Найти все сообщения от DRAGOnoid
  № 4  
Ответить с цитированием
DRAGOnoid
 
Аватар для DRAGOnoid

Регистрация: Jan 2004
Адрес: Moscow
Сообщений: 389
Отправить сообщение для DRAGOnoid с помощью ICQ
незачто

Старый 20.01.2008, 02:42
ign вне форума Посмотреть профиль Отправить личное сообщение для ign Найти все сообщения от ign
  № 5  
Ответить с цитированием
ign
 
Аватар для ign

Регистрация: Jan 2008
Сообщений: 36
Цитата:
незачто
Бессмысленный пост. т.к. Проблемы это не решило. Нужно чтобы маски в дисплей листе не было.

Старый 20.01.2008, 02:44
DRAGOnoid вне форума Посмотреть профиль Отправить личное сообщение для DRAGOnoid Посетить домашнюю страницу DRAGOnoid Найти все сообщения от DRAGOnoid
  № 6  
Ответить с цитированием
DRAGOnoid
 
Аватар для DRAGOnoid

Регистрация: Jan 2004
Адрес: Moscow
Сообщений: 389
Отправить сообщение для DRAGOnoid с помощью ICQ
сделай как я писал выше и всё заработает - проверял лично.
а без этого никак - тут идёт обработка двух дисплеев как бы..
к тому же чем тебе мешает добавление маски которой всёравно не видно, не пойму.

из хелпа
To indicate that a display object will be the mask for another display object...


Последний раз редактировалось DRAGOnoid; 20.01.2008 в 02:51.
Старый 20.01.2008, 02:50
ign вне форума Посмотреть профиль Отправить личное сообщение для ign Найти все сообщения от ign
  № 7  
Ответить с цитированием
ign
 
Аватар для ign

Регистрация: Jan 2008
Сообщений: 36
Цитата:
сделай как я писал выше и всё заработает - проверял лично.
а без этого никак - тут идёт обработка двух дисплеев как бы..
к тому же чем тебе мешает добавление маски которой всёравно не видно, не пойму.
Вопрос темы был поставлен так:
Цитата:
Кто-нибудь знает почему - так?
Маска прекрасно работает и без добавления оной в дисплей лист, вот что об этом сказано в хелпе:
Цитата:
To be able to scale a mask object, it must be on the display list. To be able to drag a mask Sprite object (by calling its startDrag() method), it must be on the display list. To call the startDrag() method for a mask sprite based on a mouseDown event being dispatched by the sprite, set the sprite's buttonMode property to true.
Добавлять на сцену ее надо только лишь для возможности драгать или скейлить

Цитата:
To indicate that a display object will be the mask for another display object...
Display Object он и есть Display Object вне зависимости от того, на сцене он или нет.


Последний раз редактировалось ign; 20.01.2008 в 02:55.
Старый 24.11.2008, 18:30
Dmitry.C. вне форума Посмотреть профиль Отправить личное сообщение для Dmitry.C. Найти все сообщения от Dmitry.C.
  № 8  
Ответить с цитированием
Dmitry.C.

Регистрация: Nov 2008
Сообщений: 1
А у меня еще один похожий вопрос. Приведу пример попроще.
Код AS3:
// Circle это некий символ из библиотеки.
var mask:MovieClip = new Circle(); 
var symb:MovieClip = new Circle();
symb.mask=mask;
// функция, двигающая маску.
function func(){
	mask.y+=10;
           trace("маска сдвинута");
}
Если сделать функцию обработчиком некого события как в примере у ign, то двигаться ничего не будет, хотя плеер будет упрямо выводить "маска сдвинута".
Если вызывать функцию например следующим образом:
setInterval(func, 500);
то маска также не будет двигаться. Если написать как сказал ign: symb.cacheAsBitmap=true
то все будет впорядке, и мне тоже интересно почему так происходит. Но меня интересует еще вот что -
если просто несколько раз подряд вызвать функцию:
Код AS3:
func();
func();
func();
то маска будет двигаться даже без symb.cacheAsBitmap=true.
Почему при непосредственном вызове функции все работает, а при вызове через setInterval() или через обработчик ничерта не происходит!?

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

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

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


 


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


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