PDA

Volledige versie bekijken : muis buiten movie


FlashElements
%Europe/Berlin %598 %2005, 15:22
Hoi allemaal,

Ik ben vandaag weer lekker bezig met scripten :)

Het volgende doet zich voor:

Als is met mijn muis in de flashmovie zit kan ik netjes alles opvragen (x,y, events etc...)
Maar als ik mijn muis snel uit de movie beweeg schijnt de movie nog de laatste oude positie te weten en dat als waarde terug te geven. (hangt ook sterk van de framerate af)
Maar hoe kan de flashmovie mij vertellen dat de muis helemaal niet in de movie is ?

Groetjes en alvast bedankt ...

FlashElements

behived
%Europe/Berlin %605 %2005, 15:31
ik heb geen idee, maar ik heb eens een site gezien waar de x en y waarden van de muis door een javascript naar flash gestuurd werden, zodat deze ook buiten de flashmovie werden doorgegeven, mss even hier naar op zoek gaan?

FlashElements
%Europe/Berlin %628 %2005, 16:04
Het zou toch eigenlijk binnen Flash moeten kunnen ?

//matt
%Europe/Berlin %707 %2005, 17:58
Volgens mij kan dat niet, omdat voor flash de muis zich altijd in de movie bevindt. Het MovieClip Object heeft _x en _y properties die nooit 'undefined' of zo zijn. Vandaar dat hij je altijd die laatste waarden teruggeeft. Zou je inderdaad iets van Javascript moeten gebruiken.
Wat je eventueel zou kunnen doen is kijken of de muis beweegt. En als dat een bepaalde tijd niet gebeurt, ervan uitgaan dat de muis dan niet meer in je movie zit. Maar dan heb je geen garantie dat dat daadwerkelijk zo is. Sowieso niet echt een oplossing.

FlashElements
%Europe/Berlin %802 %2005, 20:15
Misschien moet ik inderdaad eens kijken naar een Javascript oplossing, ik heb een navigatie menu gemaakt in Flash maar zodra je heel snel met je muis uit de movie gaat dan klap het submenu niet meer terug ......

zie: link --> http://test.wooon.pageprocessor.nl/?RubriekID=1983

theFlashWizard
%Europe/Berlin %821 %2005, 20:42
ik zou het gewoon na n paar sec automatisch weer in late klappe wanneer je muis er niet meer boven is..

Roenes
%Europe/Berlin %879 %2005, 22:07
Je zegt dit:
ik heb een navigatie menu gemaakt in Flash maar zodra je heel snel met je muis uit de movie gaat dan klap het submenu niet meer terug ......en dit:
Maar als ik mijn muis snel uit de movie beweeg schijnt de movie nog de laatste oude positie te weten en dat als waarde terug te geven. (hangt ook sterk van de framerate af)Hierdoor krijg ik het idee dat je de muis waardes opvraagt in een onEnterFrame. Dit is niet de meest efficiente methode. Gebruik een onMouseMove om de muis te detecteren:

var ml = new Object();
ml.onMouseMove = function()
{
//Doe hier je ding
updateAfterEvent(); //Erg belangrijk statement!
}
Mouse.addListener(ml);
Op deze manier ben je niet meer afhankelijk van de framerate. Als je al zo'n constructie gebruikte, plaats dan even je code. Want dan zit er iets niet goed als je framerate hierop invloed heeft :)

//matt
%Europe/Berlin %970 %2005, 00:17
He Roenes, Je hebt gelijk wat betreft die onMouseMove... maar wat FlashElements volgens mij bedoeld, is niet dat hij wil traceren wanneer de muis zich buiten een bepaalde mc bevindt, maar wanneer de muis zich buiten de hele swf (dus in de internet pagina) bevindt. En dat gaat naar mijn idee niet met Flash.
Waarschijnlijk heeft hij alleen het menu in flash gemaakt, en de rest in html.

Roenes
%Europe/Berlin %413 %2005, 10:55
Ehmz, met flash alleen wordt dat moeilijk maar volgens mij valt het wel te faken :) Je vraagt in de onMouseMove gewoon de _xmouse en _ymouse positie op en als die gelijk is aan de Stage.width of Stage.height zit de muis op de rand. En meestal zit je dan buiten de swf.

Dus je kunt het simuleren, maar het is niet waterdicht :)

FlashElements
%Europe/Berlin %514 %2005, 13:20
He Roenes, Je hebt gelijk wat betreft die onMouseMove... maar wat FlashElements volgens mij bedoeld, is niet dat hij wil traceren wanneer de muis zich buiten een bepaalde mc bevindt, maar wanneer de muis zich buiten de hele swf (dus in de internet pagina) bevindt. En dat gaat naar mijn idee niet met Flash.
Waarschijnlijk heeft hij alleen het menu in flash gemaakt, en de rest in html.

