PDA

Просмотр полной версии : Как узнать: нажата-ли кнопка мыши в пределах ролика?


Torero
02.11.2007, 04:42
Доброго времени суток.
Решил скролл сделать - наткнулся на проблему: MouseEvent-ы привязываются к конкретному объекту.
Подскажите пожалуйста - как отследить MOUSE_UP в любой точке ролика и выход за его(ролика) пределы.

etc
02.11.2007, 10:34
Подписаться у stage.

LokiDi L0ck
02.11.2007, 10:37
Вероятно нужно назначить слушателей для stage. А по e.target определять по кому нажали мышкой.

Насчёт выхода за границы Event.MOUSE_LEAVE (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/events/Event.html#constantSummary)

//опередили =)

vvk80
02.11.2007, 11:32
Доброго времени суток.
Решил скролл сделать
Уважаемый, Torero!

Подскажите пожалуйста, а как вы скролл делаете. У меня тоже такая проблема стоит... Объясните хотя бы логику... Понятно что надо scrollRect использовать... но дальше простого слайдинга вверх вниз у меня дело не пошло...А я бы хотел чтобы типа подвел к определенному месту ролика ролик пошел вверх, пошел к другому ролик- пошел вниз (если есть куда идти).

Torero
02.11.2007, 15:41
Спасибо за ответы - почти так и сделал..)))
чтобы типа подвел к определенному месту ролика ролик пошел вверх, пошел к другому ролик- пошел вниз.
Если я правильно понял, то вот обсуждение аналогичного скролла.
http://www.flasher.ru/forum/showthread.php?t=98574

vvk80
02.11.2007, 16:20
Спасибо за ответы - почти так и сделал..)))

Если я правильно понял, то вот обсуждение аналогичного скролла.
http://www.flasher.ru/forum/showthread.php?t=98574

спасибо, это то что нужно...
но вот блин, не хотелось бы опять в AS2 разбираться...

vvk80
02.11.2007, 18:05
http://www.sephiroth.it/tutorials/flashPHP/scrollRect/
взял код переделал в AS 3... подправил под свои нужды...

private function _onEnterFrame(evt:Event):void
{
mouse.x = this.mouseX;
mouse.y = this.mouseY;
if(r_mask.containsPoint(mouse))
{
y_pos = ((Math.abs(cont.y - mouse.y)/rect.height)*(r_img.height-rect.height));
//x_pos = ((Math.abs(cont.x - mouse.x)/rect.width)*(r_img.width-rect.width));
}

//rect.x += (x_pos - rect.x)/8;
//rect.x = rect.x;
//rect.y += (y_pos - rect.y)/8;
//rect.x = x_pos
rect.y = y_pos;
cont.scrollRect = rect;
отключил эфекты, так как почему -то они у меня работать стабильно не захотели... также отключил скроллинг по х.

если включаю эфекты (rect.y += (y_pos - rect.y)/8) флешка начинает вести себя не стабильно...

Torero
02.11.2007, 19:02
Нет времени - пишу навскидку несколько кусков кода:


/***target - прокручиваемый спрайт/мувик/текстфилд - у target есть маска, которая скрывает все лишнее.***/

private var target:DisplayObject;

target.addEventListener(MouseEvent.MOUSE_OVER, mouseON);
target.addEventListener(MouseEvent.MOUSE_OUT, mouseOFF);

private function mouseON(e:MouseEvent):void{
target.addEventListener(Event.ENTER_FRAME, targetScroll);
}

private function targetScroll(e:Event):void{
/*** здесь попробуй юзать соотношения "target.mouseX" с "target.mask.mouseX"
и "target.mouseY" c "target.mask.mouseY", для определения координат target под маской.***/
target.x=...
target.y=..
}

private function mouseOFF(e:MouseEvent):void{
target.removeEventListener(Event.ENTER_FRAME);
}

для перехвата событий мыши, скорее всего, прийдестя помимо маски добавлять еще и спрайт-перехватчик, расположенный поверх нее - уже точно не помню.
доделай до конца - получишь универсальный класс-скроллер.

vvk80
02.11.2007, 19:33
мой класс:
package
{
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.utils.*;

import HelperClasses.Objects.*;

public class Test extends Sprite
{
//private var shape:Shape = new Shape();
private var cont:Sprite = new Sprite();

private var rect:Rectangle= new Rectangle(0,0,300,560);
private var mouse:Point = new Point(0,0)
private var r_img:Rectangle;
private var r_mask:Rectangle;
private var x_pos:Number
private var y_pos:Number

private var img:BaseClass; //my Swf/Img loader


private var _heightC:Number;

public function Test():void
{
//shape.graphics.beginFill(0xFFFF00,1);
//shape.graphics.drawRect(300,200,300,300);
//shape.graphics.endFill();

img = new BaseClass(cont,"LeftPane_overview.swf");
img.initImg(0,0);
img.addEventListener(BaseClass.LOAD_COMPLETE, _onLoadComplete);

cont.addEventListener(MouseEvent.ROLL_OVER, _onRollOver);
cont.addEventListener(MouseEvent.ROLL_OUT, _onRollOut);
this.addChild(cont);

cont.x=18;
cont.y=140;
this.addEventListener("fullyLoaded",full);//listening to the global full event for loaded swf
//dispathed by the loaded swf when it is fully loaded (all inner components are loaded
// used to obtain actual dimensions of the loaded swf
// event declared as public in the loaded swf
}

private function full(evt:Event):void
{
trace("Full")
trace(img.getHeight);
r_img = new Rectangle(0, 0, img.getWidth, img.getHeight) //getting rectnagle object containing the original width and height of the loaded image
r_mask = new Rectangle(cont.x, cont.y, rect.width, rect.height)
start();
}

private function start():void
{
cont.scrollRect = rect;
cont.addEventListener(Event.ENTER_FRAME,_onEnterFrame);
}

private function _onEnterFrame(evt:Event):void
{
mouse.x = this.mouseX;
mouse.y = this.mouseY;
if(r_mask.containsPoint(mouse))
{
y_pos = ((Math.abs(cont.y - mouse.y)/rect.height)*(r_img.height-rect.height));
//x_pos = ((Math.abs(cont.x - mouse.x)/rect.width)*(r_img.width-rect.width));
}

//rect.x += (x_pos - rect.x)/8;
//rect.x = rect.x;
//rect.y += (y_pos - rect.y)/8;
//rect.x = x_pos
rect.y = y_pos;
cont.scrollRect = rect;
}
private function _onLoadComplete(evt:Event):void
{
trace("loadComplete");
}
private function _onRollOver(evt:Event):void
{

}
private function _onRollOut(evt:Event):void
{

}
}
}
если включаю rect.y += (y_pos - rect.y)/8;, начинаются глюки...