Bonsoir,
Je ne suis pas sur de demander l'aide au bon endroit m'enfin, je dois coder un Tetris en C en utilisant GTK+ (version 2.0).
La version de base "marche" mais j'ai un soucis pour lequel je ne trouve pas de solution convenable. Pour l'instant la piece tombe de ligne en ligne a un rythme donné. Quand elle ne peux plus descendre, sa position final est validé et une autre piece repars.
Le probleme etant que l'etape de "la validation de la piece" dur le temps d'une boucle (le meme temps que met la piece a descendre d'une ligne). Or j'aimerais pouvoir deplacer ma piece à droite ou à gauche plus longtemps avant de passer à la piece suivante.
J'utilise g_timeout_add() pour appeller la fonction qui fait descendre la piece a intervalle regulier. Comme premiere solution pour mon probleme, j'avais pensé à creer un second timeout quand la piece arrive en bout de course, appelé une seul fois, et pour lequel la fonction arrete le premier timer (celui qui fait descendre les piece). Puis lorsque ce second timer arrive a son terme, appelle une fonction qui crée une nouvelle piece et relance l'animation. Le probleme etant que je me reretrouve coincé, car lorsqu'une piece se retrouve en bout de course, la fonction lance forcement la fin du tour, or il se peut qu'en deplaçant ma piece à droite ou à gauche ensuite, elle puisse continuer à descendre, or ici elle ne le fera pas (ou alors elle descendra le temps que le timeout finisse puis s'arretera à ce moment, ce qui peut amener la piece à s'arreter simplement dans le vide.
Les fonctions dont je parle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 gboolean on_timeout2(gpointer data){ Gui *g = gui_check (data); //Info * info = g->info; next_step_piece(data); area_redraw(g->area); return TRUE; } gboolean on_timeout3(gpointer data){ //Gui *g = gui_check (data); Gui * g = data; Info * info = g->info; info_anim_stop(info); return FALSE; } void info_anim_start(gpointer data){ Gui * g = data; Info * info = g->info; if(info->timeout1 == 0 || info->timeout2 == 0){ info->timeout1 = g_timeout_add(TIMEOUT1, on_timeout1, data); info->timeout2 = g_timeout_add(TIMEOUT2, on_timeout2, data); } } void info_anim_stop(Info * info){ if(!info->timeout1 || !info->timeout2) return; g_source_remove(info->timeout1); info->timeout1 = 0; g_source_remove(info->timeout2); info->timeout2 = 0; } void choose_new_piece(gpointer data){ Gui * g = data; Info * info = g->info; g_source_remove(info->timeout3); info->action = 1; int piece = rand()%7; switch(piece){ case 0 : create_tetramino_I(&info->piece); break; case 1 : create_tetramino_S(&info->piece); break; case 2 : create_tetramino_Z(&info->piece); break; case 3 : create_tetramino_J(&info->piece); break; case 4 : create_tetramino_L(&info->piece); break; case 5 : create_tetramino_T(&info->piece); break; case 6 : create_tetramino_O(&info->piece); break; default : printf("erreur piece non valide\n"); break; } info->piece.colonne = PIECE_STARTING_COLUMN; info->piece.ligne = PIECE_STARTING_LINE; printf("je suis coincé ? \n"); info_anim_start(data); check_grid(info); } void next_step_piece(gpointer data){ Gui * g = data; Info * info = g->info; Piece * piece = &info->piece; Grid * grid = &info->grid; area_redraw(g->area); if(piece_can_move_down(info) == 0){ check_grid(info); if(info->action == 1){ info->action = 0; info->timeout3 = g_timeout_add_full(-50,5*TIMEOUT2, on_timeout3, data, choose_new_piece); } return; } set_piece_in_grid(info,FALSE); piece->ligne++; set_piece_in_grid(info,TRUE); }
Partager