Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Программирование рамочного мувиклипа. (http://www.flasher.ru/forum/showthread.php?t=205728)

Fogflasher 18.12.2013 15:35

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

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

Вложение 30281

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

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

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

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

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

alexandrratush 18.12.2013 16:26

Цитата:

Я думал, что если в этом мувиклипе сделать подложку в виде рамки, то всё получится.
Но нет, события срабатывают и там, где ничего нет.
Срабатывают, потому что вы импортировали картинку, и то что у нее есть прозрачность, она все равно будет реагировать на события мышки. Как выход нарисовать рамку в Flash IDE.
Можно сделать подложку, и при нажатии проверять нажато ли на подложку, к примеру:

Код AS3:

function clickBtn(e:MouseEvent):void 
{
        //Если нажали на подложку
        if (e.target.name == 'podlogka')
        {
                // Делаем что нужно
        }
}

Еще вариант сделать как тут описано http://www.flasher.ru/forum/showthread.php?t=202844

Wolsh 18.12.2013 17:14

Вот только не надо тут разводить всякие InteractivePNG. Это же прямоугольная рамка, у которой нет никаких полупрозрачностей — прозрачность либо есть, либо нет. Надо просто нарисовать эту рамку с дыркой в векторе с битмап-заливкой из битмапдаты картинки рамы, и все. Хоть ручками, хоть программно. Та самая "подложка", которую Вы рисовали и которая правильно ловит события — Вам не пришло в голову залить ее не цветом а вашей картинкой?

fd96 18.12.2013 20:57

http://www.freeactionscript.com/2011...ion-detection/
Вот так , так наверное будет лучше , если позже рамка станет фигурной , не забудьте Scaling.
Проверяйте по Simple через EnterFrame, тот пиксель , что под курсором.
Хотя нет лучше варианта чем предложил Wolsh.

Fogflasher 19.12.2013 15:15

Вложений: 2
Всем спасибо за ответы.
Получилось, но не по всем методикам.

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

Библиотека:
Вложение 30284

Картинка:
Вложение 30285

То упрощенный код вот такой:
Код 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, время: 18:43.

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