[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/button_character_instanc...
From: |
Udo Giacomozzi |
Subject: |
[Gnash-commit] gnash ChangeLog server/button_character_instanc... |
Date: |
Wed, 07 Mar 2007 18:42:23 +0000 |
CVSROOT: /cvsroot/gnash
Module name: gnash
Changes by: Udo Giacomozzi <udog> 07/03/07 18:42:23
Modified files:
. : ChangeLog
server : button_character_instance.cpp
button_character_instance.h
Log message:
correct behaviour on button state change
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2568&r2=1.2569
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.cpp?cvsroot=gnash&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.h?cvsroot=gnash&r1=1.13&r2=1.14
Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/gnash/gnash/ChangeLog,v
retrieving revision 1.2568
retrieving revision 1.2569
diff -u -b -r1.2568 -r1.2569
--- ChangeLog 7 Mar 2007 17:34:23 -0000 1.2568
+++ ChangeLog 7 Mar 2007 18:42:22 -0000 1.2569
@@ -7,6 +7,9 @@
for unlink()
* server/sprite_instance.cpp: Make sure clear_invalidated() is called
for sprites which currently have an empty DisplayList
+ * server/button_character_instance.{h,cpp}: Implemented correct
behaviour
+ on button state change (invalidate only when needed, restart only
+ reappeared characters)
2007-03-06 Sandro Santilli <address@hidden>
Index: server/button_character_instance.cpp
===================================================================
RCS file: /cvsroot/gnash/gnash/server/button_character_instance.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- server/button_character_instance.cpp 28 Feb 2007 17:25:25 -0000
1.30
+++ server/button_character_instance.cpp 7 Mar 2007 18:42:23 -0000
1.31
@@ -482,11 +482,8 @@
break;
};
- if (new_state!=m_mouse_state) {
- set_invalidated();
- m_mouse_state=new_state;
- }
+ set_current_state(new_state);
// Button transition sounds.
if (m_def->m_sound != NULL)
@@ -536,6 +533,7 @@
}
}
+
// @@ eh, should just be a lookup table.
int c = 0;
if (event.m_id == event_id::ROLL_OVER) c |=
(button_action::IDLE_TO_OVER_UP);
@@ -549,7 +547,7 @@
//OVER_DOWN_TO_IDLE = 1 << 8,
// restart the characters of the new state.
- restart_characters(c);
+ //restart_characters(c); --> <Udo> done by set_current_state() now
// From: "ActionScript - The Definiteve Guide" by Colin Moock
// (chapter 10: Events and Event Handlers)
@@ -560,7 +558,7 @@
// Immediately execute all events actions (don't append to
// parent's action buffer for later execution!)
- {for (unsigned int i = 0; i < m_def->m_button_actions.size(); i++)
+ for (unsigned int i = 0; i < m_def->m_button_actions.size(); i++)
{
if (m_def->m_button_actions[i].m_conditions & c)
{
@@ -578,7 +576,7 @@
}
}
- }}
+ }
// check for built-in event handler.
as_value method;
@@ -596,6 +594,76 @@
// @@ TODO
}
+void
+button_character_instance::get_active_characters(std::vector<character*>& list)
+{
+ get_active_characters(list, m_mouse_state);
+}
+
+void
+button_character_instance::get_active_characters(std::vector<character*>& list,
+ e_mouse_state state)
+{
+ list.clear();
+
+ for (unsigned int i = 0; i < m_def->m_button_records.size(); i++)
+ {
+ button_record& rec = m_def->m_button_records[i];
+ if (m_record_character[i] == NULL)
+ {
+ continue;
+ }
+ if ((state == UP && rec.m_up)
+ || (state == DOWN && rec.m_down)
+ || (state == OVER && rec.m_over))
+ {
+ list.push_back(m_record_character[i].get());
+ }
+ } // for button record
+}
+
+void
+button_character_instance::set_current_state(e_mouse_state new_state)
+{
+ if (new_state == m_mouse_state)
+ return;
+
+ // save current "display list"
+ std::vector<character*> old_list;
+ get_active_characters(old_list, m_mouse_state);
+
+ // load new "display list"
+ // NOTE: We don't change state yet, so that set_invalidated() can
+ // load the current bounds first.
+ std::vector<character*> new_list;
+ get_active_characters(new_list, new_state);
+
+ // see if the two lists differ and restart characters if needed
+ if (new_list.size() != old_list.size())
+ set_invalidated(); // something changed
+
+ unsigned int old_count = old_list.size();
+ unsigned int new_count = new_list.size();
+ for (unsigned int i=0; i<new_count; i++) {
+
+ bool found=false;
+ for (unsigned int j=0; j<old_count; j++) {
+ if (new_list[i] == old_list[j]) {
+ found=true;
+ break;
+ }
+ }
+ if (!found) {
+ // character (re-)appeared on stage -> restart!
+ new_list[i]->restart();
+ set_invalidated();
+ }
+ }
+
+ // effectively change state
+ m_mouse_state=new_state;
+
+}
void
button_character_instance::restart_characters(int condition)
Index: server/button_character_instance.h
===================================================================
RCS file: /cvsroot/gnash/gnash/server/button_character_instance.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- server/button_character_instance.h 28 Feb 2007 17:25:25 -0000 1.13
+++ server/button_character_instance.h 7 Mar 2007 18:42:23 -0000 1.14
@@ -5,7 +5,7 @@
// SWF buttons. Mouse-sensitive update/display, actions, etc.
-/* $Id: button_character_instance.h,v 1.13 2007/02/28 17:25:25 udog Exp $ */
+/* $Id: button_character_instance.h,v 1.14 2007/03/07 18:42:23 udog Exp $ */
#ifndef GNASH_BUTTON_CHARACTER_INSTANCE_H
#define GNASH_BUTTON_CHARACTER_INSTANCE_H
@@ -77,6 +77,14 @@
void display();
+ void set_current_state(e_mouse_state new_state);
+
+ /// Returns all characters that are currently visible based on the
+ /// current button state. The "_visible" property does not matter here.
+ void get_active_characters(std::vector<character*>& list);
+ void get_active_characters(std::vector<character*>& list, e_mouse_state
state);
+
+
/// Combine the flags to avoid a conditional.
// It would be faster with a macro.
inline int transition(int a, int b) const
- [Gnash-commit] gnash ChangeLog server/button_character_instanc...,
Udo Giacomozzi <=