Problème Sim-city

Fermé
windsurfer16 Messages postés 3 Date d'inscription dimanche 28 décembre 2014 Statut Membre Dernière intervention 7 avril 2015 - Modifié par Lapourax le 7/04/2015 à 16:39
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.