ソフトウェア設計及び演習用の班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