|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Программирование рамочного мувиклипа.
В фотошопе, в формате .png, сделана рамка для stage, а затем импортирована в Библиотеку.
У картинки нет центра, там альфа-канал, то есть графика есть только там, где нужно. В Библиотеке создан мувиклип Frame_container, в который и помещена эта рамка. В программе, на него вешаются события: MOUSE_OVER, MOUSE_OUT, CLICK. Проблема в том, что события срабатывают в любом месте мувиклипа. А нужно, чтобы только там, где есть графика самой рамки. Поэтому первые два события работают криво. Каким образом это можно реализовать? Я пробовал рассуждать по разному, например: 1. Нужно как-то вырезать дыру в самом мувиклипе. Но как это сделать - непонятно. Я думал, что если в этом мувиклипе сделать подложку в виде рамки, то всё получится. Но нет, события срабатывают и там, где ничего нет. 2. Придумать что-то хитрое с hitTestPoint(). Здесь пока еще пробую, но промежуточные результаты тоже не очень. Вроде бы хиттест срабатывает нормально, если дело касается просто спрайта с подложкой. Но если в него помещать другой спрайт c рамкой, то ситуация возвращается к раскладу из п.1 3. Можно конешно рамку собрать из четырех фрагментов, так наверное всё получится. Но этот вариант не очень хорош, по понятным причинам. |
|
|||||
Цитата:
Можно сделать подложку, и при нажатии проверять нажато ли на подложку, к примеру: function clickBtn(e:MouseEvent):void { //Если нажали на подложку if (e.target.name == 'podlogka') { // Делаем что нужно } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вот только не надо тут разводить всякие InteractivePNG. Это же прямоугольная рамка, у которой нет никаких полупрозрачностей — прозрачность либо есть, либо нет. Надо просто нарисовать эту рамку с дыркой в векторе с битмап-заливкой из битмапдаты картинки рамы, и все. Хоть ручками, хоть программно. Та самая "подложка", которую Вы рисовали и которая правильно ловит события — Вам не пришло в голову залить ее не цветом а вашей картинкой?
__________________
Reality.getBounds(this); |
|
|||||
http://www.freeactionscript.com/2011...ion-detection/
Вот так , так наверное будет лучше , если позже рамка станет фигурной , не забудьте Scaling. Проверяйте по Simple через EnterFrame, тот пиксель , что под курсором. Хотя нет лучше варианта чем предложил Wolsh.
__________________
...Nothing can't be coded... |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Всем спасибо за ответы.
Получилось, но не по всем методикам. Если исходить из следующих скриншотов: Библиотека: Картинка: То упрощенный код вот такой: 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!"); } } } Variant2 - с ручной заливкой контейнера, по совету от Wolsh также работает. Я не догадался это сделать, потому что опыта работы с растром во флэше у меня практически нет. Даже как-то подзабыл, что Bucket имеет режим растровой заливки. Variant3 - c программной заливкой контейнера. К сожалению не получилось. Не догоняю как грамотно залить битмапдатой. Во время экспериментов с параметрами этой функции + добавление геометрических фигур + добавление случайной матрицы, какие-то части битмапдаты проклюнулись, но как сделать просто и грамотно, не пойму. Буду признателен за разгадку. P.S. C InteractivePNG тоже разобрался, отчасти получилось (не получилось лишь там, где была ошибка с логикой моей архитектуры), берем на заметку. fd96, спасибо за наводку, демо прикольное. На практике сам класс пока не проверял. Но думаю, там всё просто - надо просто передавать в метод complex(clip1: DisplayObjectContainer, clip2: DisplayObjectContainer) два мувиклипа и на выходе ловить true или false. |
Часовой пояс GMT +4, время: 14:08. |
|
« Предыдущая тема | Следующая тема » |
Теги |
битмап , дырка в спрайте , рамка , события мыши |
|
|