[Aide SDK] Les erreurs de compilation
Posté le 15/05/2011 00:10
Suite aux nombreuses demande d'aide que je reçois concernant des messages d'erreur lors de compilation avec le SDK, je décide de créer ce topic qui aura pour but de recenser tous les messages d'erreur, de les expliquer, et de donner leur solution.
Premièrement, qu'est ce qu'une erreur de compilation ?
Ici, ce sont les 4 lignes qui commencent par le chemin de mon fichier source contenant les erreurs (Z:\home\pierre\a\a.c) suivi du numéro de la ligne contenant l'erreur.
Liste des erreurs
Illegal token ''<mot>''
Description : Une erreur de syntaxe a été rencontrée
avant <mot> (un point virgule manquant, une parenthèse en trop ...)
Solution : Arrêter de coder avec les pieds.
Undeclared name ''<nom>''
Description : Une variable est utilisée sans avoir été déclarée au préalable.
Solution : Déclarer la variable au début de la fonction.
Cannot convert parameter ''X''
Description : Le paramètre n°X envoyé à la fonction n'est pas du bon type, et ne peut pas être converti.
Solution : Vérifier quel type de variable demande la fonction, et lui envoyer une variable du bon type.
Illegal initializer type
Description : Une variable est initialisée avec un type incorrecte (exemple, un entier initialisé avec une chaîne de caractère)
Solution : Initialiser la variable avec une valeur CONSTANTE correcte.
Le compilateur Renesas utilisé par le SDK respecte la norme C89, qui spécifie qu'une variable doit être initialisée avec une valeur constante, et non une valeur de retour de fonction, ou un paramètre de la fonction.
Multiple variable declarations
Description : Une variable a déjà le même nom et la même portée que celle déclarée à la ligne de l'erreur.
(Deux variables peuvent avoir le même nom si elles n'ont pas la même portée)
Solution : Nommer la variable différemment.
Type not compatible for ''=''
Description : L'affectation d'une valeur à une variable a échouée car la valeur n'est pas d'un type compatible avec celui de la variable.
Solution : Si la valeur affectée est un retour de fonction, vérifier quel type de variable retourne la fonction.
Modifiable lvalue required for ''=''
Description : Un élément non modifiable (comme une fonction où une constante) est suivi d'un signe égal.
Solution : Seule les variables peuvent se voir affecter une valeur avec ''=''.
Index not integer
Description : utilisation d'un float ou d'un double dans l'index d'une case de tableau.
Solution : Caster en int, tableau[double] devient tableau[(int)double]
Number of parameters mismatch
Description : Trop ou pas assez de paramètres sont envoyés à la fonction.
Solution : Regarder ce que demande la fonction, et le respecter.
Undefined external symbol ''_<nom de fonction>''
Description : Une fonction est appelée, mais son implémentation n'a pas été compilée.
Solution : Vérifier l'orthographe du nom, vérifier si le fichier contenant la fonction est bien dans la fenêtre ''Files in project''. Si tout ça est bon, essayez d'éditer le fichier contenant l'implémentation de la fonction (ajouter un espace, le supprimer, sauvegarder), ça permettra au compilateur de re-compiler le fichier.
couldn't open ''<nom de fichier>''
Description : Un fichier inclu avec #include n'existe pas.
Solution : Lors de l'inclusion d'un fichier, il faut donner son
chemin relatif depuis le fichier contenant la directive #include
Empty source program
Description : Le fichier source est vide, et aucun compilateur n'aime ça.
Cannot open source file ''<nom de fichier>''
Description : Le fichier source présent dans la fenêtre ''Files in project'' du SDK n'existe pas.
Unrecognized preprocessing directive
Description : Une directive de préprocesseur (lignes commençant pas #) n'est pas correctement orthographiée.
Illegal preprocessor syntax
Description : Erreur de syntaxe dans une directive de préprocesseur.
Expected a file name
Description : Un nom de fichier est attendu (généralement une erreur de syntaxe dans une directive include)
Expected an identifier
Description : Un identifiant est attendu (généralement une erreur de syntaxe dans une directive define ou ifdef)
Invalid parameter specified in option "input" : ""C:\Program Files (x86)\CASIO\fx-9860G SDK\OS\FX\lib\setup.obj""
Description : Ne jamais installer le SDK dans un dossier dont le chemin comporte des parenthèses ! Mettez-le dans C:\Programmes\CASIO par exemple.
Cette liste est incomplète, si vous rencontrez d'autres erreurs, vous pouvez les poster ici, elles seront ajoutées.
Voici une liste en anglais de toutes les erreurs possibles et imaginables. Cela ne vous donne pas forcément une bonne solution, mais ça peut vous aiguiller sur une piste
Dernière modification : 26/09/2013 (Dark Storm)
Fichier joint
Citer : Posté le 13/09/2012 18:20 | #
@Javierxd : exemple de cast
int * pvariable = [green](int*)[/green] malloc (sizeof(int));
a = [green](double)[/green] sqrt(20);
floor(...) ne retourne pas un int, mais un double ( réel), donc il faut rajouter "(int)" juste avant floor(...) pour que le résultat soit un entier de type int.
( ( mat_niveau[perso.y_mat * largeur + [green](int)[/green] floor( ( perso.x_pointcontact[0] +1 ) / 8 )] 0 ) ) || //ici
( mat_niveau[perso.y_mat * largeur + [green](int)[/green] floor( ( perso.x_pointcontact[1] +1 ) / 8 )] 0 ) ) - //ici
( IsKeyDown( KEY_CHAR_4 ) && ( ( mat_niveau[perso.y_mat * largeur + [green](int)[/green] floor( ( perso.x_bmp -1 ) / 8 )] 0 ) ) || //ici
( mat_niveau[perso.y_mat * largeur + [green](int)[/green] floor( ( perso.x_pointcontact[2] -1 ) / 8 )] 0 ) ) ) deplacement( &perso );
Citer : Posté le 13/09/2012 18:33 | #
LoL Dodormeur.
Citer : Posté le 13/09/2012 18:54 | #
Alors en faisant ça on peut choisir le type de variable que retourne une fonction?
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 13/09/2012 23:58 | #
Non, c'est une conversion explicite.
Dans ce code, la conversion est implicite :
double d = 0.5;
i = d;
Citer : Posté le 16/09/2012 01:53 | #
J'ai un problème, quoi que je fasse, aucun sprite s'affiche. Je mets le fichier complet en spoiler:
#include "MonochromeLib.h"
#include "gameplay.h"
#include "stdlib.h"
#include "math.h"
void jouer( int* mat_niveau, int niveauchoisi, int largeur, int hauteur )
{
//déclaration des sprites du personnage et des portaux
unsigned char perso_droite[] = {0x18, 0x18, 0x33, 0x3E, 0x30, 0x38, 0x68, 0x4C};
unsigned char perso_gauche[] = {0x18, 0x18, 0xCC, 0x7C, 0x0C, 0x1C, 0x16, 0x32};
unsigned char viseur[] = {0x70, 0xA8, 0xF8, 0xA8, 0x70};
jinfo perso;
pinfo portal[2] = {0};
int vecteur_x = 0;
int vecteur_y = 0;
initperso( &perso );
ML_bmp_8_xor( perso_droite, perso.x_bmp, perso.y_bmp );
ML_bmp_8_xor( viseur, perso.x +8, perso.y );
ML_display_vram();
//boucle principale de la partie
do
{
Sleep( 200 );
if( portal[0].compteur > 0 ) portal[0].compteur--;
if( portal[1].compteur > 0 ) portal[1].compteur--;
perso.x_mat = floor( perso.x/8 );
perso.y_mat = floor( perso.x/8 );
if( ( IsKeyDown( KEY_CHAR_6 ) &&
( ( mat_niveau[perso.y_mat * largeur + (int) floor( ( perso.x_pointcontact[0] +1 ) / 8 )] <= 0 ) ) ||
( mat_niveau[perso.y_mat * largeur + (int) floor( ( perso.x_pointcontact[1] +1 ) / 8 )] <= 0 ) ) -
( IsKeyDown( KEY_CHAR_4 ) && ( ( mat_niveau[perso.y_mat * largeur + (int) floor( ( perso.x_bmp -1 ) / 8 )] <= 0 ) ) ||
( mat_niveau[perso.y_mat * largeur + (int) floor( ( perso.x_pointcontact[2] -1 ) / 8 )] <= 0 ) ) ) deplacement( &perso ); //le signe "-" est un Xor (je sais pas le faire autrement :-º)
if( IsKeyDown( KEY_CHAR_8 ) && mat_niveau[(perso.y_mat+1) * largeur + perso.x_mat] > 0 && mat_niveau[(perso.y_mat-1) * largeur + perso.x_mat] <= 0 ) vecteur_y = -5; //tous les mouvements à l'exception du déplacement avec 4 ou 6 marche par addition vectorielle
if(mat_niveau[largeur * (int) floor( ( perso.y_pointcontact[2] + 1 ) / 8 ) + perso.x_mat] > 0 || mat_niveau[largeur * (int) floor( ( perso.y_pointcontact[1] + 1 ) / 8 ) + perso.x_mat] > 0 )
{
vecteur_x = 0;
vecteur_y = 0;
} //si le joueur est en train de toucher le sol, tous les vecteurs de mouvement sont mis à zéro
else
{
if( vecteur_y <= 10 ) vecteur_y += 2;
} //si le joueur ne touche pas le sol (il est dans l'air), les effets de la gravité se font sentir sur les vecteurs
if( vecteur_x || vecteur_y ) influencevecteur( &perso, &vecteur_x, &vecteur_y, mat_niveau, largeur ); //cette fonction applique les vecteurs affectés par les lignes précédentes au mouvement du personnage
if( IsKeyDown( KEY_CTRL_UP ) || IsKeyDown( KEY_CTRL_RIGHT ) || IsKeyDown( KEY_CTRL_DOWN ) || IsKeyDown( KEY_CTRL_LEFT ) ) bougerviseur( &perso ); //les flèches permettent de déplacer le viseur
if( IsKeyDown( KEY_CTRL_SHIFT ) || IsKeyDown( KEY_CTRL_ALPHA ) ) tirerpg( portal, &perso, largeur, mat_niveau ); //en touchant shift ou alpha tu utilises ta portal gun
if( ( perso.x_mat == portal[0].x && perso.y_mat == portal[0].y && !portal[0].compteur ) || ( perso.x_mat == portal[1].x && perso.y_mat == portal[1].y && !portal[1].compteur ) && portal[0].x > 0 && portal[0].y > 0 && portal[1].x > 0 && portal[1].y > 0 ) traverserportal( &perso, portal, &vecteur_x, &vecteur_y ); //Pour pouvoir traverser le portal, il faut que tu sois près de lui, qu'il se soit passé un certain temps depuis sa dernière utilisation et que les deux portaux soient ouverts
} while ( mat_niveau[perso.y_mat * largeur + perso.x_mat] != -1 ); //le joueur passe le niveau si il touche la sortie
free (mat_niveau);
}
void initperso( jinfo *perso )
{
perso->orientation = 1;
perso->x = 14;
perso->y = 115;
perso->x_bmp = 10;
perso->y_bmp = 111;
perso->x_mat = 1;
perso->y_mat = 6;
perso->x_viseur = 22;
perso->y_viseur = 115;
perso->x_pointcontact[0] = perso->x_bmp + 7;
perso->x_pointcontact[1] = perso->x_bmp + 7;
perso->x_pointcontact[2] = perso->x_bmp;
perso->y_pointcontact[0] = perso->y_bmp;
perso->y_pointcontact[1] = perso->y_bmp + 7;
perso->y_pointcontact[2] = perso->y_bmp + 7;
}
void deplacement( jinfo *perso )
{
unsigned char perso_droite[] = {0x18, 0x18, 0x33, 0x3E, 0x30, 0x38, 0x68, 0x4C};
unsigned char perso_gauche[] = {0x18, 0x18, 0xCC, 0x7C, 0x0C, 0x1C, 0x16, 0x32};
unsigned char viseur[] = {0x70, 0xA8, 0xF8, 0xA8, 0x70};
if( perso->orientation ) //le bmp utilisé pour effacer le perso dépend de s'il regarde vers la gauche ou vers la droite
ML_bmp_8_xor_cl( perso_droite, perso->x_bmp, perso->y_bmp );
else
ML_bmp_8_xor_cl( perso_gauche, perso->x_bmp, perso->y_bmp );
ML_bmp_8_xor_cl( viseur, perso->x_viseur, perso->y_viseur );
if( IsKeyDown( KEY_CHAR_6 ) )
{
perso->x++;
perso->x_bmp++;
perso->x_pointcontact[0]++;
perso->x_pointcontact[1]++;
perso->x_pointcontact[2]++;
if( perso->x_viseur < 127 ) perso->x_viseur++;
perso->orientation = 1;
ML_bmp_8_xor_cl( perso_droite, perso->x_bmp, perso->y_bmp );
}
if( IsKeyDown( KEY_CHAR_4 ) )
{
perso->x--;
perso->x_bmp--;
perso->x_pointcontact[0]--;
perso->x_pointcontact[1]--;
perso->x_pointcontact[2]--;
if( perso->x_viseur>0 ) perso->x_viseur--;
perso->orientation = 0;
ML_bmp_8_xor_cl( perso_gauche, perso->x_bmp, perso->y_bmp );
}
perso->x_mat = floor( perso->x/8 );
ML_bmp_8_xor_cl( viseur, perso->x_viseur, perso->y_viseur );
ML_display_vram();
}
void influencevecteur( jinfo *perso, int *vecteur_x, int *vecteur_y, int *mat_niveau, int largeur )
{
unsigned char perso_droite[] = {0x18, 0x18, 0x33, 0x3E, 0x30, 0x38, 0x68, 0x4C};
unsigned char perso_gauche[] = {0x18, 0x18, 0xCC, 0x7C, 0x0C, 0x1C, 0x16, 0x32};
unsigned char viseur[] = {0x70, 0xA8, 0xF8, 0xA8, 0x70};
int a;
if( perso->orientation ) //cette condition est expliquée dans la fonction deplacement
ML_bmp_8_xor_cl( perso_droite, perso->x_bmp, perso->y_bmp );
else
ML_bmp_8_xor_cl( perso_gauche, perso->x_bmp, perso->y_bmp );
ML_bmp_8_xor_cl( viseur, perso->x_viseur, perso->y_viseur );
if( *vecteur_x > 0 )
{
for( a = 1; a <= *vecteur_x; a++ ) //l'utilisation d'une boucle for permet que le perso se déplace moins de pixels que ce qui indique le vecteur s'il rencontre un obstacle
{
if( mat_niveau[perso->y_mat * largeur + (int) floor( ( perso->x_pointcontact[0] + 1 ) / 8 )] <= 0 && mat_niveau[perso->y_mat * largeur + (int) floor( ( perso->x_pointcontact[1] + 1 ) / 8 )] <= 0 )
{
perso->x++;
perso->x_viseur++;
perso->x_bmp++;
perso->x_pointcontact[0]++;
perso->x_pointcontact[1]++;
perso->x_pointcontact[2]++;
}
else //s'il trouve un mur, le vecteur se met à zéro
{
*vecteur_x = 0;
}
}
}
else
{
for( a = -1; a >= *vecteur_x; a-- ) //même boucle qu'avant, mais si le vecteur va vers la gauche
{
if( mat_niveau[perso->y_mat * largeur + (int) floor( ( perso->x_bmp - 1 ) / 8 )] <= 0 && mat_niveau[perso->y_mat * largeur + (int) floor( ( perso->x_pointcontact[2] - 1 ) / 8 )] <= 0 )
{
perso->x--;
perso->x_viseur--;
perso->x_bmp--;
perso->x_pointcontact[0]--;
perso->x_pointcontact[1]--;
perso->x_pointcontact[2]--;
}
else
{
*vecteur_x = 0;
}
}
}
if( *vecteur_y > 0 ) //même condition, mais pour l'axe des ordonnées
{
for( a = 1; a <= *vecteur_y; a++ )
{
if( mat_niveau[(int) floor( ( perso->y_pointcontact[1] + 1 ) / 8 ) * largeur + perso->x_mat] < 0 && mat_niveau[(int) floor( ( perso->y_pointcontact[2] + 1 ) / 8 ) * largeur + perso->x_mat] <= 0 )
{
perso->y++;
perso->y_viseur++;
perso->y_bmp++;
perso->y_pointcontact[0]++;
perso->y_pointcontact[1]++;
perso->y_pointcontact[2]++;
}
else
{
*vecteur_y = 0;
}
}
}
else
{
for( a = -1; a >= *vecteur_y; a-- )
{
if( mat_niveau[(int) floor( ( perso->y_bmp - 1 ) / 8 ) * largeur + perso->x_mat] < 0 && mat_niveau[(int) floor( ( perso->y_pointcontact[0] - 1 ) / 8 ) * largeur + perso->x_mat] <= 0 )
{
perso->y--;
perso->y_viseur--;
perso->y_bmp--;
perso->y_pointcontact[0]--;
perso->y_pointcontact[1]--;
perso->y_pointcontact[2]--;
}
else
{
*vecteur_y = 0;
}
}
}
perso->x_mat = floor( perso->x / 8 );
perso->y_mat = floor( perso->y / 8 );
if( perso->orientation )
ML_bmp_8_xor_cl( perso_droite, perso->x_bmp, perso->y_bmp );
else
ML_bmp_8_xor_cl( perso_gauche, perso->x_bmp, perso->y_bmp );
ML_bmp_8_xor_cl( viseur, perso->x_viseur, perso->y_viseur );
ML_display_vram();
}
void bougerviseur( jinfo *perso )
{
unsigned char viseur[] = {0x70, 0xA8, 0xF8, 0xA8, 0x70};
ML_bmp_8_xor_cl( viseur, perso->x_viseur, perso->y_viseur );
//le viseur se déplacera tant qu'il soit à une distance d'entre 4 et 8 pixels du perso
if( IsKeyDown( KEY_CTRL_UP ) && ( ( perso->x_viseur - perso->x ) * ( perso->x_viseur - perso->x ) + ( perso->y_viseur-- - perso->y ) * ( perso->y_viseur-- - perso->y ) < 64 && ( ( perso->x_viseur - perso->x ) * ( perso->x_viseur - perso->x ) + ( perso->y_viseur-- - perso->y ) * ( perso->y_viseur-- - perso->y ) > 16 ) ) ) perso->y_viseur--;
if( IsKeyDown( KEY_CTRL_RIGHT ) && ( ( perso->x_viseur++ - perso->x ) * ( perso->x_viseur++ - perso->x ) + ( perso->y_viseur - perso->y ) * ( perso->y_viseur - perso->y ) < 64 && ( ( perso->x_viseur++ - perso->x ) * ( perso->x_viseur++ - perso->x ) + ( perso->y_viseur - perso->y ) * ( perso->y_viseur - perso->y ) > 16 ) ) ) perso->x_viseur++;
if( IsKeyDown( KEY_CTRL_DOWN ) && ( ( perso->x_viseur - perso->x ) * ( perso->x_viseur - perso->x ) + ( perso->y_viseur++ - perso->y ) * ( perso->y_viseur++ - perso->y ) < 64 && ( ( perso->x_viseur - perso->x ) * ( perso->x_viseur - perso->x ) + ( perso->y_viseur++ - perso->y ) * ( perso->y_viseur++ - perso->y ) > 16 ) ) ) perso->y_viseur++;
if( IsKeyDown( KEY_CTRL_LEFT ) && ( ( perso->x_viseur-- - perso->x ) * ( perso->x_viseur-- - perso->x ) + ( perso->y_viseur - perso->y ) * ( perso->y_viseur - perso->y ) < 64 && ( ( perso->x_viseur-- - perso->x ) * ( perso->x_viseur-- - perso->x ) + ( perso->y_viseur - perso->y ) * ( perso->y_viseur - perso->y ) > 16 ) ) ) perso->x_viseur--;
ML_bmp_8_xor_cl( viseur, perso->x_viseur, perso->y_viseur );
ML_display_vram();
}
void tirerpg( pinfo *portal, jinfo *perso, int largeur, int *mat_niveau )
{
unsigned char portal_gauche[] = {0x18, 0x2C, 0x76, 0x5A, 0x5A, 0x6E, 0x34, 0x18};
unsigned char portal_droite[] = {0x18, 0x34, 0x6E, 0x5A, 0x5A, 0x76, 0x2C, 0x18};
double coordtir_x = perso->x;
double coordtir_y = perso->y;
double coordtirmat_x;
double coordtirmat_y;
double vecteur_x = perso->x_viseur - perso->x;
double vecteur_y = perso->y_viseur - perso->y;
double distance = sqrt( vecteur_x * vecteur_x + vecteur_y * vecteur_y );
vecteur_x /= distance; //on normalise les vecteurs pour obtenir des vecteurs unitaires
vecteur_y /= distance;
if( IsKeyDown( KEY_CTRL_SHIFT ) ) //shift et alpha te permettent de choisir le portail que tu veux utiliser
{
//le tir suivra une ligne droite jusqu'à ce qu'il trouve un bloc solide ou le bord de l'écran
while( mat_niveau[ (int) floor( ( coordtir_y + vecteur_y ) / 8 ) * largeur + (int) floor( ( coordtir_x + vecteur_x ) / 8 )] <= 0 && (coordtir_x + vecteur_x ) < 127 && (coordtir_x + vecteur_x ) > 1 && (coordtir_y + vecteur_y ) < 63 && (coordtir_y + vecteur_y ) > 1 )
{
coordtir_x += vecteur_x;
coordtir_y += vecteur_y;
}
coordtirmat_x = (int) floor( coordtir_x / 8 );
coordtirmat_y = (int) floor( coordtir_y / 8 );
//Pour que le portail s'ouvre il faut que le tir touche un bloc normal et que sa place dans la matrice ne soit pas déjà occupée ni par le décor ni par le perso
if( mat_niveau[ (int) floor( ( coordtir_y + vecteur_y ) / 8 ) * largeur + (int) floor( ( coordtir_x + vecteur_x ) / 8 )] == 1 && mat_niveau[ (int) coordtirmat_y * largeur + (int) coordtirmat_x] == 0 && (coordtir_x + vecteur_x ) < 127 && (coordtir_x + vecteur_x ) > 1 && (coordtir_y + vecteur_y ) < 63 && (coordtir_y + vecteur_y ) > 1 && (coordtirmat_x != perso->x_mat || coordtirmat_y != perso->y_mat ) )
{
if( portal[0].x )
{
ML_bmp_8_xor( portal_gauche, portal[0].x * 8, portal[0].y * 8 );
mat_niveau[portal[0].y * largeur + portal[0].x] = 0;
}
portal[0].x = coordtirmat_x;
portal[0].y = coordtirmat_y;
mat_niveau[portal[0].y * largeur + portal[0].x] = -2;
ML_bmp_8_xor( portal_gauche, portal[0].x * 8, portal[0].y * 8 );
if( floor( ( coordtir_x + vecteur_x ) / 8 ) == coordtirmat_x + 1 ) portal[0].orientation = 1;
if( floor( ( coordtir_x + vecteur_x ) / 8 ) == coordtirmat_x - 1 ) portal[0].orientation = 3;
if( floor( ( coordtir_y + vecteur_y ) / 8 ) == coordtirmat_y + 1 ) portal[0].orientation = 2;
if( floor( ( coordtir_y + vecteur_y ) / 8 ) == coordtirmat_y - 1 ) portal[0].orientation = 0;
}
}
if( IsKeyDown( KEY_CTRL_ALPHA ) )
{
while( mat_niveau[ (int) floor( ( coordtir_y + vecteur_y ) * largeur + (int) floor( ( coordtir_x + vecteur_x ) ) )] <= 0 && (coordtir_x + vecteur_x ) < 127 && (coordtir_x + vecteur_x ) > 1 && (coordtir_y + vecteur_y ) < 63 && (coordtir_y + vecteur_y ) > 1 )
{
coordtir_x += vecteur_x;
coordtir_y += vecteur_y;
}
coordtirmat_x = (int) floor( coordtir_x / 8 );
coordtirmat_y = (int) floor( coordtir_y / 8 );
if( mat_niveau[ (int) floor( ( coordtir_y + vecteur_y ) / 8 ) * largeur + (int) floor( ( coordtir_x + vecteur_x ) / 8 )] == 1 && mat_niveau[ (int) coordtirmat_y * largeur + (int) coordtirmat_x] == 0 && (coordtir_x + vecteur_x ) < 127 && (coordtir_x + vecteur_x ) > 1 && (coordtir_y + vecteur_y ) < 63 && (coordtir_y + vecteur_y ) > 1 )
{
if( portal[1].x )
{
ML_bmp_8_xor( portal_droite, portal[1].x * 8, portal[1].y * 8 );
mat_niveau[portal[1].y * largeur + portal[1].x] = 0;
}
portal[1].x = coordtirmat_x;
portal[1].y = coordtirmat_y;
mat_niveau[portal[1].y * largeur + portal[1].x] = -2;
ML_bmp_8_xor( portal_droite, portal[1].x * 8, portal[1].y * 8 );
if( floor( ( coordtir_x + vecteur_x ) / 8 ) == coordtirmat_x + 1 ) portal[1].orientation = 1;
if( floor( ( coordtir_x + vecteur_x ) / 8 ) == coordtirmat_x - 1 ) portal[1].orientation = 3;
if( floor( ( coordtir_y + vecteur_y ) / 8 ) == coordtirmat_y + 1 ) portal[1].orientation = 2;
if( floor( ( coordtir_y + vecteur_y ) / 8 ) == coordtirmat_y - 1 ) portal[1].orientation = 0;
}
}
ML_display_vram();
}
void traverserportal( jinfo *perso, pinfo *portal, int *vecteur_x, int *vecteur_y)
{
unsigned char perso_droite[] = {0x18, 0x18, 0x33, 0x3E, 0x30, 0x38, 0x68, 0x4C};
unsigned char perso_gauche[] = {0x18, 0x18, 0xCC, 0x7C, 0x0C, 0x1C, 0x16, 0x32};
unsigned char viseur[] = {0x70, 0xA8, 0xF8, 0xA8, 0x70};
if( perso->orientation )
ML_bmp_8_xor_cl( perso_droite, perso->x_bmp, perso->y_bmp );
else
ML_bmp_8_xor_cl( perso_gauche, perso->x_bmp, perso->y_bmp );
ML_bmp_8_xor_cl( viseur, perso->x_viseur, perso->y_viseur );
if( perso->x_mat == portal[0].x && perso->y_mat == portal[0].y )
{
perso->x_mat = portal[1].x;
perso->y_mat = portal[1].y;
perso->x = portal[1].x * 8 + 4;
perso->y = portal[1].y * 8 + 4;
perso->x_bmp = portal[1].x * 8;
perso->y_bmp = portal[1].y * 8;
perso->x_pointcontact[0] = perso->x_bmp + 7;
perso->y_pointcontact[0] = perso->y_bmp;
perso->x_pointcontact[1] = perso->x_bmp + 7;
perso->y_pointcontact[1] = perso->y_bmp + 7;
perso->x_pointcontact[2] = perso->x_bmp;
perso->y_pointcontact[2] = perso->y_bmp + 7;
perso->x_viseur = perso->x + 8;
perso->y_viseur = perso->y;
if( portal[1].orientation == 1 )
{
*vecteur_x += fabs( *vecteur_y );
*vecteur_y = 0;
}
if( portal[1].orientation == 3 )
{
*vecteur_x -= fabs( *vecteur_y );
*vecteur_y = 0;
}
if( portal[1].orientation == 2 )
{
*vecteur_y = fabs( *vecteur_y ) * -1;
*vecteur_y -= fabs( *vecteur_x );
*vecteur_x = 0;
}
}
if( perso->x_mat == portal[1].x && perso->y_mat == portal[1].y )
{
perso->x_mat = portal[0].x;
perso->y_mat = portal[0].y;
perso->x = portal[0].x * 8 + 4;
perso->y = portal[0].y * 8 + 4;
perso->x_bmp = portal[0].x * 8;
perso->y_bmp = portal[0].y * 8;
perso->x_pointcontact[0] = perso->x_bmp + 7;
perso->y_pointcontact[0] = perso->y_bmp;
perso->x_pointcontact[1] = perso->x_bmp + 7;
perso->y_pointcontact[1] = perso->y_bmp + 7;
perso->x_pointcontact[2] = perso->x_bmp;
perso->y_pointcontact[2] = perso->y_bmp + 7;
perso->x_viseur = perso->x + 8;
perso->y_viseur = perso->y;
if( portal[0].orientation == 1 )
{
*vecteur_x += fabs( *vecteur_y );
*vecteur_y = 0;
}
if( portal[0].orientation == 3 )
{
*vecteur_x -= fabs( *vecteur_y );
*vecteur_y = 0;
}
if( portal[0].orientation == 2 )
{
*vecteur_y = fabs( *vecteur_y ) * -1;
*vecteur_y -= fabs( *vecteur_x );
*vecteur_x = 0;
}
}
if( perso->orientation )
ML_bmp_8_xor_cl( perso_droite, perso->x_bmp, perso->y_bmp );
else
ML_bmp_8_xor_cl( perso_gauche, perso->x_bmp, perso->y_bmp );
ML_bmp_8_xor_cl( viseur, perso->x_viseur, perso->y_viseur );
ML_display_vram();
}
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 16/09/2012 10:27 | #
C'est le bordel ton code
Il y a de l'affichage et de la gestion d'input dans toutes les fonctions, et du coups les mêmes sprites sont déclarés à 3/4 endroits, pas pratique si tu veux les modifier.
Faut structurer ça, ta boucle principale ça doit juste être [ input, déplacement, collisions, affichage, sleep ]
Si un sprite est affiché 2 fois en xor au même endroit, alors il n'est plus visible, c'est peut-être ça ton soucis.
Et puis le perso commence aux coordonnées (10, 111) donc hors de l'écran. Idem pour le viseur.
perso->y_bmp = 111;
Citer : Posté le 16/09/2012 12:28 | #
Il y a de l'affichage et de la gestion d'input dans toutes les fonctions
J'essaierai de changer ça
les mêmes sprites sont déclarés à 3/4 endroits, pas pratique si tu veux les modifier.
Ça irait si je les mets comme variables globales?
Faut structurer ça, ta boucle principale ça doit juste être [ input, déplacement, collisions, affichage, sleep ]
Je ne suis pas sûr si je réussirai à le faire avec cette structure, mais j'essaierai...
Et puis le perso commence aux coordonnées (10, 111) donc hors de l'écran. Idem pour le viseur.
Comment ça en dehors de l'écran? Les coordonnées de l'écran vont de 0 à 127 et de 0 à 63, donc il commencerait en bas à gauche, non?
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 16/09/2012 12:44 | #
(0, 0) est en haut à gauche !!
Et tu as mis Y à 111
Citer : Posté le 16/09/2012 14:38 | #
Je devrais abandonner la programmation juste pour ça --'
Ok, je corrige
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 16/09/2012 15:26 | #
Je ne suis pas sûr si je réussirai à le faire avec cette structure, mais j'essaierai...
Tu peux aussi faire : [ affichage, sleep, input, déplacement, collisions ]
Citer : Posté le 16/09/2012 21:31 | #
Je préfère celle de Pirrotll, mais merci
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 16/09/2012 23:01 | #
Je trouve plus logique l'ordre "entrée -> traitement -> sortie"
Citer : Posté le 17/09/2012 18:20 | #
c'est le principe même d'un algo, non ?
Citer : Posté le 17/09/2012 18:43 | #
Oui, c'est vrai
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 18/09/2012 23:27 | # | Fichier joint
J'ai un bug avec un bmp, au lieu d'afficher tout le bmp, il affiche la moitié supéieure deux fois:
0x3F, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3F, 0x00, 0x00, 0x00, 0x01, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1E, 0x00, 0x00, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1E, 0x01, 0xE0, 0xF0, 0x7F, 0x87, 0x86, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x83, 0xF0, 0xFC, 0x7F, 0x87, 0x86, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x19, 0x83, 0x30, 0xCC, 0x0C, 0x0C, 0xC6, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0xC6, 0x18, 0xC6, 0x0C, 0x0C, 0xC6, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0xCE, 0x1C, 0xC6, 0x0C, 0x0C, 0xC6, 0x01, 0xEC, 0x00, 0x00,
0x00, 0x00, 0x0F, 0x19, 0x8C, 0x0C, 0xCC, 0x0C, 0x0F, 0xC6, 0x01, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x8C, 0x0C, 0xFC, 0x0C, 0x1F, 0xE6, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1E, 0x0E, 0x1C, 0xF8, 0x0C, 0x18, 0x66, 0x01, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x06, 0x18, 0xDC, 0x0C, 0x18, 0x66, 0x01, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x3B, 0x18, 0x03, 0x30, 0xCE, 0x0C, 0x18, 0x66, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x0C, 0x71, 0x18, 0x03, 0xF0, 0xC6, 0x0C, 0x18, 0x67, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1E, 0x01, 0xE0, 0xF0, 0x7F, 0x87, 0x86, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x83, 0xF0, 0xFC, 0x7F, 0x87, 0x86, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01,
0x19, 0x83, 0x30, 0xCC, 0x0C, 0x0C, 0xC6, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0xC6, 0x18, 0xC6, 0x0C, 0x0C, 0xC6, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0xCE, 0x1C, 0xC6, 0x0C, 0x0C, 0xC6, 0x01, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x8C, 0x0C, 0xCC, 0x0C, 0x0F, 0xC6, 0x01, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x8C, 0x0C, 0xFC, 0x0C, 0x1F, 0xE6, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1E, 0x0E, 0x1C, 0xF8, 0x0C, 0x18, 0x66, 0x01, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x06, 0x18, 0xDC, 0x0C, 0x18, 0x66, 0x01, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x3B, 0x18, 0x03, 0x30, 0xCE, 0x0C, 0x18, 0x66, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x0C, 0x71, 0x18, 0x03, 0xF0, 0xC6, 0x0C, 0x18, 0x67,0x00, 0x00, 0x0E, 0xE1, 0x18, 0x01, 0xE0, 0xC6, 0x0C,
0x18, 0x67, 0xF1, 0x70, 0x00, 0x00, 0x00, 0x07, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x7C, 0x78, 0x00, 0x00, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xFE, 0x7C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xC6, 0x66, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xC6, 0x67, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x63, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x63, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x38, 0x66, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x66, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x7C, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00};
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 19/09/2012 04:29 | #
Déjà ton tableau fait 669 octets, donc il y a un problème.
Citer : Posté le 19/09/2012 22:49 | #
Je comprends pas ce que tu veux dire...
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 20/09/2012 03:00 | #
Ton tableau fait 669 octets. La décomposition de produits de facteurs premiers de 669 est 3*223. Donc il y a deux possibilités : soit ton image a pour dimensions 24*223 (ou 3*1784) soit ton tableau ne fait pas la bonne taille par rapport aux dimensions de l'image, et donc l'image a été mal encodée.
Je parierais plutôt pour la seconde proposition.
Citer : Posté le 20/09/2012 21:10 | #
Vraiment une bonne idée de tout mettre en vrac dans un seul topic ? Pas mieux de mettre [SDK] devant le sujet ? Là c'est pas vraiment évident de retrouver le début du problème
Citer : Posté le 20/09/2012 21:16 | #
Mon image a pour dimensions 107 * 36, et pour l'encodage, j'ai copié le code qui m'avait retourné Tiles Creator
My program is not working, I have no idea why.
My program is working, I have no idea why.
Citer : Posté le 20/09/2012 21:34 | #
Une image de 107*36 pixel ça fait un bitmap de 504 octets. TileCreator a peut-être un problème pour gérer les largeurs non multiples de 8.
@Pigeonv: Je suis d'accord. Ce topic sert juste à parler des erreurs de compilations normalement, mais bon, quand une question y est posée, autant y répondre.