Object in current frame only - actionscript-3

I have a Player movieclip object being placed on frames, where an example player is, then making the example player invisible. But when it runs the player is placed where the example is in the first frame, instead of in each current frame.
parent class:
playerStartX = exPlayer.x;
playerStartY = exPlayer.y;
Is there a way to either look only at the example in the current frame or else to remove only the example in the current frame after it has already been "copied"?

Not sure, if I understood your question completely, but maybe you should use an event handler for the Event.ENTER_FRAME event. This event is dispatched in sync with the frame rate of your SWF. Your handler could look like this:
function enterFrameHandler(event:Event):void
{
playerStartX = exPlayer.x;
playerStartY = exPlayer.y;
}
Because I don't no enough about how you structured/organized your MovieClips on the stage, I cannot say where to add the handler. But somewhere you have to do:
addEventListener(Event.ENTER_FRAME, enterFrameHandler);

Related

How to use stage.addEventListener in as3?

I have used some stage.addEventListener in my project in as3 but I want those stage events only to work on a specific frame. can I put the stage on false or something? how can I avoid that when I click a button on the stage other things/objects doesn't start doing things because they are related to the stage.addEventListener, can someone help me?
If you want to do something on a particular frame, Use following code.
stage.addEventListener(Event.ENTER_FRAME, chkit);
function chkit(event:Event):void{
if (currentFrame == 90){
trace("Reached"); // whatever you want to be done on reaching particular frame
}
else{
//things that should be done when particular frame is not reached
}
}
In your function, you can check the frame, like:
if(currentFrame == 'SpecificFrame')
{
//codeHere
}
A better way would to be to remove the event with removeEventListener when changing frames.
However, all children are part of the stage, so you you cannot prevent Objects related to the stage not to be effected by the Event. You can, however, make an Object the same size as the stage below all other Objects (through code, swapChildren or setChildIndex).

Global Event Listener

Is there any way by which I can make my button work, no matter in which scene or frame it is.
Is there any way by which i can call that Event Listener to another frame for that particular instance?
for example:
I have a button home_btn, I want this button to work in all scenes, without changing it's instance name. I already added an Event listener in first scene, but it doesn't work,
In another frame or scene.
Below is the code.
home_btn.addEventListener(MouseEvent.CLICK, process_it);
function process_it(event:MouseEvent):void
{
nextFrame();
}
I don't know how to use dispatch event function for my button.
// This only works for that particular frame.
Since you're doing this in the timeline, if you put the home_btn.addEventListener(MouseEvent.CLICK, process_it);
on the first frame of your main timeline, it will be registered even if you change to a different frame.
You can keep the function in its existing frame as that should still be called.
The reason why this works as opposed to the code being on a different frame is because frame 1 is where your timeline will start and process all the display items and code needed during this frame. That is any function, variable, or listener you want active will be running and/or stored into memory at the start of the application since it will always start on frame 1 until specified otherwise. If you have the listener on a different frame then you will have to gotoAndStop() to that frame to add the listener ( otherwise you are specifying that you don't want to add the listener until your application is at the frame ). Adding a listener to a display object on frame 1 is contingent upon the display object also being on that frame.

how to set actionscript code to execute only once

Okay so I have a movieclip called a_mc, if you click the movieclip, it goes to frame 5, and then on frame 5 there is a button called close_btn where if you click the button, it goes back to frame 1 and it is supposed to make a_mc invisible. Here is the actionscript code for frame 1.
stop();
a_mc.addEventListener(MouseClick.CLICK, aClicked);
function aClicked(event:MouseEvent):void {
gotoAndStop(5);
}
and on frame 5, the actionscript code is
stop();
close_btn.addEventListener(MouseEvent.CLICK, closeCLicked);
function closeClicked(event:MouseEvent):void {
gotoAndStop(1);
a_mc.visible = false;
a_mc.removeEventListener(MouseEvent.CLICK, aClicked);
}
see, the problem is, in frame 5, I make a_mc invisible and remove the event listener and go back to frame 1 and on frame one, it always executes the actionscript code so it again creates the event listener and makes a_mc visible. Any idea on how to stop this from happening?
I tried putting the code from frame 1 into a package and then a class and then a constructer method but it is saying
"Syntax error: package is unexpected"
Could you put all the code that you want to execute once in frame 1? - don't call stop() and let it run to the next frame.
Then put the rest of your code in other key frames and don't use gotoAndStop(1) so frame 1 is only called once?
You can try not removing the event listener on a_mc in frame 5, and then in frame 1 check if the event listener is already present (a_mc.hasEventListener()) as a signal that frame 1 has already been shown. Not exactly a 'bets practices' solution, but it might work.
Unfortunately, depending on the actual conents of those clip, and what happens in other frames, it may be the problem you're having is a consequence of the way movieclip object works in flash. When a frame is changed, flash instantiates new objects on the stage (added in new frame), and removes the ones not needed anymore (depending on the contents, but generally it's true). The 'a_mc' object that you manipulate in frame 5 may not be the same 'a_mc' object that is on the stage when you go back to frame 1. It may have been deleted and reinstantiated in the meantime.
To avoid things like that, it would be a better solution to have controlling code in a class outside of the timeline of the animating clip, or at least to keep the state in a separate object. I work in Flash Builder so I can't help you with the details of such organization in Flash Pro (which I presume you're using), but you could probably have all code on the frame 1 of the main clip, and then put the other movieclips with buttons and stuff as children of the main clip. That way main clip can control the state, and know what to show when.

