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

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

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

Регистрация: Mar 2013
Сообщений: 290
Tools Программирование рамочного мувиклипа.

В фотошопе, в формате .png, сделана рамка для stage, а затем импортирована в Библиотеку.
У картинки нет центра, там альфа-канал, то есть графика есть только там, где нужно.

В Библиотеке создан мувиклип Frame_container, в который и помещена эта рамка.
В программе, на него вешаются события: MOUSE_OVER, MOUSE_OUT, CLICK.

Нажмите на изображение для увеличения
Название: snap6136.jpg
Просмотров: 106
Размер:	91.5 Кб
ID:	30281

Проблема в том, что события срабатывают в любом месте мувиклипа.
А нужно, чтобы только там, где есть графика самой рамки. Поэтому первые два события работают криво.

Каким образом это можно реализовать?

Я пробовал рассуждать по разному, например:
1. Нужно как-то вырезать дыру в самом мувиклипе. Но как это сделать - непонятно.
Я думал, что если в этом мувиклипе сделать подложку в виде рамки, то всё получится.
Но нет, события срабатывают и там, где ничего нет.

2. Придумать что-то хитрое с hitTestPoint(). Здесь пока еще пробую, но промежуточные результаты тоже не очень.
Вроде бы хиттест срабатывает нормально, если дело касается просто спрайта с подложкой.
Но если в него помещать другой спрайт c рамкой, то ситуация возвращается к раскладу из п.1

3. Можно конешно рамку собрать из четырех фрагментов, так наверное всё получится.
Но этот вариант не очень хорош, по понятным причинам.

Старый 18.12.2013, 16:26
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 2  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Цитата:
Я думал, что если в этом мувиклипе сделать подложку в виде рамки, то всё получится.
Но нет, события срабатывают и там, где ничего нет.
Срабатывают, потому что вы импортировали картинку, и то что у нее есть прозрачность, она все равно будет реагировать на события мышки. Как выход нарисовать рамку в Flash IDE.
Можно сделать подложку, и при нажатии проверять нажато ли на подложку, к примеру:

Код AS3:
function clickBtn(e:MouseEvent):void 
{
	//Если нажали на подложку
	if (e.target.name == 'podlogka')
	{
		// Делаем что нужно
	}
}
Еще вариант сделать как тут описано http://www.flasher.ru/forum/showthread.php?t=202844

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вот только не надо тут разводить всякие InteractivePNG. Это же прямоугольная рамка, у которой нет никаких полупрозрачностей — прозрачность либо есть, либо нет. Надо просто нарисовать эту рамку с дыркой в векторе с битмап-заливкой из битмапдаты картинки рамы, и все. Хоть ручками, хоть программно. Та самая "подложка", которую Вы рисовали и которая правильно ловит события — Вам не пришло в голову залить ее не цветом а вашей картинкой?
__________________
Reality.getBounds(this);

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

Регистрация: Jan 2013
Адрес: If(Sprite.x >0){Sprite.x=(Sprite.x-Sprite.x)}
Сообщений: 51
Отправить сообщение для fd96 с помощью ICQ Отправить сообщение для fd96 с помощью Skype™
http://www.freeactionscript.com/2011...ion-detection/
Вот так , так наверное будет лучше , если позже рамка станет фигурной , не забудьте Scaling.
Проверяйте по Simple через EnterFrame, тот пиксель , что под курсором.
Хотя нет лучше варианта чем предложил Wolsh.
__________________
...Nothing can't be coded...

Старый 19.12.2013, 15:15
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 5  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Всем спасибо за ответы.
Получилось, но не по всем методикам.

Если исходить из следующих скриншотов:

Библиотека:
Название: snap6137.jpg
Просмотров: 221

Размер: 47.7 Кб

Картинка:
Название: snap6138.jpg
Просмотров: 239

Размер: 136.3 Кб

То упрощенный код вот такой:
Код AS3:
package
{
 
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
	import flash.geom.*;
 
	public class Main extends Sprite
	{
		//=== CLASS MEMBERS ===//
 		private var frame_container = new Frameclass();
		private var frame_image = new Frameimage(800, 600);
		private var bitmap1 = new Bitmap(frame_image);
 
		//=== CONSTRUCTOR ===//
		public function Main()
		{
			initStage();
		} 
 
		//=== METHOD ===//
		private function initStage()
		{
			//--- Variant1 ---//
//			this.addChild(frame_container);
//			this.addChild(bitmap1);
 
			//--- Variant2 ---//
//			Ручная заливка текстурой
//			this.addChild(frame_container);
 
			//--- Variant3 ---//
//			this.addChild(frame_container);
//			frame_container.graphics.beginBitmapFill(frame_image);
//			frame_container.graphics.endFill();
 
			frame_container.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
			frame_container.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
		}
 
		private function mouseOverHandler(e:Event)
		{
			trace("OVER!");
		}
 
		private function mouseOutHandler(e:Event)
		{
			trace("OUT!");
		}
 
	}
 
 
}
Variant1 - по упрощенной схеме от alexandrratush, так работает.

Variant2 - с ручной заливкой контейнера, по совету от Wolsh также работает.
Я не догадался это сделать, потому что опыта работы с растром во флэше у меня практически нет.
Даже как-то подзабыл, что Bucket имеет режим растровой заливки.

Variant3 - c программной заливкой контейнера. К сожалению не получилось. Не догоняю как грамотно залить битмапдатой.
Во время экспериментов с параметрами этой функции + добавление геометрических фигур + добавление случайной матрицы, какие-то части битмапдаты проклюнулись, но как сделать просто и грамотно, не пойму. Буду признателен за разгадку.

P.S.
C InteractivePNG тоже разобрался, отчасти получилось (не получилось лишь там, где была ошибка с логикой моей архитектуры), берем на заметку.

fd96, спасибо за наводку, демо прикольное.
На практике сам класс пока не проверял. Но думаю, там всё просто - надо просто передавать в метод
complex(clip1: DisplayObjectContainer, clip2: DisplayObjectContainer) два мувиклипа и на выходе ловить true или false.

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

Теги
битмап , дырка в спрайте , рамка , события мыши

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

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


 


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


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