PDA

Volledige versie bekijken : mouseEvent in Class


FlashElements
%Europe/Berlin %666 %2005, 17:00
Beste Flashers,

Het betreft hier een Class waarin ik met een mouseEvent een functie aanroep.
Dit gaat echter niet helemaal goed:

Code ziet er zo uit:


class menu {

var currentMenu:String;
var thisClip:MovieClip;
var menuItem:Array = new Array();
private var mKleur:Number = 0x005094;


function menu(myClip:MovieClip) {
thisClip = myClip.createEmptyMovieClip('menuHolder', 2);
}

function menuInit(activeMenu:String) {
currentMenu = activeMenu;
}

function menuArray(menuArray:Array) {
for (var n = 0; n<menuArray.length; n++) {
menuItem[n] = menuArray[n].split("||");
}
}

function mc_menu(activeMenu:String):MovieClip {
return eval('mc_menu'+activeMenu);
}


function actions(item:MovieClip,pos:Number) {
item.mKleur = mKleur;
item.mX = mc_menu(currentMenu)._x;
item.mWidth = mc_menu(currentMenu)._width;
item.pos = pos;

item.onRollOver = function () {
drawBox(item.mX,item.pos*23,item.mWidth,20,0xFFFFF F,item.mKleur,20);
}
}

function makeMenuItems() {
for (var i=0; i<menuItem.length; i++) {
var item:MovieClip = thisClip.createEmptyMovieClip("mc_menuItem"+i,i);
item._y = 100;
setText(item,menuItem[i][0],i, mc_menu(currentMenu)._x, (i*23)+1, mc_menu(currentMenu)._width, 20, "left", false);
actions(item,i);
}
}


public function drawBox(item:MovieClip, x0:Number, y0:Number, width:Number, height:Number, borderColor:Number, fillColor:Number, tans:Number) {
item.lineStyle(1, borderColor, 100);
item.beginFill(fillColor, tans);
item.moveTo(x0, y0);
item.lineTo((x0+width), y0);
item.lineTo((x0+width), (y0+height));
item.lineTo((x0), (y0+height));
item.lineTo(x0, y0);
item.endFill();
}

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





Wat ik eigenlijk wil is dus in een [movieclip].onMouseOver een functie binnen de class aanroepen met alle variabelen die reeds in de class gezet zijn.

Iemand enige idee wat ik hier niet goed doe ?
De fout zit 'm sowiezo in de funktie actions() en dan met name in item.onRollOver

Bedankt al vast voor de moeite :)

FlashElements

Dauntless
%Europe/Berlin %685 %2005, 17:27
Try this:

class menu {

var currentMenu:String;
var thisClip:MovieClip;
var menuItem:Array = new Array();
private var mKleur:Number = 0x005094;


function menu(myClip:MovieClip) {
thisClip = myClip.createEmptyMovieClip('menuHolder', 2);
}

function menuInit(activeMenu:String) {
currentMenu = activeMenu;
}

function menuArray(menuArray:Array) {
for (var n = 0; n<menuArray.length; n++) {
menuItem[n] = menuArray[n].split("||");
}
}

function mc_menu(activeMenu:String):MovieClip {
return eval('mc_menu'+activeMenu);
}


function actions(item:MovieClip,pos:Number) {
item.mKleur = mKleur;
item.mX = mc_menu(currentMenu)._x;
item.mWidth = mc_menu(currentMenu)._width;
item.pos = pos;
item.lScope = this;

item.onRollOver = function () {
this.lScope.drawBox(item.mX,item.pos*23,item.mWidt h,20,0xFFFFFF,item.mKleur,20);
}
}

function makeMenuItems() {
for (var i=0; i<menuItem.length; i++) {
var item:MovieClip = thisClip.createEmptyMovieClip("mc_menuItem"+i,i);
item._y = 100;
setText(item,menuItem[i][0],i, mc_menu(currentMenu)._x, (i*23)+1, mc_menu(currentMenu)._width, 20, "left", false);
actions(item,i);
}
}


public function drawBox(item:MovieClip, x0:Number, y0:Number, width:Number, height:Number, borderColor:Number, fillColor:Number, tans:Number) {
item.lineStyle(1, borderColor, 100);
item.beginFill(fillColor, tans);
item.moveTo(x0, y0);
item.lineTo((x0+width), y0);
item.lineTo((x0+width), (y0+height));
item.lineTo((x0), (y0+height));
item.lineTo(x0, y0);
item.endFill();
}

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





Ook zou je public / private vars & methods moeten gebruiken ...

FlashElements
%Europe/Berlin %707 %2005, 17:59
Hmmm dit werkt niet Dauntless


item.lScope = this;
item.onRollOver = function () {
this.lScope.drawBox (items, .... etc.
}


Je kent nu aan z'n eigen instance z'n instance toe....
en in de Method drawbox wordt tevens de instance als property meegegeven.

Ook zou je public / private vars & methods moeten gebruiken ...
die komen er nog in :) heel goed ;)