Matt heeft gelijk, de rest is HTML.
Maar zoals Roenes al hierboven beschreef vang ik het muisevent al af met de Mouse.addListener([object]; en de onMouseMove;

ook met updateAfterEvent ben je nog altijd afhankelijk van je cycle-time...
maw mocht je muis buiten de swf vallen en de interval gaat kijken waar zich de muis bevind, dan kan het voorkomen dat deze nog wordt gezien binnen de movie terwijl dit eigenlijk niet zo is.

Misschien iets voor Flash 9 :) ziets als : Mouse.inStage

Maar ik denk dat ik denk dat zoiets wel met javascript te doen is.

Roenes
%Europe/Berlin %517 %2005, 13:24
ook met updateAfterEvent ben je nog altijd afhankelijk van je cycle-time...
maw mocht je muis buiten de swf vallen en de interval gaat kijken waar zich de muis bevind, dan kan het voorkomen dat deze nog wordt gezien binnen de movie terwijl dit eigenlijk niet zo is.Laat je code eens zien. Want het hele idee van onMouseMove icm updateAfterEvent is juist dat je onafhankelijk bent van de cycle time. de onMouseMove registreert zodra de muis bewogen wordt (Dus ook tussen frames) en de updateAfterEvent zorgt dat alles direct geupdate wordt (dus ook tussen de frames door).

Op die manier ben je dus niet afhankelijk van de cycletime :)

Laiverd
%Europe/Berlin %520 %2005, 13:29
het probleem is natuurlijk dat een onMouseMove niet gedetecteerd wordt zodra de cursor zich buiten de Flash movie bevindt. Zie ook http://www.flashfocus.nl/forum/showthread.php?t=3916. Ik denk dat je (zolang er geen standaard oplossing is) het beste kunt terug vallen op een regelmatige check van de muiscursor positie evt. gecombineerd met een hotspot-rand van 5 a 10 pixels breed. Dat zal in 99% van de gevallen voldoen, maar is inderdaad niet fullproof.

John

FlashElements
%Europe/Berlin %389 %2005, 10:20
Laat je code eens zien. Want het hele idee van onMouseMove icm updateAfterEvent is juist dat je onafhankelijk bent van de cycle time. de onMouseMove registreert zodra de muis bewogen wordt (Dus ook tussen frames) en de updateAfterEvent zorgt dat alles direct geupdate wordt (dus ook tussen de frames door).

Sorry voor de wat lange code :

#include "mc_tween_2_26_27.as"

// Navigatie voor wooon.nu
//
System.useCodepage = true;
// stippellijntje
var dots:Number = 72;
var num:Number;

dot._visible = false;
for (num=1; num<dots; num++) {
dot.duplicateMovieClip("myDot" + num, (num + 1000));
this["myDot" + num]._y = (num*6)-3.5;
}
///////////////////////////////////////////////////////////////
MovieClip.prototype.mainMouseActions = function(link:String) {
var subMenuID:String = link;
if(mainPage == link) {
var myColor = new Color();
var my_color:Color = new Color(this);
my_color.setRGB(0xF8981D);

var this_linkfmt:TextFormat = new TextFormat();
this_linkfmt.color = 0xFFFFFF;
var myString:String = String(this);
trace(myString);
var stringNum:String = myString.charAt(myString.length-1);
_level0.mainHolder["this_txt" + stringNum].setTextFormat(this_linkfmt);
_level0.mainHolder.navPointer.slideTo((this._x - 14), this._y, 0.5, "easeOutQuint");

this.onRelease = function() {
var myLink = "/?RubriekID="+link;
getURL(myLink,"_self");
trace(myLink);
}

this.onRollOver = function() {
_level0.mainHolder.navPointer.slideTo((this._x - 14), this._y, 0.5, "easeOutQuint");
openSubMenu(subMenuID);
};

} else {
this.onRollOver = function() {
_level0.mainHolder.navPointer.slideTo((this._x - 14), this._y, 0.5, "easeOutQuint");
if (mainPage != "962") openSubMenu(subMenuID);
};
this.onRollOut = function() {
//this.mcRollIn.slideTo(-174, 0, 3, "easeOutQuint");
};
this.onReleaseOutside = function() {
//this.mcRollIn.slideTo(-174, 0, 3, "easeOutQuint");
};

this.onRelease = function() {
var myLink = "/?RubriekID="+link;
getURL(myLink,"_self");
trace(myLink);
}
}
};
MovieClip.prototype.subMouseActions = function(link:String) {
var this_linkfmt:TextFormat = new TextFormat();
//if(subPage == link) {
//nog geen aktie
//} else {
this.onRollOver = function() {
var myColor = new Color();
var my_color:Color = new Color(this);
my_color.setRGB(0xF8981D);

this_linkfmt.color = 0xFFFFFF;
var myString:String = String(this);
var stringNum:String = myString.charAt(myString.length-1);
_level0.subHolder["this_txt" + stringNum].setTextFormat(this_linkfmt);
};
this.onRollOut = function() {
var myColor = new Color();
var my_color:Color = new Color(this);
my_color.setRGB(0x85BCE4);

this_linkfmt.color = 0x000000;
var myString:String = String(this);
var stringNum:String = myString.charAt(myString.length-1);
_level0.subHolder["this_txt" + stringNum].setTextFormat(this_linkfmt);
};
this.onReleaseOutside = function() {
//this.mcRollInn.slideTo(174, 0, 3, "easeOutQuint");
};
this.onRelease = function() {
var myLink = "/?RubriekID="+link;
getURL(myLink,"_self");
trace(myLink);
}
//}
};

