#include #include #include #define bloc 1 #define other 2 #define true 1 #define false 0 extern bopti_image_t img_personnage; extern bopti_image_t img_personnagemarche; extern bopti_image_t img_personnagemarcheleft; extern bopti_image_t img_personnageleft; extern bopti_image_t img_personnage2; extern bopti_image_t img_personnage2left; extern bopti_image_t img_bloc; typedef int type; typedef int bool; struct object { bopti_image_t *img; int y; type typeObj; bool isStart; bool isFinish; int XrefAdd; struct object *next; }; struct object ListOfObjects[10] = { { &img_bloc, 55 , bloc , true, false, 16, &ListOfObjects[1] }, { &img_bloc, 55 , bloc , false, false,32, &ListOfObjects[2] }, { &img_bloc, 55 , bloc , false, false,48, &ListOfObjects[3] }, { &img_bloc, 55 , bloc , false, false,64, &ListOfObjects[4] }, { &img_bloc, 55 , bloc , false, false,80, &ListOfObjects[5] }, { &img_bloc, 55 , bloc , false, false,96, &ListOfObjects[6] }, { &img_bloc, 55 , bloc , false, false,112,&ListOfObjects[7] }, { &img_bloc, 55 , bloc , false, false,128,&ListOfObjects[8] }, { &img_bloc, 55 , bloc , false, false,144,&ListOfObjects[9] }, { &img_bloc, 55 , bloc , false, true, 160,&ListOfObjects[0] }, }; struct player { int x; int y; bool isWalkableTop; bool isWalkableBack; struct player *next; }; struct player Player1[1] = { { 64,31,true, true, &Player1[0] }, }; struct anim { bopti_image_t *img; int duration; struct anim *next; }; struct anim anim_idle[2] = { { &img_personnage, 40, &anim_idle[1] }, { &img_personnage2, 40, &anim_idle[0] }, }; struct anim anim_walk[2] = { { &img_personnagemarche, 3 , &anim_walk[1] }, { &img_personnage, 3, &anim_walk[0] }, }; struct anim anim_idle_left[2] = { { &img_personnageleft, 40, &anim_idle_left[1] }, { &img_personnage2left, 40, &anim_idle_left[0] }, }; struct anim anim_walk_left[2] = { { &img_personnagemarcheleft, 3, &anim_walk_left[1] }, { &img_personnageleft, 3, &anim_walk_left[0] }, }; int main(void) { struct anim *current_anim = &anim_idle[0]; int current_anim_time_left = 0; extern bopti_image_t img_personnage2left; extern bopti_image_t img_personnageleft; extern bopti_image_t img_personnagemarcheleft; extern bopti_image_t img_personnage; extern bopti_image_t img_personnagemarche; extern bopti_image_t img_personnage2; extern bopti_image_t img_bloc; int a = 0; int xref = 0; unsigned int i = 0; struct object *current_object = &ListOfObjects[0]; /* État du personnage : 0=arrêté, 1=marche */ int state = 0; /* État du personnage au frame précédent */ int previous_state = 0; struct player *current_player = &Player1[0]; while(a != 1) { /* Affichage */ dclear(C_WHITE); dimage(current_player->x,current_player->y, current_anim->img); for(i=0;i<=(sizeof(ListOfObjects) / sizeof(struct object));i++) { dimage(xref+current_object->XrefAdd, current_object->y, current_object->img); current_object = current_object->next; } dupdate(); current_object = &ListOfObjects[0]; /* Lecture des entrées ; si on n'appuie sur rien, state=0 */ clearevents(); state = 0; if(keydown(KEY_EXE)) a = 1; if(keydown(KEY_RIGHT)) state = 1; if(keydown(KEY_LEFT)) state = -1; /* Exécution des animations */ if((previous_state == 0 && state == 1) || (previous_state == -1 && state == 1)) { /* On vient de commencer à marcher */ current_anim = &anim_walk[0]; current_anim_time_left = current_anim->duration; } else if((previous_state == 1 && state == 0) || (previous_state == 1 && state == -1)) { /* On vient de s'arrêter */ current_anim = &anim_idle[0]; current_anim_time_left = current_anim->duration; } else if((previous_state == 0 && state == -1) || (previous_state == 1 && state == -1)) { current_anim = &anim_walk_left[0]; current_anim_time_left = current_anim->duration; } else if((previous_state == -1 && state == 0) || (previous_state == -1 && state == 1)) { current_anim = &anim_idle_left[0]; current_anim_time_left = current_anim->duration; } else { /* On continue l'anim précédente */ current_anim_time_left--; if(current_anim_time_left <= 0) { current_anim = current_anim->next; current_anim_time_left = current_anim->duration; } } /* Simulation du monde */ current_player->isWalkableTop = true; for(i=0;i<=(sizeof(ListOfObjects) / sizeof(struct object));i++) { if(current_player->x == xref+current_object->XrefAdd && current_object->isFinish == true) { current_player->isWalkableTop = false; } } if(state == 1) { if(current_player->isWalkableTop == true) { xref = xref-1; } } else if(state == -1) { xref = xref+1; } /* Délai */ sleep_us(25000); /* Préparation des invariants du frame suivant */ previous_state = state; } getkey(); return 1; }