static struct { /* 移動時のフラグ詰め合わせ */ int r_key; /* 右に移動するフラグ */ int l_key; /* 左に移動するフラグ */ int u_key; /* 上に移動するフラグ */ int d_key; /* 下に移動するフラグ */ } sg_keys = {0,0,0,0}; /* スプライトを動かす */ static gint move_sprite(gpointer data) { anime_pack *anime = (anime_pack *)data; //sg_keys = data; gint x = anime->x, y = anime->y; gint dx = anime->dx, dy = anime->dy; if(sg_keys.r_key==1) { /* 右キーフラグが立っていたら */ dx = 5; }else if(sg_keys.r_key==0 && sg_keys.l_key==0){ dx = 0; } if(sg_keys.l_key==1) { /* 左キーフラグが立っていたら */ dx = -5; }else if(sg_keys.r_key==0 && sg_keys.l_key==0){ dx = 0; } if(sg_keys.u_key==1) { /* 上キーフラグが立っていたら */ dy = -5; }else if(sg_keys.u_key==0 && sg_keys.d_key==0){ dy = 0; } if(sg_keys.d_key==1) { /* 下キーフラグが立っていたら */ dy = 5; }else if(sg_keys.u_key==0 && sg_keys.d_key==0){ dy = 0; } /* スプライトの座標を更新 */ x += dx; y += dy; /* 端まで行ったら止まる */ if(x < 0) { x = 0; dx = 0; } if(y < 0) { y = 0; dy = 0; } if(x >= WIDTH - anime->s_width) { x = WIDTH - anime->s_width; dx = 0; } if(y >= HEIGHT - anime->s_height) { y = HEIGHT - anime->s_height; dy = 0; } anime->x = x; anime->y = y; anime->dx = dx; anime->dy = dy; draw_animation(anime); return TRUE; } static gint cb_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data) { /* 押されたキーの判定 */ switch(event->keyval) { case GDK_Left: /* 左キーフラグを立てる */ sg_keys.l_key=1; break; case GDK_Down: /* 下キーフラグを立てる */ sg_keys.d_key=1; break; case GDK_Up: /* 上キーフラグを立てる */ sg_keys.u_key=1; break; case GDK_Right: /* 右キーフラグを立てる */ sg_keys.r_key=1; break; default: break; } move_sprite(data); return TRUE; } static gint cb_key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer data) { /*キーを離した時の判定 */ switch(event->keyval) { case GDK_Left: sg_keys.l_key=0; break; case GDK_Down: sg_keys.d_key=0; break; case GDK_Up: sg_keys.u_key=0; break; case GDK_Right: sg_keys.r_key=0; break; default: break; } move_sprite(data); return TRUE; } GtkWidget * my_animation_ball(GtkWidget *window, gboolean trans) { g_signal_connect(G_OBJECT(drawing_area), "expose_event", G_CALLBACK(cb_expose_event), (gpointer)anime); g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(cb_key_press_event), (gpointer)anime); g_signal_connect(G_OBJECT(window), "key_release_event", G_CALLBACK(cb_key_release_event), (gpointer)anime); }