gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash/server sprite_instance.cpp


From: Vitaly Alexeev
Subject: [Gnash-commit] gnash/server sprite_instance.cpp
Date: Tue, 22 Aug 2006 19:15:45 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Vitaly Alexeev <alexeev>        06/08/22 19:15:45

Modified files:
        server         : sprite_instance.cpp 

Log message:
        fixed goto_frame() bug (I hope :-))

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.37&r2=1.38

Patches:
Index: sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- sprite_instance.cpp 22 Aug 2006 01:00:22 -0000      1.37
+++ sprite_instance.cpp 22 Aug 2006 19:15:45 -0000      1.38
@@ -1469,8 +1469,15 @@
 {
 //     IF_VERBOSE_DEBUG(log_msg("sprite::goto_frame(%d)\n", 
target_frame_number));//xxxxx
 
-       target_frame_number = iclamp(target_frame_number, 0,
-                       m_def->get_frame_count() - 1);
+       //      target_frame_number = iclamp(target_frame_number, 0, 
m_def->get_frame_count() - 1);
+
+       // Macromedia Flash ignores goto_frame(bad_frame)
+       if (target_frame_number > m_def->get_frame_count() - 1 ||
+                       target_frame_number == m_current_frame) // to prevent 
infinitive recursion
+       {
+               set_play_state(STOP);
+               return;
+       }
 
        size_t loaded_frames = get_loaded_frames();
        if ( target_frame_number > loaded_frames )
@@ -1491,10 +1498,11 @@
                {
                        execute_frame_tags_reverse(f);
                }
-
+    m_action_list.resize(0);
                execute_frame_tags(target_frame_number, false);
                //we don't have the concept of a DisplayList update anymore
                //m_display_list.update();
+
        }
        else if (target_frame_number > m_current_frame)
        {
@@ -1503,6 +1511,7 @@
                        execute_frame_tags(f, true);
                }
 
+    m_action_list.resize(0);
                execute_frame_tags(target_frame_number, false);
                //we don't have the concept of a DisplayList update anymore
                //m_display_list.update();
@@ -1513,6 +1522,12 @@
 
        // goto_frame stops by default.
        set_play_state(STOP);
+
+       // After entering to advance_sprite() m_current_frame points to frame
+       // that already is executed. 
+       // Macromedia Flash do goto_frame then run actions from this frame.
+       // We do too.
+       do_actions();
 }
 
 bool sprite_instance::goto_labeled_frame(const char* label)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]