Dauntless
%Europe/Berlin %717 %2005, 18:13
Nee, ik geef een referentie mee naar de class die dan vanuit de onRollOver van de movieclip aangesproken kan worden zodat hij de drawBox(); van de juiste classe instance vindt :p.

Daarnaast zie ik het niet direct... Kan je je .fla online zetten? :# Dat werkt wat aangenamer :).

FlashElements
%Europe/Berlin %722 %2005, 18:20
Nee, ik geef een referentie mee naar de class die dan vanuit de onRollOver van de movieclip aangesproken kan worden zodat hij de drawBox(); van de juiste classe instance vindt :p.

Daarnaast zie ik het niet direct... Kan je je .fla online zetten? :# Dat werkt wat aangenamer :).


Oooh ja sorry,

de van de html > http://www.flashelements.nl/menu/menu.html

en die van de FLA > http://www.flashelements.nl/menu/menu-1.zip

.... snap nog niet helemaal wat je bedoelt Dauntless ......maar dat komt zeker straks wel :)

Dauntless
%Europe/Berlin %728 %2005, 18:28
In je drawBox(); is het eerste argument een MovieClip... Die ben jij blijkbaar vergeten ?

En hij werkt ook zonder lScope, blijkbaar :).

FlashElements
%Europe/Berlin %765 %2005, 19:22
Hoi Dauntless, het werkt inderdaad nu....maar toch is het raar, want in eerste instantie werkte het niet..... en ik weet nu ook wel waarom, omdat ik in de class variabelen heb gedeclareerd, die probeerde ik in de onRollOver binnen te halen.
Schijnbaar kan dit dus niet zomaar en moet ik aan de instance de variabelen koppelen om die toch in de onRollOver binnen te halen. En dat is een beetje raar

bijvoorbeeld:


class menu {
var item:String = "hello world";

function eenfunctie() {
trace(item); // output hello world
eenmovieclip.newvar = item;
eenmovieclip.onRollOver = function() {
trace(item); // output undefined
trace(eenmovieclip.newvar); // output hello world
};
}
}



dus de var item moet ik eerst aan de instance koppelen is dit gebruikelijk ? :S

Dauntless
%Europe/Berlin %772 %2005, 19:32
En probeer es:


class menu {
var item:String = "hello world";

function eenfunctie() {
trace(item); // output hello world
eenmovieclip.lScope = this;
eenmovieclip.onRollOver = function() {
trace(this.lScope.item); // output undefined
};
}
}

Dat bedoelde ik juist :). Die 'lScope' staat voor localScope en die verwijst naar je classe instance :).

dus de var item moet ik eerst aan de instance koppelen is dit gebruikelijk ? :S[/QUOTE]

FlashElements
%Europe/Berlin %831 %2005, 20:57
Ah...... kwartje valt..... dat van die lScope wist ik dus niet.... nou weer iets geleerd vandaag..... bedankt maar weer Dauntless, je doet goede dingen op Flashfocus ;)
Kan ik weer verder met mijn menuutje .......

Dauntless
%Europe/Berlin %852 %2005, 21:28
Graag gedaan :). (AS 2.0 vragen zijn leeeuukk!)