Exploiter un fichier .raw

Exploiter un fichier .raw - C - Programmation

Marsh Posté le 04-11-2007 à 18:43:51    

:hello:  Salut tout le monde.  
 
Pour un projet, j'utilise une fonction qui permet de recupérer un fichier raw que j'ai créé sous photoshop.
Ceci dans le but de créer des niveaux de jeu pour un genre de pacman( un peu modifié ) :)
 
Au stade ou j’en suis, j’ai réussi en dessinant en noir ou en blanc sur un fichier raw (sous photoshop) a structurer le niveau grace au petit bout de code suivant :
 
for (i=0;i<lig ; i++)
  {
      for (j=0 ; j<col; j++)
      {
        if(ima[i][j]==255)terrain[i][j]='.';
        else cTableau[i][j]=SYMBOLE_MUR;
      }    
  }
Lorsque j’ai dessiné du blanc (255), je dessine un point : '.' (chemin autorisé) et lorsque j’ai du noir(0), je mets un mur (symbole : '+') pour que le bonhome ne puisse pas s’y déplacer.
Tout ca marche tres bien.
Cependant, j’aimerai aller plus loin dans l’exploitation de cette fonction et générer les items (F,S,V,etc) ainsi que des ennemis X. :pt1cable:  
J’ai édité le fichier raw sous photoshop et avec une palette de niveaux de gris (0-255), j’ai donné a chaque items un niveau de gris (par ex : les ennemis 'X' valent 40 en décimal et 29 en hexa(donné par la palette de photoshop))
/!\ Je parle simplement de l'affichage du niveau au départ, car vous allez me dire que mes ennemis bougent pas :p
 Dans le petit bout de code précédent, j’ai donc ajouté une liste de if de la manière suivante (en gras) :
 
for (i=0;i<lig ; i++)
  {
      for (j=0 ; j<col; j++)
      {
        if(ima[i][j]==255)terrain[i][j]='.';
        if(ima[i][j]==40 terrain[i][j]=’X';      // Car j’ai dessiné les ennemis X avec le niveau de gris 40 sous photoshop.
        …
        else terrain [i][j]=SYMBOLE_MUR;
      }    
  }
 
Mais malheureusement ca ne marche pas… :lol:  
Avez-vous une idée ?  
J'ai l'impression qu'en dehors du noir et du blanc, il ne reconnait pas les autres nuances de gris...
 
MErci :p
 


Message édité par mrpropre007 le 04-11-2007 à 18:44:14
Reply

Marsh Posté le 04-11-2007 à 18:43:51   

Reply

Marsh Posté le 05-11-2007 à 10:48:53    

A ton avis, que ce passe-t-il dans le code suivant :

Code :
  1. if(a == 255) b = 1;
  2. if(a ==  40) b = 2;
  3. else         b = 3;

En final, "b" n'aura jamais la valeur "1". Pourquoi ?

Reply

Marsh Posté le 06-11-2007 à 00:18:18    

Bah je comprend pas... si mon pixel vaut 255 alors j'aurai la valeur 1... tu veux dire que 254 est le maximum, c'est la que tu voulais en venir ??
Le probleme c'est que le test sur la valeur 255 marche! ce so,n les autres valeurs qui ne marchent pas , celles qui sont differentes de 0 et 255 :)
 
Merci de ta réponse ;)


Message édité par mrpropre007 le 06-11-2007 à 00:23:00
Reply

Marsh Posté le 06-11-2007 à 08:10:53    

Non, ce qu'il veut dire c'est qu'une clause else est associée à une seule clause if, pas 50.

Reply

Marsh Posté le 06-11-2007 à 09:05:04    

OK les gars c'est sympa! :)
Je vais tester ca, je vous tiens au  jus  
Merci encore ;)

Reply

Marsh Posté le 06-11-2007 à 09:11:03    

J'ai mis pleins de if a la suite les uns des autres et ca ne change rien ... il passe dans le if qui teste la valeur 255 et dans celui qui teste la valeur 0, mais toujours rien dans les autres... :(

Reply

Marsh Posté le 06-11-2007 à 10:21:17    

Montre voir comment t'as imbriqué tes tests (si t'as changé quelque chose parce que j'en doute...)

 

Et sinon, t'as déjà entendu parler de switch ?


Message édité par mcyrb le 06-11-2007 à 10:26:15
Reply

Marsh Posté le 06-11-2007 à 10:24:34    

la portée d'un else, c'est son if associé.

 
Code :
  1. if(a == 255)      b = 1;
  2. else if(a ==  40) b = 2;
  3. else              b = 3;
 

On est pas en PASCAL :o


Message édité par Joel F le 06-11-2007 à 10:24:42
Reply

Marsh Posté le 06-11-2007 à 15:20:10    

+1: regardes aussi du côté de l'instruction "switch".
ET n'oublie pas les "break;" entre chaque "case"  :D


Message édité par lsdYoYo le 06-11-2007 à 15:21:42
Reply

Marsh Posté le 06-11-2007 à 19:36:15    

Ok je vais mettre un switch a la place :)
Je vous tiens au courant... mais je crois bien que j'ai un probleme d'interpretation de niveaux de gris sous photoshop car ca parait bizarre que ca marche pas quand meme !

Reply

Marsh Posté le 06-11-2007 à 19:36:15   

Reply

Marsh Posté le 06-11-2007 à 19:45:15    

Ca réagit de la meme maniere, je pense donc que le probleme ne vient pas du code, mais de photoshop... je dois aps créer le bon fichier en niveaux de gris :(

Reply

Marsh Posté le 06-11-2007 à 19:47:37    

Par curiosité, tu pourrais poster ton code ?


Message édité par tpierron le 06-11-2007 à 19:56:16
Reply

Marsh Posté le 07-11-2007 à 10:16:59    

Et voila pour le bout de code ;)
 
 

Code :
  1. long int couleur;
  2. ima=recup_raw();
  3. for (i=0;i<lig ; i++)
  4.   {
  5.       for (j=0 ; j<col; j++)
  6.       {
  7.         couleur=ima[i][j];
  8.         switch(couleur){
  9.                 case 255 : terrain[i][j]='.';
  10.                              break;
  11.                 case 15 : terrain[i][j]=’X’;      // Car j’ai dessiné les ennemis X avec le niveau de gris 15 sous photoshop.
  12.                              break;
  13.                 case 0 : terrain[i][j]=SYMBOLE_MUR;  // Symbole mur initialisé en define #define SYMBOLE_MUR 43
  14.                              break;
  15.                 }
  16.       } 
  17.   }


 
:)


Message édité par mrpropre007 le 07-11-2007 à 10:23:30
Reply

Marsh Posté le 07-11-2007 à 16:01:41    

Un petit conseil : ajoute un "default:" à ton "switch" et affecte une valeur bidon à "terrrain[i][j]" pour tester.

Reply

Marsh Posté le 09-11-2007 à 21:56:29    

C'est bon le probleme est résolu. Le souci ne venait donc bien pas du code mais du fait que photoshop code ses couleurs comme une merde :)
Avec un niveau de gris de 40 en décimal, il renvoie 134 ... allez savoir pourquoi !
 
Merci a tous ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed