IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Gros problème de gestion de collisions [C et SDL]


Sujet :

Développement 2D, 3D et Jeux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut Gros problème de gestion de collisions [C et SDL]
    Bonjour, je développe en ce moment un logiciel avec le langage de programmation C et la librairie SDL. Voilà un screen qui va vous imager mon programme (j'ai pris ce screen hier avant l'implémentation de la gestion de collisions) :

    http://www.zimagez.com/zimage/life1.php

    En fait, chaque carré représente un être humain. J'ai pour le moment, pour objectif personnel (j'ai que 15 ans ) de faire déplacer ces carrés. Lors d'un contact entre deux carres, il y a naissance d'un nouveau carré ayant pour couleur, un mix entre les couleurs du père et de la mère ainsi, on pourra voir la couleur dominante à l'écran.

    Voilà où j'en suis pour le moment :

    J'ai implémenté la gestion de collision qui ne fonctionne pas Tout les carres sont au même endroit

    Voilà une image du programme en cours : (avec la gestion de collisions foireuse )

    http://www.zimagez.com/zimage/life3.php

    Voilà le code de main.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    /*
     
        Author : Samy Hocine (samyhocine_at_hotmail_dot_fr)
        Date : November 2007
        Licence : GNU/GPL
    */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include "const.h"
    #include "life.h"
    #include <SDL/SDL.h>
     
    void pause();
     
    int main(void)
    {
        SDL_Init(SDL_INIT_VIDEO);
     
        SDL_Surface *screen = NULL;
     
        screen = SDL_SetVideoMode(L_WINDOW, H_WINDOW, 32, SDL_HWSURFACE);
        SDL_WM_SetCaption("Life", NULL);
     
        // Coloration de la surface ecran en bleu-vert
        SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 100, 100, 100));
     
        SDL_Flip(screen); /* Mise à jour de l'écran avec sa nouvelle couleur */
     
     
        if(createLife(screen)!=1)
        {
            fprintf(stdout, "\nErreur lors de la creation des humains\n");
        }
        else
        {
            fprintf(stdout, "\nCreation des humains re'ussie\n");
        }
        fflush(stdout);
     
        pause();
     
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
     
    void pause()
    {
        int end = 0;
        SDL_Event event;
     
        while (end!=1)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    end = 1;
            }
        }
    }
    life.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "const.h"
    #include "life.h"
     
    struct pos
    {
        int x;
        int y;
    };
     
    struct col
    {
        int r;
        int g;
        int b;
    };
     
    struct life
    {
        struct pos position;
        struct col color;
     
    };
     
    int createLife(SDL_Surface* screen)
    {
        int x = 0, y = 0, l = 254, m = 400;
        int r = 0, g = 0, b = 0, people = LIFES;
        int map[L_H_CASE][L_H_CASE] = {};
        int i, j;
     
        SDL_Surface *perso[LIFES] = {NULL};
        SDL_Rect position;
     
        srand((int)time(NULL));
     
        while(people > 0)
        {
            fprintf(stdout, "\nCreation de l'humain : %i\n", people);
     
            perso[people] = SDL_CreateRGBSurface(SDL_HWSURFACE, L_H_CASE, L_H_CASE, 32, 0, 0, 0, 0);
     
            x = rand() % (m+1);
     
            r = rand() % (l+1);
            g = rand() % (l+1);
            b = rand() % (l+1);
     
            y = rand() % (m+1);
     
            for (i = 0 ; i < L_H_CASE ; i++)
            {
                for (j = 0 ; j < L_H_CASE ; j++)
                {
                    if (map[i][j] == HUMAN)
                    {
                        position.x = i;
                        position.y = j;
                        map[i][j] = NOTHING;
                    }
                }
            }
     
            SDL_FillRect(perso[people], NULL, SDL_MapRGB(screen->format, r, g, b));
            SDL_BlitSurface(perso[people], NULL, screen, &position);
            SDL_Flip(screen);
     
            boucle();
     
            people--;
        }
        return 1;
    }
     
    void boucle()
    {
        int a = 1, b = 10, c = 100, d = 0, i = 100;
     
        while(i > 0)
        {
            i--;
            d = a+b+c;
        }
    }
    life.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef LIFE_H_
    #define LIFE_H_
     
    #include <SDL/SDL.h>
     
    struct pos;
    struct col;
    struct life;
    void boucle();
    int createLife(SDL_Surface* screen);
     
    #endif /* LIFE_H_ */
    Ce que je pense pour le moment c'est que c'est au niveau de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            for (i = 0 ; i < L_H_CASE ; i++)
            {
                for (j = 0 ; j < L_H_CASE ; j++)
                {
                    if (map[i][j] == VOID)
                    {
                        position.x = i;
                        position.y = j;
                        map[i][j] = HUMAN;
                    }
                }
            }
    q

    Que ca cloche, si vous pouviez m'aider

    Merci d'avance

    PS: const.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef CONST_H_
    #define CONST_H_
     
        #define L_H_CASE    8
        #define L_WINDOW    640
        #define H_WINDOW    480
        #define LIFES  20
     
        enum {UP, DOWN, LEFT, WRITE};
        enum {VOID, HUMAN};
     
     
    #endif /* CONST_H_ */

  2. #2
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Je ne vois pas ou elle est ta gestion de collisions. Elle est ou?

  3. #3
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    J'ai oublié de préciser un truc.
    Correspond à la détection d'autres carrés lors de la création des carrés. En gros, il sert à ce que les carés lors de leur création se retrouvent par hasard les uns sur les autres.

    Le problème se situe sur ce code, les carrés sont tous au même endroit

    Merci d'avance

    Voilà le code mis à jour mais qui ne fout rien

    Si vous pouviez me faire un petit pseudo code pour arriver à faire ce que je veux faire , ce serait sympa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    int createLife(SDL_Surface* screen)
    {
        int x = 0, y = 0, l = 254, m = H_WINDOW;
        int r = 0, g = 0, b = 0, people = LIFES;
        int map[L_H_CASE][L_H_CASE] = {};
        int i = LIFES, start = 0;
     
        SDL_Surface *perso[LIFES] = {NULL};
        SDL_Rect position;
     
        srand((int)time(NULL));
     
        struct life humans[LIFES];
     
        while(people > 0)
        {
            fprintf(stdout, "\nCreation de l'humain : %i\n", people);
     
            perso[people] = SDL_CreateRGBSurface(SDL_HWSURFACE, L_H_CASE, L_H_CASE, 32, 0, 0, 0, 0);
     
            r = rand() % (l+1);
            g = rand() % (l+1);
            b = rand() % (l+1);
     
            x = rand() % (m+1);
            y = rand() % (m+1);
     
            if(start == 0)
            {
                humans[0].position.x = x;
                humans[0].position.y = y;
                map[x][y] = HUMAN;
                start = 1;
            }
     
            while(i < 0)
            {
                x = rand() % (m+1);
                fprintf(stdout, "\n1: x %i\n", x);
                fprintf(stdout, "\n1.1: %i\n", humans[i].position.x);
                while(x != humans[i].position.x)
                {
                    printf("\n1: OK\n");
                    y = rand() % (m+1);
                    fprintf(stdout, "\n2: y %i\n", y);
                    fprintf(stdout, "\n2.1: y %i\n", humans[i].position.y);
                    while(y != humans[i].position.y)
                    {
                        printf("\n2 : OK\n");
                        position.x = x;
                        position.y = y;
                        map[x][y] = HUMAN;
                    }
                }
                i--;
            }
     
            i = 0;
     
            SDL_FillRect(perso[people], NULL, SDL_MapRGB(screen->format, r, g, b));
            SDL_BlitSurface(perso[people], NULL, screen, &position);
            SDL_Flip(screen);
     
            boucle();
     
            people--;
        }
        return 1;
    }

  4. #4
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Voilà un code qui est correct mais qui fait toujours que les carrés sont à la même position.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    int createLife(SDL_Surface* screen)
    {
        int x = 0, y = 0, l = 254, m = H_WINDOW;
        int r = 0, g = 0, b = 0, people = LIFES;
        int map[L_H_CASE][L_H_CASE] = {};
        int end = 0;
     
        SDL_Surface *perso[LIFES] = {NULL};
        SDL_Rect position;
     
        srand((int)time(NULL));
     
        struct life humans[LIFES];
     
        while(people > 0)
        {
            fprintf(stdout, "\nCreation de l'humain : %i\n", people);
     
            perso[people] = SDL_CreateRGBSurface(SDL_HWSURFACE, L_H_CASE, L_H_CASE, 32, 0, 0, 0, 0);
     
            r = rand() % (l+1);
            g = rand() % (l+1);
            b = rand() % (l+1);
     
            x = rand() % (m+1);
            y = rand() % (m+1);
     
            while(map[x][y] != HUMAN || end != 1)
            {
                humans[people].position.x = x;
                humans[people].position.y = y;
                map[x][y] = HUMAN;
                end = 1;
            }
     
            end = 0;
     
            SDL_FillRect(perso[people], NULL, SDL_MapRGB(screen->format, r, g, b));
            SDL_BlitSurface(perso[people], NULL, screen, &position);
            SDL_Flip(screen);
     
            boucle();
     
            people--;
        }
        return 1;
    }
    Merci d'avance

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Par défaut
    Sur le dernier code,il y a un problème de dépassement de tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int r = 0, g = 0, b = 0, people = LIFES;
    ...
    SDL_Surface *perso[LIFES] = {NULL};
    ...
    perso[people] = ...
    Les indices de ton tableau "perso" vont de 0 à LIFES-1

    Sinon void étant un mot clé j'eviterais de l'utiliser comme un enum.

  6. #6
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Ben, je ne vois pas trop : voilà la sortie :

    reation de l'humain : 20

    people : 20

    Creation de l'humain : 19

    people : 19

    Creation de l'humain : 18

    people : 18

    Creation de l'humain : 17

    people : 17

    Creation de l'humain : 16

    people : 16

    Creation de l'humain : 15

    people : 15

    Creation de l'humain : 14

    people : 14

    Creation de l'humain : 13

    people : 13

    Creation de l'humain : 12

    people : 12

    Creation de l'humain : 11

    people : 11

    Creation de l'humain : 10

    people : 10

    Creation de l'humain : 9

    people : 9

    Creation de l'humain : 8

    people : 8

    Creation de l'humain : 7

    people : 7

    Creation de l'humain : 6

    people : 6

    Creation de l'humain : 5

    people : 5

    Creation de l'humain : 4

    people : 4

    Creation de l'humain : 3

    people : 3

    Creation de l'humain : 2

    people : 2

    Creation de l'humain : 1

    people : 1

    Creation des humains re'ussie
    Faut dire aussi que j'ai changé le code : voilà mes maj :

    main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    /*
     
        Author : Samy Hocine (samyhocine_at_hotmail_dot_fr)
        Date : November 2007
        Licence : GNU/GPL
    */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include "const.h"
    #include "life.h"
    #include <SDL/SDL.h>
     
    void pause();
     
    int main(void)
    {
        SDL_Init(SDL_INIT_VIDEO);
     
        SDL_Surface *screen = NULL;
     
        screen = SDL_SetVideoMode(L_WINDOW, H_WINDOW, 32, SDL_HWSURFACE);
        SDL_WM_SetCaption("Life", NULL);
     
        // Coloration de la surface ecran en bleu-vert
        SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 100, 100, 100));
     
        SDL_Flip(screen); /* Mise à jour de l'écran avec sa nouvelle couleur */
     
     
        if(createLife(screen)!=1)
        {
            fprintf(stdout, "\nErreur lors de la creation des humains\n");
        }
        else
        {
            fprintf(stdout, "\nCreation des humains re'ussie\n");
        }
        fflush(stdout);
     
        pause();
     
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
     
    void pause()
    {
        int end = 0;
        SDL_Event event;
     
        while (end!=1)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    end = 1;
            }
        }
    }
    const.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef CONST_H_
    #define CONST_H_
     
        #define L_H_CASE    8
        #define L_WINDOW    640
        #define H_WINDOW    480
        #define LIFES  20
     
        enum {UP, DOWN, LEFT, WRITE};
        enum {NOTHING, HUMAN};
     
     
    #endif /* CONST_H_ */
    life.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef LIFE_H_
    #define LIFE_H_
     
    #include <SDL/SDL.h>
     
    struct pos;
    struct col;
    struct life;
    void boucle();
    int createLife(SDL_Surface* screen);
     
    #endif /* LIFE_H_ */
    life.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "const.h"
    #include "life.h"
     
    struct pos
    {
        int x;
        int y;
    };
     
    struct col
    {
        int r;
        int g;
        int b;
    };
     
    struct life
    {
        struct pos position;
        struct col color;
     
    };
     
    int createLife(SDL_Surface* screen)
    {
        int x = 0, y = 0, l = 254, m = H_WINDOW;
        int r = 0, g = 0, b = 0, people = LIFES;
        int map[L_H_CASE][L_H_CASE] = {};
        int end = 0;
     
        SDL_Surface *perso[LIFES] = {NULL};
        SDL_Rect position;
     
        srand((int)time(NULL));
     
        struct life humans[LIFES];
     
        while(people > 0)
        {
            fprintf(stdout, "\nCreation de l'humain : %i\n", people);
     
            printf("\npeople : %i\n", people);
            perso[people] = SDL_CreateRGBSurface(SDL_HWSURFACE, L_H_CASE, L_H_CASE, 32, 0, 0, 0, 0);
     
            r = rand() % (l+1);
            g = rand() % (l+1);
            b = rand() % (l+1);
     
            x = rand() % (m+1);
            y = rand() % (m+1);
     
            humans[people].position.x = x;
            humans[people].position.y = y;
            map[x][y] = HUMAN;
     
            end = 0;
     
            SDL_FillRect(perso[people], NULL, SDL_MapRGB(screen->format, r, g, b));
            SDL_BlitSurface(perso[people], NULL, screen, &position);
            SDL_Flip(screen);
     
            boucle();
     
            people--;
        }
        return 1;
    }
     
    void boucle()
    {
        int a = 1, b = 10, c = 100, d = 0, i = 100;
     
        while(i > 0)
        {
            i--;
            d = a+b+c;
        }
    }
    Merci d'avance (ps : si vous avez quoi que ce soit concernant la gestion de collision, passez le moi )

    Merci encore

Discussions similaires

  1. [CS5] Problèmes de gestion de collisions en AS3
    Par Eshra dans le forum ActionScript 3
    Réponses: 10
    Dernier message: 14/12/2011, 16h01
  2. Problème de gestion de collision [encore]
    Par _SamSoft_ dans le forum SDL
    Réponses: 3
    Dernier message: 27/02/2008, 12h28
  3. Problème de gestion de collision
    Par _SamSoft_ dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 26/02/2008, 15h24
  4. Problème gestion de collisions
    Par kaien dans le forum Physique
    Réponses: 6
    Dernier message: 31/01/2007, 15h31
  5. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo