Gra w chińczyka. GTK+ dołączanie event box'a do tabeli. C++

0

Witam.

Piszę grę w chińczyka w C++ z użyciem Gtk+, problem polega na tym, że nie działa zbijanie pionków, wszystkie pionki trzymam w tabeli odpowiednio ustawione, poruszają się one po planszy wszystko ładnie działa, można powiedzieć, że gra skończona oprócz właśnie tego bicia, ogólnie mam już je zaimplementowane, tylko że mam sygnał do event box'a z obrazkiem, button_press_event i w funkcji callback, którą przekazuje do g_signal_connect mogę dołączać do tabeli tylko, event box'a, którego podałem w argumencie, chodzi tu o funkcje "gtk_table_attach_defaults", przykładowo klinąłem na event box z numerem 1, więc w funkcji callback do tego event box'a mogę zrobić gtk_table_attach_defaults(tabela, event_box_1...), ale jeśli chciałbym w funckji callback dać gtk_table_attach_defaults(tabela, event_box_2...) to nie zadziała, wyrzuci błąd:
Gtk-CRITICAL : gtk_table_attach: assertion 'GTK_IS_WIDGET <child>' failed podczas zbijania pionka.
Analogicznie jeśli klinąłem na event box z numerem 2, to w callback nie będę mógł zrobić gtk_table_attach_defaults(tabela, event_box_1...)
Postaram się to pokazać praktycznie:

Najpierw dodaje obrazki do event box'ów, a potem event box do tabeli, wszystko śmiga

struct MY
{
GtkWidget *event_box[2];
GtkWidget *tabela;
};
int main(int argc....)
{
MY my;
GtkWidget *obrazek[2];
obrazek[0] = gtk_image_new_from_file("cos1.png");
obrazek[1] = gtk_image_new_from_file("cos2.png");
my.event_box[0] = gtk_event_box_new();
my.event_box[1] = gtk_event_box_new();
gtk_container_add(GTK_CONTAINER(event_box[0]), obrazek[0]);
gtk_container_add(GTK_CONTAINER(event_box[1]), obrazek[1]);
gtk_table_attach_defaults(GTK_TABLE(my.tabela), my.event_box[0], 1, 2, 1, 2); // tabela jest 13x13
gtk_table_attach_defaults(GTK_TABLE(my.tabela), my.event_box[1], 2, 3, 2, 3);
...
...

No i mam swoje event boxy w tabeli.
Ogólnie
Teraz robię callback po kliknięciu w event_box[0]

...
...
g_signal_connect(G_OBJECT(event_box[0]), "button_press_event", G_CALLBACK(CallBack), &my);
g_signal_connect(G_OBJECT(event_box[1]), "button_press_event", G_CALLBACK(CallBack), &my);

A to funkcja callback, jest ona wspólna dla obu event box'ów

void CallBack(GtkWidget *event_box, GdkEventButton *event, struct MY my)
{
gtk_container_remove(GTK_CONTAINER(my.tabela), my.event_box[0]); //Najpierw usuwam, żeby potem zaczepić, typowe dla zbijania pionków, muszę usunąć z mapy i włożyć pionka do bazy
gtk_table_attach_defaults(GTK_TABLE(my.tabela), my.event_box[0], 5, 6, 5, 6); // Wykona się jeśli klinąłem na event_box[0], wyświetli błąd, który podałem wyżej, jeśli klinie się event_box[1]

gtk_container_remove(GTK_CONTAINER(my.tabela), my.event_box[1]); //Najpierw usuwam, żeby potem zaczepić, typowe dla zbijania pionków, muszę usunąć z mapy i włożyć pionka do bazy
gtk_table_attach_defaults(GTK_TABLE(my.tabela), my.event_box[1], 7, 8, 7, 8); // Wykona się jeśli klinąłem na event_box[1], wyświetli błąd, który podałem wyżej, jeśli klinie się event_box[0]

}

Pomoc baaardzo mile widziane, za dużo godzin siedzę już nad naprawą tego błędu.

Tutaj znalazłem podobny temat, ale bez odpowiedzi:
http://4programmers.net/Forum/C_i_C++/117977-GTK_-_zmiana_pozycji_elementu_w_tabeli

0

po pierwsze nie korzystaj z tablic. skorzystaj z vectorow. Usuwanie dodawanie do tablicy jest meczace. W vectorze jest to zautomatyzowane (jezeli bedziesz robic to czesto [usuwac ze srodka] uzyj std::list)

1 użytkowników online, w tym zalogowanych: 0, gości: 1