Commit 8039eb85 authored by Yassine BAHOU's avatar Yassine BAHOU
Browse files

Ajout sdl a laby.c (texture+background)

parent 1f11c30f
......@@ -2,11 +2,158 @@
#include <stdio.h>
#include <time.h>
#include "laby.h"
#include "matrice.h"
#include <math.h>
#include <stdio.h>
#include <SDL2/SDL.h>
#include <string.h>
#include <SDL2/SDL_image.h>
#include <stdbool.h>
#define N 1
#define E 2
#define S 4
#define O 8
//gcc *.c -o Labyrinth -lSDL2 -lSDL2_gfx -lSDL2_image -lSDL2_ttf -lSDL2_mixer -lSDL2_net -lm
/*
La fonction loadImage doit charger une image et renvoyer la texture correspondante. Elle doit donc charger l’image dans une surface,
convertir cette surface en texture et renvoyer cette texture sans oublier de vérifier les retours des fonctions employées.
1- on crée une surface (type de données SDL1)
2- on charge l'image dans la SDL_Surface,
3- on transforme la surface en texture (type de données correspondant en SDL2)
*/
void end_sdl(char ok, // fin normale : ok = 0 ; anormale ok = 1
char const* msg, // message à afficher
SDL_Window* window, // fenêtre à fermer
SDL_Renderer* renderer) { // renderer à fermer
char msg_formated[255];
int l;
if (!ok) {
strncpy(msg_formated, msg, 250);
l = strlen(msg_formated);
strcpy(msg_formated + l, " : %s\n");
SDL_Log(msg_formated, SDL_GetError());
}
if (renderer != NULL) SDL_DestroyRenderer(renderer);
if (window != NULL) SDL_DestroyWindow(window);
SDL_Quit();
if (!ok) {
exit(EXIT_FAILURE);
}
}
SDL_Texture* load_texture_from_image(char * file_image_name, SDL_Window *window, SDL_Renderer *renderer )
{
SDL_Surface *my_image = NULL; // Variable de passage
SDL_Texture* my_texture = NULL; // La texture
my_image = IMG_Load(file_image_name); // Chargement de l'image dans la surface
// image=SDL_LoadBMP(file_image_name); fonction standard de la SDL,
// uniquement possible si l'image est au format bmp */
if (my_image == NULL) end_sdl(0, "Chargement de l'image impossible", window, renderer);
my_texture = SDL_CreateTextureFromSurface(renderer, my_image); // Chargement de l'image de la surface vers la texture
SDL_FreeSurface(my_image); // la SDL_Surface ne sert que comme élément transitoire
if (my_texture == NULL) end_sdl(0, "Echec de la transformation de la surface en texture", window, renderer);
return my_texture;
}
void play_with_texture_1(SDL_Texture *texture_back, SDL_Window *window,
SDL_Renderer *renderer) {
SDL_Rect
source = {0}, // Rectangle définissant la zone de la texture à récupérer
window_dimensions = {0}, // Rectangle définissant la fenêtre, on n'utilisera que largeur et hauteur
destination = {0}; // Rectangle définissant où la zone_source doit être déposée dans le renderer
SDL_GetWindowSize(
window, &window_dimensions.w,
&window_dimensions.h); // Récupération des dimensions de la fenêtre
SDL_QueryTexture(texture_back, NULL, NULL,
&source.w, &source.h); // Récupération des dimensions de l'image
destination = window_dimensions; // On fixe les dimensions de l'affichage à celles de la fenêtre
/* On veut afficher la texture de façon à ce que l'image occupe la totalité de la fenêtre */
SDL_RenderCopy(renderer, texture_back,
&source,
&destination);
// Création de l'élément à afficher
// Affichage
}
void play_with_texture_1_1(SDL_Texture *my_texture, SDL_Window *window,
SDL_Renderer *renderer)
{
SDL_Rect
source_image = {0}, // Rectangle définissant la zone de la texture à récupérer
window_dimensions = {0}, // Rectangle définissant la fenêtre, on n'utilisera que largeur et hauteur
destination = {0}; // Rectangle définissant où la zone_source_image doit être déposée dans le renderer
SDL_GetWindowSize(
window, &window_dimensions.w,
&window_dimensions.h); // Récupération des dimensions de la fenêtre
SDL_QueryTexture(my_texture, NULL, NULL,
&source_image.w, &source_image.h); // Récupération des dimensions de l'image
destination = window_dimensions; // On fixe les dimensions de l'affichage à celles de la fenêtre
/* On veut afficher la texture de façon à ce que l'image occupe la totalité de la fenêtre */
SDL_RenderCopy(renderer, my_texture,
&source_image,
&destination); // Création de l'élément à afficher
SDL_RenderPresent(renderer); // Affichage
}
// Affichage d'une texture sur la totalité de la fenêtre
void play_with_texture_2(SDL_Texture *my_texture,SDL_Texture *texture_back, SDL_Window *window,
SDL_Renderer *renderer,int** matrice,int taille)
{
SDL_Rect
source_image = {0}, // Rectangle définissant la zone de la texture à récupérer
window_dimensions = {0}, // Rectangle définissant la fenêtre, on n'utilisera que largeur et hauteur
destination = {0}; // Rectangle définissant où la zone_source_image doit être déposée dans le renderer
SDL_GetWindowSize(
window, &window_dimensions.w,
&window_dimensions.h); // Récupération des dimensions de la fenêtre
SDL_QueryTexture(my_texture, NULL, NULL,
&source_image.w, &source_image.h); // Récupération des dimensions de l'image
destination.h = 20;
destination.w = 20;
play_with_texture_1_1(texture_back,window,
renderer);
SDL_RenderPresent(renderer);
int i,j;
for (i=0;i<taille;i++){
for(j=0;j<taille;j++){
if (matrice[i][j]==1){
destination.x = i*20;
destination.y = j*20;
SDL_RenderCopy(renderer, my_texture,
&source_image,
&destination);
}
}
}
SDL_RenderPresent(renderer); // affichage
// Pause exprimée en ms
}
......@@ -338,7 +485,7 @@ graphe_t generation_grille(int taille){
return graphe;
}
int ** generer_matrice(int taille){
int ** matrice=malloc(taille*sizeof(int));
int ** matrice=malloc(taille*sizeof(int*));
for(int k=0;k<taille;k++){
matrice[k]=malloc(taille*sizeof(int));
for(int l=0;l<taille;l++){
......@@ -350,12 +497,15 @@ int ** generer_matrice(int taille){
int** graph_en_matrice(int taille){
graphe_t graphe= generation_grille(taille);
graphe = Ficher_yate(graphe);
graphe = Ficher_yate(graphe);
graphe = Ficher_yate(graphe);
graphe = kruskal(graphe);
int ligne,colonne;
int **matrice =generer_matrice(taille);
for(int k =0;k<=graphe.nombrearrete;k++){
colonne = (graphe.arrete[k].i)%taille;
ligne = (graphe.arrete[k].i)/taille;
if(colonne<taille && (graphe.arrete[k].i)+1==(graphe.arrete[k].j)){
matrice[ligne][colonne]-=E;
matrice[ligne][colonne+1]-=O;
......@@ -367,48 +517,110 @@ int** graph_en_matrice(int taille){
}
return matrice;
}
int** cree(int ligne,int colonne){
int ** matrice = NULL;
matrice = malloc(ligne*sizeof(int*));
int i = 0;
for(i=0;i<ligne;i++){
matrice[i]=malloc(colonne*sizeof(int));
}
return matrice;
}
void fill_matrix(int** matrice,int ligne,int colonne){
int i,j;
for (i=0;i<ligne;i++){
for(j=0;j<colonne;j++){
matrice[i][j]=0;
if(i==0 || j==0 || i ==(ligne-1) || j==(colonne-1)){
matrice[i][j]=1;
}
}
}
}
//matrice 1 si mure 0 sinon
int **matrice_a_dessiner(int** matrice,int taille){
int t = taille*2+1;
int ** final =cree(t,t);
int k ,l;
fill_matrix(final,t,t);
for(int i =0;i<taille;i++){
for(int j=0;j<taille;j++){
k = 2*i +1;
l = 2*j +1;
if(matrice[i][j] & E){
final[k][l+1]=1;
}
if(matrice[i][j] & S){
final[k+1][l]=1;
}
final[k+1][l+1]=1;
}
}
return final;
}
int main ()
{
int** matrice = graph_en_matrice(3);
AfficherGrille(matrice,3,3);
int taille = 20;
int** matrice = graph_en_matrice(taille);
int** final=matrice_a_dessiner(matrice,taille);
int t = taille*2+1;
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
return EXIT_FAILURE;
}
SDL_Texture * texture1 = NULL;
SDL_Texture * texture2 = NULL;
SDL_Window * pWindow;
SDL_Renderer * pRenderer;
pWindow = SDL_CreateWindow("Labyrinthe",SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, t*20, t*20, SDL_WINDOW_SHOWN);
if (pWindow == NULL)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
SDL_Quit();
return EXIT_FAILURE;
}
pRenderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED);
if (pRenderer == NULL)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
SDL_Quit();
return EXIT_FAILURE;
}
texture2=load_texture_from_image("mur.png",pWindow,pRenderer);
texture1=load_texture_from_image("Back.png",pWindow, pRenderer); /* creation de la texture qui contient l'image */
SDL_bool program_on = SDL_TRUE; // Booléen pour dire que le programme doit continuer
while (program_on){ // Voilà la boucle des évènements
SDL_Event event; // c'est le type IMPORTANT !!
play_with_texture_2(texture2,texture1, pWindow,
pRenderer,final,t);
while(program_on && SDL_WaitEvent(&event)){ // Tant que la file des évènements stockés n'est
// pas vide et qu'on n'a pas terminé le programme :
// Défiler l'élément en tête de file dans 'event'
switch(event.type){ // En fonction de la valeur du type de cet évènement
case SDL_QUIT : // Un évènement simple, on a cliqué sur la x de la fenêtre
program_on = SDL_FALSE; // Il est temps d'arrêter le programme
break;
default:
// L'évènement défilé ne nous intéresse pas
break;
}
}
// Affichages et calculs souvent ici
}
// graphe_t graphe;
// graphe=initialisationgraphe(5);
// graphe.nombrearrete=5;
// (graphe.arrete[0]).i=0;
// (graphe.arrete[0]).j=1;
// (graphe.arrete[1]).i=1;
// (graphe.arrete[1]).j=2;
// (graphe.arrete[2]).i=3;
// (graphe.arrete[2]).j=3;
// (graphe.arrete[3]).i=3;
// (graphe.arrete[3]).j=4;
// (graphe.arrete[4]).i=5;
// (graphe.arrete[4]).j=5;
// affichergraphe(graphe);
// partition_t partition1;
// partition_t partition2;
// graphe_t A;
// A=kruskal(graphe);
// affichergraphe(A);
// partition1=partitiondegraphe(A);
// Affichage_partition(partition1);
// arreter_partition(partition1);
// arreter_classe(partition1,0);
// arreter_classe(partition1,3);
SDL_DestroyRenderer(pRenderer);
SDL_DestroyWindow(pWindow);
SDL_Quit();
return EXIT_SUCCESS;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment