ソフトウェア設計及び演習用の班Wiki

玉移動

#include <gtk/gtk.h>

#define W_WIDTH 350 //ウインドウの横幅

#define W_HEIGHT 500 //ウインドウの縦幅

static gboolean cb_expose_event(GtkWidget *widget,

GdkEventExpose *event,

gpointer data)

{

cairo_t *cr;

cr = gdk_cairo_create(widget->window);

//ボールに関する変数

static gint t_x = W_WIDTH/2; //ボールのx座標

static gint t_y = W_HEIGHT/2; //ボールのy座標

static gdouble radius = 20.0; //ボールの半径

static gint d_x = 1; //ボールの進む向きのx方向

static gint d_y = 1; //ボールの進む向きのy方向

static gint speed = 3; //ボールの進む速さ

//ウインドウの端でボールを跳ね返す

if(t_x+radius > W_WIDTH || t_x-radius < 0) d_x *= -1;

if(t_y+radius > W_HEIGHT || t_y-radius < 0) d_y *= -1;

t_x += d_x*speed;

t_y += d_y*speed;

//図形の位置を指定する

cairo_translate(cr, t_x, t_y);

//ボールを描画する

cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);

cairo_arc(cr, 0.0, 0.0, radius, 0.0, 2.0*3.14);

cairo_fill(cr);

cairo_destroy(cr);

return FALSE;

}

static gboolean ivent_loop(GtkWidget *widget)

{

if (widget->window == NULL)

{

return FALSE;

}

gtk_widget_queue_draw(widget);

return (TRUE);

}

int main(int argc, char *argv[])

{

GtkWidget *window;

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window), "block");

gtk_widget_set_size_request(window, W_WIDTH, W_HEIGHT);

gtk_widget_set_app_paintable(window, TRUE);

gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);

g_signal_connect(G_OBJECT(window), "expose-event",

G_CALLBACK(cb_expose_event), NULL);

g_signal_connect(window, "destroy",

G_CALLBACK(gtk_main_quit), NULL);

g_timeout_add(10, (GSourceFunc)ivent_loop, window);

gtk_widget_show_all(window);

gtk_main();

return 0;

}


最終更新日:2013/10/24 14:07:44