Removing Sounds Invoked within a MovieClip from main Time Line

I currently have a difficulty removing specific sounds from playing when I advance through the timeline on a particular project.
The user chooses a particular item on the timeline which will display a specific movieclip and will then play a specific sound on MOUSE_DOWN.
The eventListener for MOUSE_DOWN which exists as follows:
stage.addEventListener(MouseEvent.MOUSE_DOWN, sprayWater);
stage.addEventListener(MouseEvent.MOUSE_UP, stopWater);
function sprayWater(event:MouseEvent):void
{
waterarm.gotoAndStop(2);
trace("SPRAYING WATER");
}
function stopWater(event:MouseEvent):void
{
waterarm.water.gotoAndPlay("waterE");
}
on frame 2 of 'waterarm' is a movieclip called 'water' that contains an animation of water and the following code to start the water sound:
var sfxWater:sfxwater;
var waterChannel:SoundChannel;
sfxWater = new sfxwater;
waterChannel = sfxWater.play();
on the frame "waterE" an animation of the water disappearing exists and the code sfxWater.stop();.
When the user progresses beyond this frame on the root timeline, the sound effect of water still remains on MOUSE_DOWN despite the movieclip no longer existing on the timeline at that point.
The ideal outcome will be the individual sound playing on MOUSE_DOWN and stopping on MOUSE_UP only when this movieclip is visible on the main timeline. If anybody can provide any assistance in being able to prevent the sound from playing and removing this event listener (through code on the main timeline if possible) it would be greatly appreciated.
Regards,
Darren
If stopping the sound is all that you want why not use SoundMixer.stopAll().
You can use it in the MOUSE_UP event after checking if the said movieclip's visible property.

stopping on the last frame (flash)

I want my movieclip to play once and stop on the last frame. I use the following code in the loop of my movieclip class. (this is as3)
if(currentFrame == 120)
stop();
120 is the last frame. It plays once. but the problem is it goes back to frame 1 again. is there a better method of stopping a movieclip on a particular frame.
If you want to do it with actionscript and not add a stop() to the last frame on the timeline manually, then you can use the undocumented addFrameScript() method.
mc.addFrameScript(mc.totalFrames - 1, function():void
{
mc.stop();
});
Can't remember the scope of the function, but you can either use mc.stop(), or just stop().
*EDIT - Added -1 to the first parameter of addFrameScript, because it is zero based (so to put a frameScript on frame 10 you would put 9).
On the timeline, you can just put a keyframe at the end, and add the stop(); method there. When it reaches that frame, the stop(); method will execute, and the clip will stop.
Assuming you are using the timeline that is, but sounds like you are.
Easiest way:
Just select the last Frame in the timeline. Open the Actions pane(F8). Ensure the frame u selected is still selected, if not then select again while the Actions pane is open.
After selecting, just add the simple stop() function in the the 'Action-Frame' pane.
//add the following line to the actions pane of the last frame.
stop();
You're done. You can optionally add a replay button if needed.
This seems more along the lines of what you're looking for:
addEventListener(Event.ENTER_FRAME, function(e:Event){
if(currentFrame == totalFrames){
stop();
removeEventListener(event.type, arguments.callee);
}
});
I added an event listener (for Actionscript 3) so on every frame this function will fire and check what frame it is on. If it's the last frame it will stop. Based on your example I'm presuming you have a class that's extending MovieClip.