Browse Source

GUI : déplacement manuel de pions fini, il ne manque plus si on veut que l'animation de retour optionnelle pour les déplacements insensés.

master
Nikos 8 years ago
parent
commit
c46073daa0
2 changed files with 39 additions and 14 deletions
  1. +25
    -9
      gui.c
  2. +14
    -5
      guidemo.c

+ 25
- 9
gui.c View File

@ -274,6 +274,7 @@ int display_usermove_pawn(const struct gui_resource_t *res, const struct game_st
null_die(move, "ヌルポ。。。ガ! (move)");
null_die(move, "ヌルポ。。。ガ! (moremoves)");
/* positions en pixels des emplacements des pions */
struct pawns_pxcoords_t pawns_pxcoords = calc_pawns_pxcoords( ((((double)currentplayer)-1)*M_PI)/3 );
SDL_Event event;
@ -298,44 +299,59 @@ int display_usermove_pawn(const struct gui_resource_t *res, const struct game_st
}
if(quit)
break;
/* si c'est le dernier mouvement de mon tour, clic droit */
if(event.button.button == SDL_BUTTON_RIGHT)
return *moremoves = 0;
/* tentons de trouver un index de pion aux coordonnées du clic enfoncé */
move->startPos = find_pawn_index(event.button.x, event.button.y, &pawns_pxcoords);
if (move->startPos == -1 || gamestate->board[move->startPos] == none) /* si clic en dehors d'un emplacement de pion ou pas de pion dedans */
continue; /* l'utilisateur a cliqué n'importe où, on recommence au début */
/* mise en buffer du fond pour performances */
SDL_Surface *bgbufferdrag = SDL_ConvertSurface(res->bgnd_img, res->bgnd_img->format, res->bgnd_img->flags);
struct game_state_t tmp_gamestate = *gamestate; /* copie du plateau */
tmp_gamestate.board[move->startPos] = none; /* on enlève le pion en déplacement */
draw_all(res, &tmp_gamestate, bgbufferdrag, ((((double)currentplayer)-1)*M_PI)/3, 1/*antialias*/, NULL); /* dessin du plateau sans pion en buffer */
/* attente de la fin de glisser-déposer */
int release = 0;
while(!quit && !release){
while(SDL_WaitEvent(&event)) {
if(event.type == SDL_MOUSEBUTTONDOWN) {
if(event.type == SDL_MOUSEBUTTONUP) {
release = 1;
break;
} else if(event.type == SDL_QUIT) {
quit = 1;
break;
} else if(event.type == SDL_MOUSEMOTION) {
/* rendu du plateau avec le pion flottant à la position de la souris */
SDL_BlitSurface(bgbufferdrag, NULL, res->screen, NULL); /* copie du fond, rendu en cache */
SDL_Rect pawn_clip = {event.motion.x - PAWNSIZE/2, event.motion.y - PAWNSIZE/2, 0, 0};
SDL_BlitSurface(res->pawn_img[gamestate->board[move->startPos]], NULL, res->screen, &pawn_clip); /* rendu du pion par-dessus */
SDL_Flip(res->screen);
}
}
//render_board gamestate sans le pion, blit le pion par-dessus dans res->screen à la position curseur (x_mouse - w/2, y_mouse - h/2 ) // ptet seulement s'il a bougé, éco proc (résolu par waitevent !!)
}
SDL_FreeSurface(bgbufferdrag); /* libération du buffer */
if(quit)
break;
/* tentons de trouver un index de pion aux coordonnées du relâchement du clic */
move->endPos = find_pawn_index(event.button.x, event.button.y, &pawns_pxcoords);
if (move->startPos == -1) {
if (move->endPos == -1) {
// animation de retour du pion à startPos/ (au pixel, obligé) TODO
continue;
} else if(gamestate->board[move->endPos] != none /**/&& move->endPos != move->startPos/* à virer si bouton fini TODO*/) {
} else if(gamestate->board[move->endPos] != none) {
/* animation de retour */
display_animove_pawn(res, *gamestate, currentplayer, move->endPos, move->startPos); //ou au pixel TODO
//display_animove_pawn(res, *gamestate, currentplayer, move->endPos, move->startPos); ce serait mieux au pixel TODO
continue;
}
//rendu ici le mouvement est OK, on affiche le résultat ?
break; // rendu ici le mouvement est OK, on sort
/* rendu ici, le mouvement est plausible (un pion vers une case vide), on sort */
break;
}
*moremoves = (move->endPos == move->startPos); // TODO un bouton "j'ai fini" ?
/* ce n'est pas le dernier mouvement de mon tour */
*moremoves = 1;
return quit;
}


+ 14
- 5
guidemo.c View File

@ -73,18 +73,27 @@ int main(void) {
n++;
}
}
struct move_t user_move;
int moremoves;
if(player1 == 1) {
if( display_animsg(&gui_res, &gamestate, player1, "Your turn!", 1200/*ms*/) ) {
quit = 1;
break;
}
if( display_usermove_pawn(&gui_res, &gamestate, player1, &user_move) ) {
quit = 1;
do {
display_animsg(&gui_res, &gamestate, player1, "Move a pawn or right-click", 1200/*ms*/);
if( display_usermove_pawn(&gui_res, &gamestate, player1, &user_move, &moremoves) ) {
quit = 1;
break;
}
if(moremoves) {
gamestate.board[user_move.endPos] = gamestate.board[user_move.startPos];
gamestate.board[user_move.startPos] = none;
}
} while(moremoves);
if(quit)
break;
}
gamestate.board[user_move.endPos] = gamestate.board[user_move.startPos];
gamestate.board[user_move.startPos] = none;
if( display_animsg(&gui_res, &gamestate, player1, "You’ve done your move!", 1200/*ms*/) ) {
quit = 1;
break;


Loading…
Cancel
Save