From b2c96f75c1bef082dff7f040edc9585f3e856a8e Mon Sep 17 00:00:00 2001 From: Antonio Carzaniga Date: Sun, 28 Jul 2019 15:03:27 +0200 Subject: [PATCH] keyboard-controlled gravity vector --- balls.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/balls.c b/balls.c index 95a026d..9a71616 100644 --- a/balls.c +++ b/balls.c @@ -138,6 +138,17 @@ static void update_state () { static GtkWidget * window; static cairo_t * cr = 0; +static void draw_gravity_vector() { + cairo_new_path(cr); + cairo_move_to(cr, width/2, height/2); + cairo_line_to(cr, width/2 + g_x, height/2 + g_y); + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_set_line_width(cr, 1.0); + cairo_stroke(cr); + cairo_arc(cr, width/2 + g_x, height/2 + g_y, 3, 0, 2*M_PI); + cairo_fill(cr); +} + static void draw_balls_onto_window () { if (!cr) cr = gdk_cairo_create(window->window); @@ -146,6 +157,8 @@ static void draw_balls_onto_window () { cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0); cairo_paint(cr); + draw_gravity_vector(); + /* draw balls */ for(int i = 0; i < n_balls; ++i) { cairo_set_source_rgb(cr, @@ -177,6 +190,23 @@ static gint keyboard_input (GtkWidget *widget, GdkEventKey *event) { if (event->type != GDK_KEY_PRESS) return FALSE; switch(event->keyval) { + case GDK_KEY_Up: + g_y -= 10; + break; + case GDK_KEY_Down: + g_y += 10; + break; + case GDK_KEY_Left: + g_x -= 10; + break; + case GDK_KEY_Right: + g_x += 10; + break; + case GDK_KEY_F: + case GDK_KEY_f: + g_x = rand() % 201 - 100; + g_y = rand() % 201 - 100; + break; case GDK_KEY_Q: case GDK_KEY_q: gtk_main_quit();