-
Expert - Changing movie frame (gotoAndPlay) in a for loop using a counter
I'm having some difficulties using counters. Specifically related to using the gotoAndPlay (or Stop) command within a 'for' loop. This does not relate to the layers of attached movie clips but the counter of the for loop 'i'.
Below is an example of code that works. Imagine a movie clip called 'Card' that is added to the main Movie using a for loop with instance names Card0, Card1, Card2, ... etc. Within the movie clip 'Card' there are variables which can be set using a pre-defined array. The variable is called Var1 and is accessed using the code "Card0.Var1" in the case that i=0.
for(i=0;i<NCards;i++){
this.attachMovie( "Card", "Card"+i, Layer );
Layer++;
set ("Card"+i+".Var1",Value[i]);
}
Now imaging there's a movie clip within 'Card' with the instance name "Image". To change the frame of that movie clip you would simply use the following code:
Card0.Image.gotoAndStop(3);
The code that I cannot make work looks a little like either of the following 2 codes below:
for(i=0;i<NCards;i++){
"Card"+i+".Image".gotoAndStop(3);
}
or
setProperty("Card"+i+".Image",_currentframe,3);
Basically it seems that the gotoAndStop function doesnt get on with concatenated text (added together text). Any help would be much appreciated!
-
.
Hi,
try it like this
PHP Code:
var NCards:Number = 12;
for (var i:Number = 0; i < NCards; i++)
{
var Card:MovieClip = this.attachMovie("Card", "Card" + i, i);
Card._x = 40;
Card._y = i * 25;
Card.Var = Value[i];
Card.Image.gotoAndStop(3);
}
-
Hi fruitbeard,
Thanks for your reply. I like the idea of using a variable to carry the information about the value of i within the for loop. Sadly I cant get the code working. I've tried the simplest position of _x or _y and cant get the value passed. I've notice that when I define a variable type it usually turns blue. This is the case with Number, String, Object, etc. But this does not happen with MovieClip or any variation with capitals (movieclip, movieClip, Movieclip). Perhaps my version of ActionScipt or Flash is not the same as yours?
Just to check that we're both on the same page. This code is going on the main timeline. Not sure if that would change anything.
-
.
Hi,
yes it would help if we knew what version we are using,
Here is a file CS5, AS2, see if it helps at all,
here is the code if you are unable to open it,
with a MovieClip with AS linkage of "Card" and a MovieClip inside called "Image", with three stop frames.
Like you already have I imagine.
PHP Code:
var nCards:Number = 12; var cardArray:Array = new Array();
for (var i:Number = 0; i < nCards; i++) { var card:Object = this.attachMovie("Card", "card" + i, i); card._x = 40 + (i * (card._width + 2)); card._y = 10; card.vars = i; card.Image.gotoAndStop(3); card.onPress = turnCard; card.onRelease = reTurnCard; cardArray.push(card); }
function turnCard() { trace(this._name + " \t| _x = " + this._x + " \t| _y = " + this._y + " \t| var = " + this.vars); this.Image.gotoAndStop(2); }
function reTurnCard() { this.Image.gotoAndStop(3); }
// *** Not used here, but can be used to turn all, etc etc..... function allCards(arg:Number) { for (var j:Number = 0; j < cardArray.length; j++) { cardArray[j].Image.gotoAndStop(arg); } }
obviously I am guessing at how you get your nCards number and things as we can not see your *.fla, which makes things a lot easier.
i notice the title now, Flash5!!
Last edited by fruitbeard; 10-03-2014 at 08:24 AM.
-
So I've actually found a bit of a work around. Without over complicating my explanation with the specific details of my Movie, it goes along the following lines:
The code for changing the 'Image' movie clip was placed in the Card movie timeline rather than on the Main timeline. This means I could use Temp3 = targetPath (this).charAt(13) to identify the local value of the card
if (_root.CardA[Temp3][5]=="E"){
this.Gems.gotoAndStop(5);
It basically means that rather than the Main timeline trying to change the frame of the 'Card' movie clip, I get the 'Card' movie clip itself to change its own frame. I still ran into some difficulties that I couldn't fully solve but its good enough for what I need. If I come up with anything extra then I'll let you know.
-
I've just had a revelation! Ever heard of the 'eval' statement?
Layer=0;
Card = new Array();
for(i=0;i<4;i++){
Card[i] = new Array();
for(j=0;j<13;j++){
//Create an array of unique card names. Note: This only works when i is a single digit! Or you would have to think more carefully about creating the array.
Card[i][j] = "Card"+i+j;
this.attachMovie( "Card", Card[i][j], Layer );
Layer++;
//SetProperty method is fine evaluating the value of Card[i][j], but .gotoAndStop is not!
setProperty(Card[i][j],_x,60*i+25);
setProperty(Card[i][j],_y,80*j+37.5);
//Here we use the eval method to obtain the value held in the array. It now works!
eval(Card[i][j]).CardM.gotoAndStop(2);
//Passing the values of i & j to the card itself can be very useful!
Card[i][j].CardM.Var1=i;
Card[i][j].CardM.Var2=j;
}
}
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|