MovieClip.prototype.setText = function(textItem:String, itemNumber:Number, x0:Number, y0:Number, textWidth:Number, textHeight:Number, align:String, bold:Boolean) {
this.createTextField("this_txt" + itemNumber, (itemNumber+500), x0, y0, textWidth, textHeight);
var this_fmt:TextFormat = new TextFormat();
this_fmt.font = "myriad";
this_fmt.size = 16;
this_fmt.color = 0x000000;
this_fmt.leftMargin = 3;
this_fmt.align = align;
this_fmt.bold = bold;
this["this_txt" + itemNumber].embedFonts = true;
this["this_txt" + itemNumber].selectable = false;
this["this_txt" + itemNumber].text = textItem;
this["this_txt" + itemNumber].setTextFormat(this_fmt);
}



var result_lv:LoadVars = new LoadVars();
result_lv.onLoad = function(success:Boolean) {
constructMenuValues(result_lv.menuItems);
if (result_lv.loadingDone == 'true') {
//debug(result_lv.menuItems);
//trace(result_lv.menuItems);
createMainMenu();
//trace('loading done !');
} else {
trace('Error loading Navigator');
}
};





var path:String = _level0.path;
//result_lv.load(path + "/navigatie/verticaleNav.php");

// DEBUG
result_lv.load("http://dev.wooon/navigatie/testNav.php");

/*

Array Functie:
my_array [0] = eerste menuItems inclusief subItems
my_array [0][0] = menuItem naam
my_array [0][1] = id , menuItem naam , RubriekID
my_array [0][1][0] = id
my_array [0][1][1] = menuItem naam
my_array [0][1][2] = RubriekID

dus: my_array [6][3][2] = de RubriekID van het 2e subItem in het 7de menu.
*/
var my_array:Array = new Array();
function constructMenuValues(myText:String) {
my_array = myText.split("::");
for (var i = 0; i<my_array.length; i++) {
my_array[i] = my_array[i].split("<<");
for (var l = 0; l<my_array[i].length; l++) {
my_array[i][l] = my_array[i][l].split("##");
}
}
}

function createMainMenu() {
//my_array[-1] = Array([""]);
//my_array[-1][1] = Array([""]);
//my_array[-1][0] = "Home";
//my_array[-1][1][2] = "962";

this.createEmptyMovieClip("mainHolder",1);
//this.createEmptyMovieClip("mainMask",0);
//mainHolder.setMask(mainMask);
mainHolder._y = 245;
mainHolder._x = -185;
pointer = mainHolder.attachMovie("blokje", "navPointer" , 1000);
pointer._x = 237;
pointer._y = -120;

//mainHolder._x = -174;
//mainHolder.slideTo(0, mainHolder._y, 0.5, "easeOutBounce");
for (var n=0; n<my_array.length-1; n++) {
mainBox = mainHolder.attachMovie("main_box", "main_box_"+ n, n+1);
mainBox._x = 251;
mainBox._y = (n*26)-120;

mainHolder.setText(my_array[n][0], n, 251, (n*26)-119, 300, 25,"left",false);
if(admin != 1) mainBox.mainMouseActions(my_array[n][1][2]);
//trace(n + "-->" + my_array[n][1][2]);

}
}

