# HG changeset patch
# User wycc
# Date 1233681825 -28800
# Node ID e885dc875f306e107cee30cc80bf129dd9394211
# Parent 2e97e8082d83871baa90759107d7760877b6953b
Implement animation menu
diff -r 2e97e8082d83 -r e885dc875f30 examples/menu/list.svg
--- a/examples/menu/list.svg Sun Feb 01 16:28:28 2009 +0800
+++ b/examples/menu/list.svg Wed Feb 04 01:23:45 2009 +0800
@@ -31,7 +31,7 @@
inkscape:cx="375"
inkscape:cy="177.14286"
inkscape:document-units="px"
- inkscape:current-layer="lightbar"
+ inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1124"
inkscape:window-height="867"
@@ -40,12 +40,12 @@
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
@@ -61,147 +61,164 @@
current="1" />
+ id="layer1">
+ mbname="item1"
+ id="item1">
item1
+ mbname="item1text">item1
+ transform="translate(-0.4896719,34.661551)">
item1
+ mbname="item2text">item1
+ transform="translate(1.1837399,71.616487)">
item1
+ mbname="item3text">item1
+ transform="translate(0.6940599,106.27804)">
item1
+ mbname="item4text">item1
+ transform="translate(-0.8367057,141.52253)">
item1
+ mbname="item5text">item1
+ transform="translate(-1.3263777,176.18408)">
item1
+ mbname="item6text">item1
+ transform="translate(0.3470343,213.13901)">
item1
+ mbname="item7text">item1
+ transform="translate(-0.1426457,247.80057)">
item1
+ mbname="item8text">item1
+ mbname="lightbar">
+ id="rect2405"
+ style="opacity:0.3669725;fill:#0068d3;fill-opacity:1;stroke:#00d300;stroke-width:0.99680871;stroke-opacity:1" />
+
+
+ item1
diff -r 2e97e8082d83 -r e885dc875f30 examples/menu/main.c
--- a/examples/menu/main.c Sun Feb 01 16:28:28 2009 +0800
+++ b/examples/menu/main.c Wed Feb 04 01:23:45 2009 +0800
@@ -1,6 +1,14 @@
/*! \file
*
* This is the demo program for the animated menu. We will use to test the MBAF API.
+ * We need to have group item1-item9 in the SVG file. Initially, we will show
+ * item1-item8 only. When a up/down key is pressed, we will draw the next item in item9 and
+ * add two words to move item1-item9 smoothly. The first word move items to the 3/4 position
+ * fastly. The second will move it from 3/4 to the final position slowly to make retard effect.
+ *
+ * If we press another key before the second words finish, we will delete the word and replace
+ * it with a word to move it fastly to the final position and then we will repeat the procedure
+ * to add another two words to move it to the next position.
*/
#include
#include
@@ -29,6 +37,10 @@
"Item 18",
};
+int menus_y[10];
+int items[10];
+
+
typedef struct {
int top;
int cur;
@@ -42,38 +54,194 @@
int i;
MyAppData *data = MBAPP_DATA(myApp,MyAppData);
mb_sprite_t *sprite=myApp->rootsprite;
+ coord_t *textgroup;
shape_t *text;
coord_t *group;
coord_t *lightbar;
char name[255];
+ int tmp;
+ mb_timeval_t start, playing, now;
+ mb_progm_t *progm;
+ mb_word_t *word;
+
+ // fill new item
for(i=0;i<8;i++) {
- if (i+data->top > data->max) break;
- snprintf(name,sizeof(name),"item%dtext", i+1);
- text = (shape_t *) MB_SPRITE_GET_OBJ(sprite, name);
- if (text == NULL) {
- printf("Can not find object %s\n",name);
- continue;
- }
- sh_text_set_text(text,menus[i+data->top]);
- rdman_shape_changed(MBAPP_RDMAN(myApp), text);
+ snprintf(name, sizeof(name),"item%dtext", items[i]);
+ text = (shape_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ sh_text_set_text(text, menus[data->top+i]);
+ rdman_shape_changed(MBAPP_RDMAN(myApp),text);
}
- for(;i<8;i++) {
- snprintf(name,sizeof(name),"item%dtext", i+1);
- text = (shape_t *) MB_SPRITE_GET_OBJ(sprite, name);
- if (text == NULL) {
- printf("Can not find object %s\n",name);
- continue;
- }
- sh_text_set_text(text,"");
- rdman_shape_changed(MBAPP_RDMAN(myApp), text);
- }
+
+
+ snprintf(name, sizeof(name),"item%d", items[i]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ coord_hide(textgroup);
+ rdman_coord_changed(MBAPP_RDMAN(myApp),textgroup);
+
lightbar = (coord_t *) MB_SPRITE_GET_OBJ(sprite, "lightbar");
snprintf(name,sizeof(name),"item%d", data->cur+1);
group = (coord_t *) MB_SPRITE_GET_OBJ(sprite, name);
coord_x(lightbar) = coord_x(group);
coord_y(lightbar) = coord_y(group);
- rdman_coord_changed(MBAPP_RDMAN(myApp), lightbar);
+ rdman_redraw_changed(MBAPP_RDMAN(myApp));
+}
+
+static void fillMenuContentUp()
+{
+ int i;
+ MyAppData *data = MBAPP_DATA(myApp,MyAppData);
+ mb_sprite_t *sprite=myApp->rootsprite;
+ coord_t *textgroup;
+ shape_t *text;
+ coord_t *group;
+ coord_t *lightbar;
+ char name[255];
+ int tmp;
+ mb_timeval_t start, playing, now;
+ mb_progm_t *progm;
+ mb_word_t *word;
+
+
+ // fill new item
+ snprintf(name, sizeof(name),"item%dtext", items[8]);
+ text = (shape_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ sh_text_set_text(text, menus[data->top]);
+
+ progm = mb_progm_new(2, MBAPP_RDMAN(myApp));
+ MB_TIMEVAL_SET(&start, 0, 0);
+ MB_TIMEVAL_SET(&playing, 0, 300000);
+ word = mb_progm_next_word(progm, &start, &playing);
+ get_now(&now);
+
+ for(i=0;i<7;i++) {
+ //shift to the next item
+ snprintf(name, sizeof(name),"item%d", items[i]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ mb_shift_new(0,menus_y[i+1]-coord_y(textgroup), textgroup,word);
+ }
+ // fade out the item[7]
+ snprintf(name, sizeof(name),"item%d", items[7]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ mb_shift_new(0,100, textgroup,word);
+ mb_visibility_new(VIS_HIDDEN, textgroup,word);
+
+ // fade in the item[8]
+ snprintf(name, sizeof(name),"item%d", items[8]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ snprintf(name,sizeof(name),"item%d", items[0]);
+ group = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ coord_y(textgroup) = menus_y[0]-100;
+ coord_show(textgroup);
+ mb_shift_new(0,100, textgroup,word);
+
+ lightbar = (coord_t *) MB_SPRITE_GET_OBJ(sprite, "lightbar");
+ mb_shift_new(0,menus_y[data->cur]-coord_y(lightbar),lightbar,word);
+
+ MB_TIMEVAL_SET(&start, 0, 300000);
+ MB_TIMEVAL_SET(&playing, 0, 0);
+ word = mb_progm_next_word(progm, &start, &playing);
+ snprintf(name, sizeof(name),"item%d", items[8]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ mb_visibility_new(VIS_VISIBLE, textgroup,word);
+
+ mb_progm_free_completed(progm);
+ mb_progm_start(progm, X_MB_tman(MBAPP_RDMAN(myApp)->rt), &now);
+ rdman_redraw_changed(MBAPP_RDMAN(myApp));
+ tmp = items[8];
+ for(i=8;i>0;i--) {
+ items[i] = items[i-1];
+ }
+ items[0] = tmp;
+}
+static void fillMenuContentDown()
+{
+ int i;
+ MyAppData *data = MBAPP_DATA(myApp,MyAppData);
+ mb_sprite_t *sprite=myApp->rootsprite;
+ coord_t *textgroup;
+ shape_t *text;
+ coord_t *group;
+ coord_t *lightbar;
+ char name[255];
+ int tmp;
+ mb_timeval_t start, playing, now;
+ mb_progm_t *progm;
+ mb_word_t *word;
+
+
+ // fill new item
+ snprintf(name, sizeof(name),"item%dtext", items[8]);
+ text = (shape_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ sh_text_set_text(text, menus[data->top+7]);
+
+ progm = mb_progm_new(2, MBAPP_RDMAN(myApp));
+ MB_TIMEVAL_SET(&start, 0, 0);
+ MB_TIMEVAL_SET(&playing, 0, 300000);
+ word = mb_progm_next_word(progm, &start, &playing);
+ get_now(&now);
+
+ for(i=1;i<8;i++) {
+ //shift to the next item
+ snprintf(name, sizeof(name),"item%d", items[i]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ mb_shift_new(0,menus_y[i-1]-coord_y(textgroup), textgroup,word);
+ }
+ // fade out the item[0]
+ snprintf(name, sizeof(name),"item%d", items[0]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ mb_shift_new(0,-100, textgroup,word);
+
+ // fade in the item[8]
+ snprintf(name, sizeof(name),"item%d", items[8]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ coord_y(textgroup) = menus_y[7]+100;
+ coord_show(textgroup);
+ mb_shift_new(0,-100, textgroup,word);
+
+ lightbar = (coord_t *) MB_SPRITE_GET_OBJ(sprite, "lightbar");
+ mb_shift_new(0,menus_y[data->cur]-coord_y(lightbar),lightbar,word);
+
+ MB_TIMEVAL_SET(&start, 0, 300001);
+ MB_TIMEVAL_SET(&playing, 0, 0);
+ word = mb_progm_next_word(progm, &start, &playing);
+ snprintf(name, sizeof(name),"item%d", items[0]);
+ textgroup = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ mb_visibility_new(VIS_VISIBLE, textgroup,word);
+
+ mb_progm_free_completed(progm);
+ mb_progm_start(progm, X_MB_tman(MBAPP_RDMAN(myApp)->rt), &now);
+ rdman_redraw_changed(MBAPP_RDMAN(myApp));
+ tmp = items[0];
+ for(i=0;i<8;i++) {
+ items[i] = items[i+1];
+ }
+ items[8] = tmp;
+}
+
+MoveLightBar()
+{
+ mb_sprite_t *sprite=myApp->rootsprite;
+ MyAppData *data = MBAPP_DATA(myApp,MyAppData);
+ mb_timeval_t start, playing, now;
+ mb_progm_t *progm;
+ mb_word_t *word;
+ coord_t *group;
+ coord_t *lightbar;
+ char name[255];
+
+ progm = mb_progm_new(1, MBAPP_RDMAN(myApp));
+ MB_TIMEVAL_SET(&start, 0, 0);
+ MB_TIMEVAL_SET(&playing, 0, 200000);
+ word = mb_progm_next_word(progm, &start, &playing);
+ get_now(&now);
+
+ lightbar = (coord_t *) MB_SPRITE_GET_OBJ(sprite, "lightbar");
+ snprintf(name,sizeof(name),"item%d", items[data->cur]);
+ group = (coord_t *) MB_SPRITE_GET_OBJ(sprite, name);
+ mb_shift_new(coord_x(group)-coord_x(lightbar),coord_y(group)-coord_y(lightbar),lightbar,word);
+ mb_progm_free_completed(progm);
+ mb_progm_start(progm, X_MB_tman(MBAPP_RDMAN(myApp)->rt), &now);
rdman_redraw_changed(MBAPP_RDMAN(myApp));
}
@@ -81,38 +249,42 @@
{
MyAppData *data = MBAPP_DATA(myApp,MyAppData);
- if (data->cur > 5)
+ if (data->cur > 5) {
data->cur--;
- else {
+ MoveLightBar();
+ } else {
if (data->top > 0) {
data->top--;
+ fillMenuContentUp();
} else {
if (data->cur == 0)
return;
data->cur--;
+ MoveLightBar();
}
}
- fillMenuContent();
}
void menu_down()
{
MyAppData *data = MBAPP_DATA(myApp,MyAppData);
- if (data->cur < 5) {
- if (data->top+data->cur <= data->max)
+ if (data->cur < 4) {
+ if (data->top+data->cur <= data->max) {
data->cur++;
+ MoveLightBar();
+ }
} else {
if ((data->top+8) < data->max) {
data->top++;
+ fillMenuContentDown();
} else {
- if (data->cur+data->top < data->max-1)
+ if (data->cur+data->top < data->max-1) {
data->cur++;
- else
+ MoveLightBar();
+ } else
return;
}
- printf("top=%d\n",data->top);
}
- fillMenuContent();
}
void menu_select()
{
@@ -154,10 +326,20 @@
{
MyAppData *data = MBAPP_DATA(myApp,MyAppData);
subject_t *key = MBAPP_keySubject(myApp);
+ char name[255];
+ coord_t *l;
+ int i;
+ mb_sprite_t *sprite=myApp->rootsprite;
data->top = 0;
data->cur = 0;
data->max = sizeof(menus)/sizeof(int)-1;
+ for(i=0;i<9;i++) {
+ items[i] = i+1;
+ snprintf(name,255,"item%d", i+1);
+ l = (coord_t *) MB_SPRITE_GET_OBJ(sprite,name);
+ menus_y[i] = coord_y(l);
+ }
fillMenuContent();
subject_add_observer(key, keyHandler,NULL);