Bonjour à tous,
Je poste ce message pour vous faire part du problème que je rencontre depuis le début mon projet de coder le jeu SIM-city. Quand nous lançons notre jeu et plaçons des éléments sur la grille, le jeu plante au bout d'un certain nombre aléatoire d'ajout d'élements. Le problème existait déja lorsque nous ne pouvions juste placer de la route sur le quadrillage (version ci-dessous). Je traîne ce problème depuis bien trop longtemps et au stade ou il m'empeche d'avancer. Je tiens à vous préciser que notre programme fontionne parfaitement sous xp et linux mais qu'il est impossible d'éviter le plantage sur windows 7 et 8. Je pense qu'il s'agit d'une fuite mémoire mais malgré de nombreuses recherches et essais il m'est impossible de la localiser. Pourriez vous m'aider à la trouver ?
module jeu
#include <stdio.h>
#include <stdlib.h>
#include "compalleg.h"
#include "jeu.h"
void display_menu_play(BITMAP *menu_play, BITMAP *buffer)
{
///Tant que le curseur est situé dans la zone "play" et que l'on ne clique pas ou que l'on n'appuie pas sur "echap"
while((mouse_x>=100)&&(mouse_x<=400)&&(mouse_y>=470)&&(mouse_y<=550)&&(!key[KEY_ESC])&&(!(mouse_b&1)))
{
///Afficher le menu avec "play" en surbrillance
blit(menu_play,buffer,0,0,0,0,FENETRE_LARGEUR,FENETRE_HAUTEUR);
blit(buffer, screen,0,0,0,0, FENETRE_LARGEUR, FENETRE_HAUTEUR);
}
}
void destruction_bitmap(BITMAP *menu, BITMAP *buffer, BITMAP *menu_play, BITMAP *menu_options, BITMAP *menu_quit, BITMAP *route, BITMAP *surbrillance, t_coordonnees *position, t_coordonnees *coin_gauche, t_coordonnees *coin_droit)
{
destroy_bitmap(menu);
destroy_bitmap(buffer);
destroy_bitmap(menu_play);
destroy_bitmap(menu_options);
destroy_bitmap(menu_quit);
destroy_bitmap(route);
destroy_bitmap(surbrillance);
free(position);
free(coin_gauche);
free(coin_droit);
}
void Initialisation_terrain(BITMAP *buffer, t_coordonnees *position, int couleur)
{
int i;
int j;
///On remplit le buffer en gris
clear_to_color(buffer, makecol(210,210,210));
///Pour i allant de 0 à la hauteur du terrain soit 700 px
for (i=0; i<HAUTEUR_GRILLE; i++)
{
///Pour j allant de 0 à la largeur du terrain soit 900 px
for (j=0; j<LARGEUR_GRILLE; j++)
{
///On définit les coordonnés du coin gauche ou l'on dessine le carré
position->x=j*LARGEUR_GRILLE_PX/45;
position->y=i*FENETRE_HAUTEUR/35;
///On dessine le carré de 20x20 px sur le buffer en fuschia
rect(buffer,position->x,position->y,position->x+LARGEUR_GRILLE_PX/45,position->y+FENETRE_HAUTEUR/35,couleur);
}
}
}
void boucle_de_jeu(BITMAP *buffer, BITMAP *route, BITMAP *surbrillance, t_coordonnees *coin_gauche, t_coordonnees *coin_droit, t_coordonnees *position)
{
int test;
///Tant que l'on n'appuie pas sur "R"
while((!key[KEY_R]))
{
///Afficher le buffer à l'écran
//masked_blit(curseur, buffer, 0, 0, mouse_x, mouse_y, FENETRE_LARGEUR, FENETRE_HAUTEUR);
blit(buffer, screen,0,0,0,0, FENETRE_LARGEUR, FENETRE_HAUTEUR);
if ((mouse_b&1))
{
///Obtenir la couleur du pixel sélectionné par le curseur
getpixel(buffer,mouse_x,mouse_y);
///Si la couleur obtenue est grise et que le curseur est dans les limites du terrain (700x900 px)
if ((getpixel(buffer,mouse_x,mouse_y)==makecol(210,210,210))&&(mouse_x<900)&&(mouse_y<700))
{
///Obtention des coordonnees du coin gauche et du coin droit de la case sélectionnée par le clic
coin_gauche->x=(mouse_x/20)*20;
coin_gauche->y=(mouse_y/20)*20;
coin_droit->x=(mouse_x/20)*20+20;
coin_droit->y=(mouse_y/20)*20+20;
test=1;
}
/// Si le curseur n'est pas bien dans une case mais sur le quadrillage du terrain (la grille) ou qu'il est en dehors du terrain
else if (((mouse_x%20)==0)|((mouse_y%20)==0)|(mouse_x>=900)|(mouse_y>=700))
{
///On met toutes les valeurs à 0
coin_gauche->x=0;
coin_gauche->y=0;
coin_droit->x=0;
coin_droit->y=0;
test=0;
}
//else return;
}
///Si la valeur de test est à 1, afficher la route sur la case sélectionnée
if(test==1)
blit(route,buffer, 0, 0, coin_gauche->x,coin_gauche->y, FENETRE_LARGEUR, FENETRE_HAUTEUR);
}
}
void display_menu_options(BITMAP *menu_options, BITMAP *buffer)
{
///Tant que le curseur est dans la zone "options" et que l'on n'appuie pas sur "echap"
while((mouse_x>=270)&&(mouse_x<=750)&&(mouse_y>=580)&&(mouse_y<=665)&&(!key[KEY_ESC]))
{
///Afficher le menu avec "options" en surbrillance
blit(menu_options,buffer,0,0,0,0,FENETRE_LARGEUR,FENETRE_HAUTEUR);
blit(buffer, screen,0,0,0,0, FENETRE_LARGEUR, FENETRE_HAUTEUR);
}
}
void display_menu_quit(BITMAP *menu, BITMAP *buffer, BITMAP *menu_play, BITMAP *menu_options, BITMAP *menu_quit, BITMAP *route, BITMAP *surbrillance, t_coordonnees *position, t_coordonnees *coin_gauche, t_coordonnees *coin_droit)
{
///Tant que le curseur est dans la zone "quit" et que l'on n'appuie pas sur "echap"
while((mouse_x>=635)&&(mouse_x<=915)&&(mouse_y>=460)&&(mouse_y<=555)&&(!key[KEY_ESC]))
{
///Afficher le menu avec "quit" en surbrillance
blit(menu_quit,buffer,0,0,0,0,FENETRE_LARGEUR,FENETRE_HAUTEUR);
blit(buffer, screen,0,0,0,0, FENETRE_LARGEUR, FENETRE_HAUTEUR);
///Si on clique sur "quit"
if (mouse_b&1)
{
/// libérer les bitmaps et les pointeurs puis quitter
destruction_bitmap(menu, buffer, menu_play, menu_options, menu_quit, route, surbrillance, position, coin_gauche, coin_droit);
allegro_exit();
exit(EXIT_FAILURE);
}
}
}
void display_menu(BITMAP *menu, BITMAP *buffer, BITMAP *menu_play, BITMAP *menu_options, BITMAP *menu_quit, BITMAP *route, BITMAP *surbrillance, t_coordonnees *position, t_coordonnees *coin_gauche, t_coordonnees *coin_droit, int couleur)
{
///Tant que l'on n'appuie pas sur "echap"
while (!key[KEY_ESC])
{
///Afficher le menu sur le buffer et le buffer sur l'écran
blit(menu,buffer,0,0,0,0,FENETRE_LARGEUR,FENETRE_HAUTEUR);
blit(buffer, screen,0,0,0,0, FENETRE_LARGEUR, FENETRE_HAUTEUR);
///Si l'on appuie sur "J"
if((key[KEY_J]))
{
///Dessiner le terrain de jeu et lancer la boucle de jeu
Initialisation_terrain(buffer ,position, couleur);
boucle_de_jeu(buffer , route, surbrillance, coin_gauche, coin_droit, position);
}
///Si le curseur est dans la zone "play"
if((mouse_x>=100)&&(mouse_x<=400)&&(mouse_y>=470)&&(mouse_y<=550))
{
///Afficher le menu avec "play" en surbrillance
display_menu_play(menu_play, buffer);
///Si on clique
if(mouse_b&1)
{
///Dessiner le terrain de jeu et lancer la boucle de jeu
Initialisation_terrain(buffer, position, couleur);
boucle_de_jeu(buffer, route, surbrillance, coin_gauche, coin_droit, position);
}
/*stop_sample(sample);
play_sample(sample1,255,0,1000,0);
test=boucle_de_jeu(menu1,rules,menu_collision,wallpaper,game_over_menu,buffer, scroll_map, game_map, bird_image, scie, engrenage_1, engrenage_2, bird, bonus, circle_radius,scroll, wallpaper_scroll, scroll_speed, initial_scroll_speed, nb_players, angle,boleen,sample1,game_niveau,big_circle_radius,small_circle_radius,initial_circle_radius);
return test;*/
}
///Si le curseur se situe dans la zone "quit"
else if((mouse_x>=635)&&(mouse_x<=915)&&(mouse_y>=460)&&(mouse_y<=555))
{
///Afficher le menu avec "quit" en surbrillance
display_menu_quit(menu, buffer, menu_play, menu_options, menu_quit, route, surbrillance, position, coin_gauche, coin_droit);
}
///Si le curseur est dans la zone "options"
else if((mouse_x>=270)&&(mouse_x<=750)&&(mouse_y>=580)&&(mouse_y<=665))
{
///Afficher le menu avec "options" en surbrillance
display_menu_options(menu_options, buffer);
}
//rest(10);
}
/// Si on appuie sur "echap", libérer les map et les pointeurs
if(key[KEY_ESC])
destruction_bitmap(menu, buffer, menu_play, menu_options, menu_quit, route, surbrillance, position, coin_gauche, coin_droit);
}
module jeu.h
#ifndef JEU_H_INCLUDED
#define JEU_H_INCLUDED
#include "compalleg.h"
typedef struct coordonnees
{
int x;
int y;
} t_coordonnees;
///Procédure qui affiche le menu avec "play" en surbrillance
void display_menu_play(BITMAP *menu_play, BITMAP *buffer);
///Procédure qui dessine le terrain de jeu de 35 lignes par 45 colonnes sur le buffer
void Initialisation_terrain(BITMAP *buffer, t_coordonnees *position, int couleur);
///Procédure qui lance l'affichage du terrain et le jeu
void boucle_de_jeu(BITMAP *buffer, BITMAP *route,BITMAP *surbrillance, t_coordonnees *coin_gauche, t_coordonnees *coin_droit, t_coordonnees *position);
///Procédure qui affiche le menu avec "options" en surbrillance
void display_menu_options(BITMAP *menu_options, BITMAP *buffer);
///Procédure qui affiche le menu avec "quit" en surbrillance
void display_menu_quit(BITMAP *menu, BITMAP *buffer, BITMAP *menu_play, BITMAP *menu_options, BITMAP *menu_quit, BITMAP *route,BITMAP *surbrillance, t_coordonnees *position, t_coordonnees *coin_gauche, t_coordonnees *coin_droit);
///Procédure qui affiche le menu
void display_menu(BITMAP *menu, BITMAP *buffer, BITMAP *menu_play, BITMAP *menu_options, BITMAP *menu_quit, BITMAP *route,BITMAP *surbrillance, t_coordonnees *position, t_coordonnees *coin_gauche, t_coordonnees *coin_droit, int couleur);
///Procédure qui détruit les bitmaps et les pointeurs
void destruction_bitmap(BITMAP *menu, BITMAP *buffer, BITMAP *menu_play, BITMAP *menu_options, BITMAP *menu_quit, BITMAP *route, BITMAP *surbrillance, t_coordonnees *position, t_coordonnees *coin_gauche, t_coordonnees *coin_droit);
#endif // JEU_H_INCLUDED
module main
#include <stdio.h>
#include <stdlib.h>
#include "compalleg.h"
#include "bitmap.h"
#include "jeu.h"
int main()
{
t_coordonnees position;
position.x=0;
position.y=0;
t_coordonnees coin_gauche;
t_coordonnees coin_droit;
coin_droit.x=0;
coin_droit.y=0;
coin_gauche.x=0;
coin_gauche.y=0;
int couleur;
BITMAP *buffer;
BITMAP *menu;
BITMAP *menu_play;
BITMAP *menu_options;
BITMAP *menu_quit;
BITMAP *route;
BITMAP *curseur;
BITMAP *surbrillance;
initialiser_allegro();
buffer=create_bitmap(FENETRE_LARGEUR,FENETRE_HAUTEUR);
couleur=makecol(255,0,255);
chargements_bitmap(&menu, &menu_play, &menu_options, &menu_quit, &route, &curseur, &surbrillance);
display_menu(menu,buffer,menu_play,menu_options,menu_quit,route,surbrillance, &coin_gauche,&coin_droit,&position, couleur);
return 0;
}
END_OF_MAIN();
Je charge les bitmap dans un autre module et la gestion d'allegro et également fait dans un module à part.
Afficher la suite