function openSubMenu(subMenuID:String) {
this.createEmptyMovieClip("subHolder",2);
subHolder.setMask(subMask);
subHolder._y = -83;
subHolder._x = -185;

for(var searchArray=0; searchArray<my_array.length-1; searchArray++){
if(my_array[searchArray][1][2] == subMenuID && (my_array[searchArray].length-2) != 0 ) {
subHolder._y = _level0.mainHolder["main_box_" + searchArray]._y +37;
subHolder.slideTo(-38, subHolder._y, 0.7, "easeOutQuart",0,subMenuListener());


for(var j=2; j<my_array[searchArray].length; j++){
subBox = subHolder.attachMovie("sub_box", "sub_box_"+j, j);
subBox._x = 251;
subBox._y = (j*26)+156;
subBox.subMouseActions(my_array[searchArray][j][2]);
//textItem:String, itemNumber:Number, x0:Number, y0:Number, textWidth:Number, textHeight:Number, align:String
subHolder.setText(my_array[searchArray][j][1], j, 250, (j*26)+157, 130, 25,"left",false);
}
}
}
}

function subMenuListener() {
var mouseInn:Boolean = false;
subHolder.onMouseMove = function () {
if (subHolder.hitTest(_xmouse,_ymouse,true)) {
mouseInn = true;
} else {
if (mouseInn) {
/*
var bounds_obj:Object = this.getBounds(this);
for (var i in bounds_obj) {
trace(i+" --> "+bounds_obj[i]);
}
*/
//debug('xm = ' + _xmouse + ' ym = ' + _ymouse + ' pos = ' + subHolder._y);
subHolder.slideTo(-185, this._y, 0.4, "easeInBack");
mouseInn = false;
delete subHolder.onMouseMove;
}
}
}
}

Roenes
%Europe/Berlin %633 %2005, 16:12
Ik heb nu even niet genoeg tijd, maar ik zal later even je code doorlopen om te kijken of er iets vreemds in zit :)

FlashElements
%Europe/Berlin %482 %2005, 12:34
Ik heb nu even niet genoeg tijd, maar ik zal later even je code doorlopen om te kijken of er iets vreemds in zit :)

……….hoeft niet meer want ik heb het probleem al gevonden.
Wel heel erg bedankt Roenes!

Het schijn zo te zijn dat de browser slecht met de wmode omgaat.
<param name="wmode" value="transparent" />

Wat je dus moet doen is op de stage een blok neerzetten met de afmeting van je stage,
deze zet je met alpha op 0.

Zo worden toch de mouseEvents gezien, anders worden de mousEvents niet gezien in je browser en kun je dus geen actions hierop toepassen, met een extra blokje op de stage die transparant is, lukt het wel…….. (raar maar waar) !

Roenes
%Europe/Berlin %483 %2005, 12:36
Oke, daar zou ik iig nooit aan gedacht hebben. Maar het werkt iig. :)

Scheelt mij ook weer wat tijd van de code doorlopen ;)

Fatty Owl
%Europe/Berlin %402 %2005, 10:39
jullie doen tog moeilijk 8~

//matt
%Europe/Berlin %428 %2005, 11:16
hmm...

Fatty Owl heeft wel de simpelste oplossing gevonden (wat ook echt een oplossing is). :)
Checken of je muis erbuiten is gaat niet, maar je kunt natuurlijk wel checken of je muis er niet buiten is. En als dat het geval is, tja, dan is je muis niet niet buiten je swf...
Niet echt overzichtelijke oplossing btw fatty Owl, ik zou het gewoon met events doen, maar het idee werkt perfect!

TheDutch
%Europe/Berlin %446 %2005, 11:42
Gebruik dit stukje JavaScript code in de HTML van je Flashmovie:

<script language="JavaScript1.2">
function mouseMoveHandler (evt) {
document.flashmovie.SetVariable("_root.mouseout", 1);
}
if (document.layers || document.all){
document.onmousemove = mouseMoveHandler;
}
else{
document.captureEvents(Event.MOUSEMOVE);
}
</script>

Op de _root van je Flashmovie heb je een variable "mouseout" dat een boolean bevat om te zien of de muis buiten het Flash object zit. Dit is de enige oplossing die er bestaat en zijn werk goed doet :).

LET OP: Vanaf Flash 8 moet je de ExternalInterface class (http://livedocs.macromedia.com/flash/8/main/00002200.html#wp232104) gebruiken ipv. setVariable() in JavaScript.

Fatty Owl
%Europe/Berlin %449 %2005, 11:46
nee mijn werkt ook :p:p test maar eens

TheDutch
%Europe/Berlin %452 %2005, 11:51
Jouw oplossing werkt niet wanneer je elementen die muis acties gebruiken boven op de onzichtbare button hebt staan omdat er dan delen van de onzichtbare button niet meer getriggerd worden door de muis. Wanneer je de elementen eronder zet werken die elementen niet meer op muis acties omdat de muis dan alleen werkt op die onzichbare button. Al met al eigenlijk niet zo'n goede oplossing, no offence ;).

Fatty Owl
%Europe/Berlin %490 %2005, 12:45
ow ja daar heb je een punt :p