-
Stopping a MC's internal animation with a global Pause
Hello all,
I have recently added a pause function to a game I am working on and it almost completely works. My only problem is that movie clips continue their own animations. Does anyone know the simplest way I can get this to stop?
The code I have so far, which doesn't work properly, is below. paused is self explanatory but its also worht noting that this code is associated with the enemy movie clip that is in the library, which is then being exported to attached instances of it. The problem I have noticed is that this._currentframe is always tracing as "1" even when the clip is clearly in the middle of its animation. Any help would be much appreciated. Thank you!
code:
if (_root.paused == false) {
this.gotoAndPlay(this._currentframe);
} else {
this.gotoAndStop(this._currentframe);
}
-
how about
Code:
if (_root.paused == false) {
play();
} else {
stop();
}
-
This doesn't work; it does the same thing as my previous attempt. That being when i hit the pause button, the clip finishes its current animation, then stops, and when unpaused it does not resume, it stays at frame 1 of its animation. Any ideas? Thank you in advance.
-
can you show us the fla?
that would help
-
383,890,620 polygons
well, it would work if you pasted the code to *every* frame ...
script is always executed on the frame of it is written.
you could place it in an onEnterFrame event, though.
(and play() and stop() is enough, too)
nGFX
-
Script kiddie
Or you could just make it so that instead of setting a 'paused' variable to 'true', and making all the movie clips wait to react to it at all times, just use this:
for (var i in _root) {
_root[i].stop();
}
This script loops through all the children of the main timeline and tells them to stop playing.
Making them play again would be done like this:
for (var i in _root) {
if (!_root[i].stopped) {
_root[i].play();
}
}
The reason I added the "if it's not stopped" condition is that some things might not have meant to be played. For instance, if you told something to stop playing BEFORE pausing, unpausing would still make it play again. To fix this problem, do this:
Whenever you have a stop(); script on one of the frames of your movie clips, add this line after it:
stopped = true;
This means that if you pause and unpause, something that was originally under a stop(); action will remain so.
I used this method of pausing in Commando 2. Of course, since a lot of the movie clips also had nested movie clips in them, I had to tweak it a little. I also had to stop the movement scripts running. But it still worked perfectly.
-
It depends on the way you make your game. For example, I have a player MC with all other MCs in it as different frames which have different animations. I name there instances as 'current_mc' and in my main player mc the code is:-
code:
onEnterFrame = function()
if(_global.paused == false)
{
current_mc.play();
}
else
{
current_mc.stop();
}
}
Hope that helps a bit.
edit: spell check
-
Vengeance, that code is awesome. I had no clue you could do that. Even though I didn't ask the question, I want to thank you for the info. I'm using an adaptation of that code, and it works perfect.
-
Script kiddie
=D I knew it would help someone.
-
wow, thanks for the huge amount of response guys, I'll let you know if i get it working
-
Vengeance the code works wonderfully except for my nested movie clips, which still animate... how did you modify the code to work in this case, if you don't mind my asking. Thank you
-
Script kiddie
Well, the easiest way is just to write down all the instance names of all the nested mcs you have, and modify the script accordingly, like so:
for (var i in _root) {
mc = _root[i];
mc.stop();
mc.thrusters.stop();
mc.turret.stop();
mc.muzzleFlash.stop();
}
So if the loop finds anything nested in any of those movie clips with an instance name of 'thrusters', 'turret', or 'muzzleFlash', it'll tell those to stop as well.
for (var i in _root) {
mc = _root[i];
if (!mc.stopped) {
mc.play();
}
if (!mc.thrusters.stopped) {
mc.thrusters.play();
}
if (!mc.turret.stopped) {
mc.turret.play();
}
if (!mc.muzzleFlash.stopped) {
mc.muzzleFlash.play();
}
}
That's the script you'd use to unpause them, too. Remember, if you have any frames inside the nested mcs with a stop(); script on them, you need to set their 'stopped' variable to true, as with last time.
-
Untitled-1.fla
If you want to pause all movie clips, including nested ones, you can use a recursive function that iterates through all movie clips and pauses them (when a movie clip is found it is stopped, and then all its children are stopped and so on...).
Code:
function stopAllMovies(instance) {
instance.stop();
for (var n in instance) {
if (typeof(instance[n]) == "movieclip") {
arguments.callee(instance[n]);
}
}
}
stopAllMovies(_root);
-
Wow guys, great idea using the recursion, hadn't even occured to me! All this pausing discussion has made me think of a couple of more questions:
1) how do you pause a sound clip (like background music) so that when you unpause it resumes exactly where it left off and not restart from the beginning.
2) if you wanted to have a game with a menu (say regular game code on main timeline frame 1 and menu on frame 2 etc) what is the best way to implement the code for that. I imagine it is related to this pause discussion because in a sense when you hit the menu button, you want all the game action to "pause" and control to pass over to the menu scene, and vice versa. Any help you could offer would be much appreciated. Thank you so much guys!!
-
Script kiddie
Use this to start playing the music in the first place:
_root.mySound = new Sound();
_root.mySound.attachSound("music");
_root.mySound.start(null, 10000);
// If it's not playing, try 0 instead of null in the previous line of script...
Use this to pause it:
_root.pausePos = _root.mySound.position;
stopAllSounds();
// If you just want to stop the music, use _root.mySound.stop(); instead.
// If you only want it to be quiter, use _root.mySound.setVolume(50);
// Change the parameter '50' to be a number between 0 and 100, depending on how loud you want it to be.
Use this to unpause it:
_root.pausePos /= 1000;
_root.mySound.start(_root.pausePos, 1000);
// If this doesn't work, put this script below line 1: _root.pausePos = int(_root.pausePos);
Well, if any of that didn't work, it's because all of that was a complete guess.
-
Works like a charm Vengeance! Now, if you can answer my menu question, then you will officially be the man. Officially
-
Oh, I detected a slight problem with the music restart code, Vengeance. Its the line " _root.mySound.start(_root.pausePos, 1000);" what this does is restart the music at the right place, but each time it loops after that its starting forrm that offset, which isn't correct. I am currently trying methods of getting around this using getTimer()... but i haven't quite got it yet. If you have any ideas please let me know. Thanks!
P.S.
I have tried some things to the effect of:
code:
onClipEvent (enterFrame) {
if (getTimer() >= _root.musicResetTimer + (_root.standardBG.duration - _root.musicPausePosition) && _root.restartMusic == true) {
_root.standardBG.start(0, 10000);
_root.restartMusic = false;
}
}
where musicResetTimer is the time the pause button was pressed. This handles the case after the first restart occurs in the manner specified above. This doesn't seem to work properly though, it restarts, but always too late. I'm sure I am missing something...but i'm too tired to see it....any thoughts?
Last edited by Scotopia; 08-23-2005 at 10:58 PM.
-
Script kiddie
How about using this to unpause it:
_root.mySound.start(0, 1000);
_root.mySound.position = _root.pausePos;
This should work, unless the Sound object's position property is read-only. If it doesn't work, try this:
_root.pausePos /= 1000;
_root.mySound.start(_root.pausePos, 0);
_root.mySound.onSoundComplete = function() {
_root.mySound.start(0, 10000);
_root.mySound.onSoundComplete = null;
};
:P
-
ism
Originally Posted by strille
If you want to pause all movie clips, including nested ones, you can use a recursive function that iterates through all movie clips and pauses them (when a movie clip is found it is stopped, and then all its children are stopped and so on...).
Code:
function stopAllMovies(instance) {
instance.stop();
for (var n in instance) {
if (typeof(instance[n]) == "movieclip") {
arguments.callee(instance[n]);
}
}
}
stopAllMovies(_root);
hey strille how come you use "arguments.callee(instance[n])" and not "stopAllMovies(instance[n]);". just wonderin
Graphics Attract, Motion Engages, Gameplay Addicts
XP Pro | P4 2.8Ghz | 2Gb | 80Gb,40Gb | 128Mb DDR ATI Radeon 9800 Pro
-
Untitled-1.fla
No reason really... Other than it works for anonymous recursive functions as well. It also underlines that the function is recursive, so I think it's more readable and clear exactly what it is doing.
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
|