]> git.cworth.org Git - wordgame/commitdiff
Add letter scrambling animation to rack-fancy
authorCarl Worth <cworth@cworth.org>
Fri, 1 Dec 2006 07:58:10 +0000 (23:58 -0800)
committerCarl Worth <cworth@cworth.org>
Fri, 1 Dec 2006 07:58:10 +0000 (23:58 -0800)
Currently this is triggered by clicking on a letter. Should
switch this to use the spacebar instead soon.

rack-fancy.c

index 14c8d70fa8b55c3f0e47f4c13a3c2cc70b69cc78..9173abb30143579a73febd69a7a86603a5674246 100644 (file)
@@ -56,13 +56,64 @@ create_window (void)
     return scrolled_window;
 }
 
+#define MAX_LETTERS 7
+static GooCanvasItem *letter_items[MAX_LETTERS];
+static int num_letters;
+
+static int
+rand_within (int num_values)
+{
+    return (int) ((double) num_values * (rand() / (RAND_MAX + 1.0)));
+}
+
+static void
+shuffle (int *array, int length)
+{
+    int i, r, tmp;
+
+    for (i = 0; i < length; i++)
+    {
+       r = i + rand_within (length - i);
+       tmp = array[i];
+       array[i] = array[r];
+       array[r] = tmp;
+    }
+}
+
+#define LETTER_SIZE 60
+#define LETTER_PAD 5
+
+static void
+get_letter_position (int i, int *x, int *y)
+{
+    *x = 20 + i * (LETTER_SIZE + LETTER_PAD);
+    *y = 20;
+}
+
 static gboolean
 on_button_press (GooCanvasItem  *item,
                 GooCanvasItem  *target,
                 GdkEventButton *event,
                 gpointer        data)
 {
-    g_print ("demo item received button press event\n");
+    int indices[MAX_LETTERS];
+    int i, x, y;
+
+    for (i = 0; i < num_letters; i++)
+       indices[i] = i;
+
+    shuffle (indices, num_letters);
+
+    for (i = 0; i < num_letters; i++) {
+       get_letter_position (indices[i], &x, &y);
+       goo_canvas_item_animate (letter_items[i],
+                                x - GOO_DEMO_ITEM (letter_items[i])->x,
+                                y - GOO_DEMO_ITEM (letter_items[i])->y,
+                                1.0, 0,
+                                1000, 40,
+                                GOO_CANVAS_ANIMATE_FREEZE);
+    }
+
     return TRUE;
 }
 
@@ -70,10 +121,9 @@ static void
 create_canvas (GtkWidget *parent, char *word)
 {
     GtkWidget *canvas;
-    GooCanvasItem *root, *letter;
+    GooCanvasItem *root;
     int i;
-    int item_size = 60;
-    int item_pad = 5;
+    int x, y;
 
     canvas = goo_canvas_new ();
     gtk_widget_set_size_request (canvas, 400, 400);
@@ -83,16 +133,20 @@ create_canvas (GtkWidget *parent, char *word)
 
     root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
 
-    for (i = 0; i < strlen (word); i++) {
-       letter = goo_demo_item_new (root,
-                                   30 + i * (item_size + item_pad), 20,
-                                   item_size, item_size,
-                                   word[i],
-                                   NULL);
+    for (i = 0; i < MIN (MAX_LETTERS, strlen (word)); i++) {
+       get_letter_position (i, &x, &y);
+       letter_items[i] = goo_demo_item_new (root,
+                                            x, y,
+                                            LETTER_SIZE, LETTER_SIZE,
+                                            word[i],
+                                            NULL);
 
-       g_signal_connect (letter, "button_press_event",
+       g_signal_connect (letter_items[i], "button_press_event",
                          (GtkSignalFunc) on_button_press, NULL);
     }
+    num_letters = i;
+    while (i < MAX_LETTERS)
+       letter_items[i] = NULL; 
 }
 
 int