Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > API graphiques > SDL
SDL Forum d'entraide sur l'API SDL. Avant de poster -> FAQ SDL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 31/10/2012, 14h30   #1
nicosmash
Nouveau Membre du Club
 
Inscription : octobre 2012
Messages : 39
Détails du profil
Informations forums :
Inscription : octobre 2012
Messages : 39
Points : 37
Points : 37
Par défaut Decors jeu incomplet

Bonjour,

Voilà j'ai un petit problème mon décors en SDL est incomplet et je ne comprend pas pourquoi. De plus mon personnage peut se déplacer de partout sauf quand il y a un "mur", et justement je n'en vois pas et il peut donc les franchir.

[IMG][/IMG]

Je charge mon fichier niveau avec cette fonction du fichier : fichier.c :

Code :
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
int chargerPartie(int niveau[][NB_BLOCS_HAUTEUR])
{
    FILE* fichier = NULL;
    char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
    int i = 0, j = 0;
 
    fichier = fopen("niveaux.lvl", "r");
    if (fichier == NULL)
        return 0;
 
    fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);
 
    for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
    {
        for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
        {
            switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
            {
                case '0':
                    niveau[j][i] = 0;
                    break;
                case '1':
                    niveau[j][i] = 1;
                    break;
                case '2':
                    niveau[j][i] = 2;
                    break;
                case '3':
                    niveau[j][i] = 3;
                    break;
                case '4':
                    niveau[j][i] = 4;
                    break;
                case '5':
                    niveau[j][i] = 5;
                    break;
                case '6':
                    niveau[j][i] = 6;
                    break;
                case '7':
                    niveau[j][i] = 7;
                    break;
                case '8':
                    niveau[j][i] = 8;
                    break;
                case '9':
                    niveau[j][i] = 9;
                    break;
            }
        }
    }
 
    fclose(fichier);
    return 1;
}
J'ai un fichier : constantes.h
Contenant cette liste :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
enum 
    {
    VIDE,        /* 0 */
    PERSONNAGE, /* 1 */
    MUR,         /* 2 */
    SANDWICH,     /* 3 */    
    EAU,        /* 4 */
    GANT,         /* 5 */
    WC,            /* 6 */
    LIT,        /* 7 */
    BALAIS,        /* 8 */
    ARBRE        /* 9 */
    }; // Les différentes images
Et mon fichier contenant le décors et dans le zip ci-dessous.

Projet complet :
http://fr.packupload.com/CGOSLJN9LP6
nicosmash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2012, 18h06   #2
edgarjacobs
Membre éclairé
 
Homme
Développeur informatique
Inscription : mai 2011
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 53
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2011
Messages : 203
Points : 319
Points : 319
N'aurais-tu pas inversé les indices i et j ?

Code :
1
2
3
4
5
6
7
8
9
10
11
int chargerPartie(int niveau[][NB_BLOCS_HAUTEUR])
{
...
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
    {
        for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
        {
            switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
            {
                case '0':
                    niveau[j][i] = 0;
Tu vas te retrouver en fin des deux boucles avec les indices
Code :
niveau[NB_BLOCS_HAUTEUR][NB_BLOCS_LARGEUR]
edgarjacobs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2012, 18h25   #3
nicosmash
Nouveau Membre du Club
 
Inscription : octobre 2012
Messages : 39
Détails du profil
Informations forums :
Inscription : octobre 2012
Messages : 39
Points : 37
Points : 37
C'est bon merci à vous et Winjerome
nicosmash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2012, 19h40   #4
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 189
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 189
Points : 12 709
Points : 12 709
Bonsoir,

Pour compléter la réponse de nicosmash, le problème venait du fait que niveau était normalement de taille
Code :
int niveau[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR]
(utilisation de int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0}; passé à cette fonction dans fichier jeu.c)
et donc en effet, il y avait un problème au niveau du parcours des indices. On a donc comme correction :
Code :
1
2
3
4
for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
{
    for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
    {
Le switch a de plus été simplifié en
Code :
niveau[j][i] = ligneFichier[(i * NB_BLOCS_LARGEUR) + j] - '0';
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2012, 17h50   #5
aristide2012
Futur Membre du Club
 
Homme donald aristide ################
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Nom : Homme donald aristide ################
Localisation : Côte d'Ivoire

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 19
Points : 19
Bonjour,
Je suis actuellement dans la réalisation d'un jeu en 2D.
J'ai des problèmes au niveau de la compréhension de certains codes.
Code :
1
2
 
char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
Le premier d'après mon analyse détermine la taille du tableau,prenons comme exemple NB_BLOCS_LARGEUR =12 NB_BLOCS_HAUTEUR=12 ,leur multiplication fera 144 mais l indice d’élément du c commencant à 0 on ajoute + 1 pour que le 144 élément du fichier sois compris.Est ce ça?
Bien le second est la compréhension de ce code :
Code :
1
2
3
4
5
6
7
8
 
  fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);
 
    for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
    {
        for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
        {
            switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])//Précisément ce code présent
Je ne comprend pas son utilisation.
Merci de bien vouloir y jeter un oeil.
aristide2012 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2012, 20h19   #6
edgarjacobs
Membre éclairé
 
Homme
Développeur informatique
Inscription : mai 2011
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 53
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2011
Messages : 203
Points : 319
Points : 319
Citation:
char * fgets ( char * str, int num, FILE * stream );
Get string from stream
Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or the end-of-file is reached, whichever happens first.

A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str.

A terminating null character is automatically appended after the characters copied to str.
Lors de la lecture, num-1 caractères (au plus) sont lus; Comme tu veux en lire 144 (cfr ton exemple), il faut demander à fgets la lecture de 144+1 caractères.

Néanmoins, la chaine de réception doit avoir num+1 char, puisque un '\0' est automatiquement ajouté après la lecture.
edgarjacobs est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/11/2012, 23h57   #7
aristide2012
Futur Membre du Club
 
Homme donald aristide ################
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Nom : Homme donald aristide ################
Localisation : Côte d'Ivoire

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 19
Points : 19
J'ai compris les deux codes maintenant et j'ai réussi mon tile mapping.
Le second code détermine la position dans le fichier de l’élément à prendre ,bien entendu en tenant compte de la variation de i et de j qui joue sur le tableau à 2dimensions carte.Sérieux il y' a des génies dans ce monde, ces algos sont beaux et fonctionnels.Je me demande comment on fait pour arriver à un tel niveau de réflexion?
aristide2012 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 00h11   #8
edgarjacobs
Membre éclairé
 
Homme
Développeur informatique
Inscription : mai 2011
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 53
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2011
Messages : 203
Points : 319
Points : 319
Je suis bien content que tu aies compris.

Dans le futur, tu devrais créer de nouveaux posts plutot que d'utiliser des posts déjà existants (cfr ce post et le précédent). Les problèmes peuvent se ressembler mais être tout à fait différents, et donc les réponses également.
edgarjacobs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 05h14   #9
aristide2012
Futur Membre du Club
 
Homme donald aristide ################
Étudiant
Inscription : janvier 2012
Messages : 28
Détails du profil
Informations personnelles :
Nom : Homme donald aristide ################
Localisation : Côte d'Ivoire

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 28
Points : 19
Points : 19
Ok,Je le ferais maintenant.
aristide2012 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h44.


 
 
 
 
Partenaires

Hébergement Web