#include "fxlib.h"
#include "stdio.h"
unsigned int key;
int caractere, caractere2;
char chaine[21];
char ident[21];
char domaine[30];
char mdp[30];
char destinataire[40];
char sujet[30];
char corps[50];
int AddIn_main(int isAppli, unsigned short OptionNum){
Bdisp_AllClr_DDVRAM();
demmarage();
identif();
return 1;
}
demmarage(){
int key;
Bdisp_AllClr_DDVRAM();
PrintMini(80,58,"Version 1.0",0);
Bdisp_DrawLineVRAM(10,10,10,50);
Bdisp_DrawLineVRAM(10,50,117,50);
Bdisp_DrawLineVRAM(117,50,117,10);
Bdisp_DrawLineVRAM(10,10,117,10);
Bdisp_DrawLineVRAM(10,10,63,25);
Bdisp_DrawLineVRAM(117,10,63,25);
locate(7,5);
Print("Messagerie");
do{
GetKey(&key);
} while(key != 30004);
Bdisp_AllClr_DDVRAM();
}
identif(){
Bdisp_AllClr_DDVRAM();
locate(1,1);
Print("Identifiant:");
locate(1,2);
Print("+------------------+");
locate(1,3);
Print("| |");
locate(1,4);
Print("+------------------+");
remplichaine();
caractere2=0;
do{
caractere2++;
ident[caractere2] = chaine[caractere2];
} while(caractere2+1 != caractere);
========================== > ICI < ========
locate(2,3);
Print(ident);
do{
GetKey(&key);
} while(key != 30004);
}
remplichaine(){
caractere=0;
do{
caractere++;
======================= > ET ICI < ========
locate(2,3);
Print(chaine);
GetKey(&key);
//==========Conversion==========
if (key==48)key= 71;
if (key==46)key= 61;
if (key==15)key= 51;
if (key==135)key= 41;
if (key==30004)key= 31;
if (key==49)key= 72;
if (key==50)key= 62;
if (key==51)key= 52;
if (key==137)key= 42;
if (key==153)key= 32;
if (key==52)key= 73;
if (key==53)key= 63;
if (key==54)key= 53;
if (key==169)key= 43;
if (key==185)key= 33;
if (key==55)key= 74;
if (key==56)key= 64;
if (key==57)key= 54;
if (key==30025)key= 44;
if (key==30015)key= 34;
if (key==187)key= 75;
if (key==30046)key= 65;
if (key==40)key= 55;
if (key==41)key= 45;
if (key==44)key= 35;
if (key==14)key= 25;
if (key==30001)key= 76;
if (key==149)key= 66;
if (key==133)key= 56;
if (key==129)key= 46;
if (key==130)key= 36;
if (key==131)key= 26;
if (key==30007)key= 77;
if (key==205)key= 67;
if (key==168)key= 57;
if (key==30002)key= 47;
if (key==30023)key= 37;
if (key==30021)key= 27;
if (key==30006)key= 78;
if (key==30008)key= 68;
if (key==30016)key= 58;
if (key==30020)key= 38;
if (key==30018)key= 28;
if (key==30009)key= 79;
if (key==30010)key= 69;
if (key==30011)key= 59;
if (key==30012)key= 49;
if (key==30013)key= 39;
if (key==30014)key= 29;
//==============================
if(key==31)caractere=19;
if(key==76)chaine[caractere]='a';
if(key==66)chaine[caractere]='b';
if(key==56)chaine[caractere]='c';
if(key==46)chaine[caractere]='d';
if(key==36)chaine[caractere]='e';
if(key==26)chaine[caractere]='f';
if(key==75)chaine[caractere]='g';
if(key==65)chaine[caractere]='h';
if(key==55)chaine[caractere]='i';
if(key==45)chaine[caractere]='j';
if(key==35)chaine[caractere]='k';
if(key==25)chaine[caractere]='l';
if(key==74)chaine[caractere]='m';
if(key==64)chaine[caractere]='n';
if(key==54)chaine[caractere]='o';
if(key==73)chaine[caractere]='p';
if(key==63)chaine[caractere]='q';
if(key==53)chaine[caractere]='r';
if(key==43)chaine[caractere]='s';
if(key==33)chaine[caractere]='t';
if(key==72)chaine[caractere]='u';
if(key==62)chaine[caractere]='v';
if(key==52)chaine[caractere]='w';
if(key==42)chaine[caractere]='x';
if(key==32)chaine[caractere]='y';
if(key==71)chaine[caractere]='z';
if(key==61)chaine[caractere]='.';
if(key==57)chaine[caractere]='@';
} while(caractere!=19);
if(key==31)chaine[caractere]='\0';
if(key!=31)chaine[caractere+1]='\0';
}
#pragma section _BR_Size
unsigned long BR_Size;
#pragma section
#pragma section _TOP
int InitializeSystem(int isAppli, unsigned short OptionNum){return INIT_ADDIN_APPLICATION(isAppli, OptionNum);}
#pragma section
Citer : Posté le 13/02/2015 13:03 | #
Bon alors, une fois n'est pas coutume, j'ai surement une erreur du meme type lors de la liberation de la memoire...
J'ai le SE ou un reboot au moment de liberer (le texte n'apparait pas).
#include "fight.h"
#include "draw.h"
#include "memory.h"
#include "MonochromeLib.h"
#include "key.h"
#include <stdlib.h>
#include <stdio.h>
void Fight_start() //-- ok
{
Map map;
Player *players = NULL;
int nbrPlayers = -1;
int i, j;
char debug[50];
// Load
Fight_worldLoad(&map, &players, &nbrPlayers);
// Draw
ML_clear_vram();
Draw_mapFight(map);
// Get down players
Fight_playerDown(map, players, nbrPlayers);
// Play
Fight_play(map, players, nbrPlayers);
Fight_quit(&map, &players);
Sleep(250);
}
void Fight_worldLoad(Map *map, Player **players, int *nbrPlayers) //-- ok
{
int mapId;
int difficulty, mapMode;
Fight_readOptions(&difficulty, &mapMode);
if(mapMode)
mapId = mapMode;
else
mapId = (rand()%Fight_nbrOfMap())+1;
Fight_mapLoad(mapId, map);
*nbrPlayers = Fight_playerLoad(mapId, players);
}
int Fight_mapLoad(int id, Map *map) //-- ok for fixed size (16*8)
{
char fileName[50];
int handle;
int i, j;
sprintf(fileName, "\\\\fls0\\SNOWF\\ff%d.map", id);
if(!memory_exists(fileName))
{
ML_clear_vram();
Draw_printText("Error loading map.\nFile missing:", 20);
Draw_textCenter(fileName, 40);
ML_display_vram();
Sleep(5000);
return -1;
}
map->lenght = 16;
map->height = 8;
map->tiles = calloc(map->height,sizeof(char *));
for(i=0; i<map->height; i++)
{
map->tiles[i] = calloc(map->lenght,sizeof(char));
handle = memory_openfile(fileName, _OPENMODE_READ);
memory_readfile(handle, (void *)map->tiles[i], (map->lenght)*sizeof(char), (map->lenght)*sizeof(char)*i);
memory_closefile(handle);
}
return 1;
}
int Fight_playerLoad(int id, Player **players) //-- ok LePhe<3
{
char fileName[50];
int nbrPlayers = -1;
int handle;
int i, j;
sprintf(fileName, "\\\\fls0\\SNOWF\\ff%d.pla", id);
if(!memory_exists(fileName))
{
ML_clear_vram();
Draw_printText("Error loading player.\nFile missing:", 20);
Draw_textCenter(fileName, 40);
ML_display_vram();
Sleep(5000);
return -1;
}
handle = memory_openfile(fileName, _OPENMODE_READ);
memory_readfile(handle, (void *)&nbrPlayers, sizeof(int), -1);
*players = calloc(nbrPlayers, sizeof(Player));
for(i=0; i<nbrPlayers; i++)
{
(*players)[i].life = 100;
(*players)[i].team = i%2;
memory_readfile(handle, (void *)(*players)[i].pos, 2*sizeof(int), -1);
}
memory_closefile(handle);
return nbrPlayers;
}
void Fight_quit(Map *map, Player **players) //-- ok
{
int i;
for(i=0; i<map->height; i++)
free(map->tiles[i]);
free(map->tiles);
free(players);
ML_clear_vram();
PrintMini(0, 0, "Free() Done", 0);
ML_display_vram();
Sleep(5000);
}
Donc tout se passe bien jusqu'a ce que je revienne dans Fight_start() apres Fight_play()...
Citer : Posté le 13/02/2015 13:14 | #
Juste pour ton information personnelle, la longueur ça s'écrit « length ».
Sinon, évite d'utiliser des key_down() à tout bout de champ et sers-toi de GetKey() quand c'est possible, tu économises de la puissance et de la batterie.
Ta libération de players peut utiliser une copie du pointeur, là ce qu'on veut c'est l'adresse des données pas celle de la variable. Au lieu de libérer les données à l'adresse players, là tu libères players (i.e la variable au lieu des données sur lesquelles elle pointe). Change ton argument.
Citer : Posté le 13/02/2015 13:20 | #
C'est la fatigue ...:whistle:
Oui mais le probleme avec GetKey c'est que si tu appuis sur MENU, ca te libere pas la memoire si ?
Citer : Posté le 13/02/2015 13:21 | #
Faut utiliser SetQuitHandler() qui te permet d'appeler une fonction quand l'application est quittée. Cette fonction n'étant appelée que lorsque la nouvelle application démarre, si l'utilisateur retourne dans ton add-in en passant par le menu la fonction n'est pas appelée donc les données ne sont pas libérées.
Citer : Posté le 13/02/2015 13:24 | #
Oui mais du coup, si il quitte avant que la mémoire soit allouée (par exemple dans les menus), le free() ne frira rien du tout
Ajouté le 13/02/2015 à 13:28 :
Ok j'ai rien dit, je pensait que free() plantait si son argument était null.
Sinon j'ai pas bien compris ce que tu m'as dit, faut que je fasse ca:
void Fight_quit(Map *map, Player *players) //-- ok
{
int i;
for(i=0; i<map->height; i++)
free(map->tiles[i]);
free(map->tiles);
free(players);
ML_clear_vram();
PrintMini(0, 0, "Free() Done", 0);
ML_display_vram();
Sleep(5000);
}
Citer : Posté le 13/02/2015 13:55 | #
Oui, et tu envoies players et non &players à la fonction.
Citer : Posté le 13/02/2015 14:01 | #
Alors du coup, l'erreur est du a quelque chose avant l'appel a Fight_quit() qui fait planter les SH4...
Ajouté le 13/02/2015 à 14:24 :
Je suis confus...
Je comprends pas en quoi un return peut me faire planter ... Et pourtant, en y allant pas a pas c'est tout ce que je trouve.
{
int turn = -1;
int distMade, i, jump;
Snowball ball;
char buffer[50];
int handle;
char names[2][21] = {0};
// Load names
// Player 1
handle = memory_openfile("\\\\fls0\\SNOWF\\name.txt", _OPENMODE_READ);
memory_readfile(handle, (void *)names[0], 20*sizeof(char), 0);
memory_closefile(handle);
// Player 2
ML_clear_vram();
sprintf(buffer, "\nHey guys,\nbefore starting the battle, what's your name dear guest of %s ?", names[0]);
Draw_printText(buffer, 25);
PrintMini(10, 50, "GUEST: ", 0);
InputString(names[1], 19, 40, 50);
ML_clear_vram();
sprintf(buffer, "Nice to meet you %s !\nBe careful, %s is a pro player at SBF...", names[1], names[0]);
Draw_printText(buffer, 25);
Draw_textCenter("Press [ExE]", 50);
ML_display_vram();
while(!key_down(K_EXE))
Sleep(100);
while(key_down(K_EXE));
// Draw map
ML_clear_vram();
Draw_mapFight(map);
SaveDisp(2);
// Engine
while(1)
{
turn = (turn+1)%nbrPlayers;
if(players[turn].life > 0)
{
RestoreDisp(2);
Draw_playersFight(players, nbrPlayers);
ML_rectangle(30, 28, 98, 37, 1, ML_CHECKER, ML_WHITE);
ML_rectangle(29, 27, 99, 38, 1, ML_BLACK, ML_TRANSPARENT);
sprintf(buffer, "%s turn", names[players[turn].team]);
Draw_textCenter(buffer, 30);
ML_display_vram();
while(!key_down(K_EXE))
Sleep(100);
while(key_down(K_EXE));
// MOVE
distMade = 0;
jump = 0;
do
{
// Draw
RestoreDisp(2);
Draw_selectedPlayer(players[turn], MAX_DEP-distMade);
if(!jump)
Fight_playerDown(map, players, nbrPlayers);
else
Draw_playersFight(players, nbrPlayers);
ML_display_vram();
// Keys
// Goto shoot
if(key_down(K_EXE) && !jump || players[turn].life<=0)
{
while(key_down(K_EXE));
break;
}
// Quit
if(key_down(K_EXIT))
{
while(key_down(K_EXIT));
return;
}
// Left
if(key_down(K_LEFT) && players[turn].pos[0] > 0 && map.tiles[(int)((players[turn].pos[1])/8)][(int)((players[turn].pos[0])/8)] == 0)
{
distMade++;
players[turn].pos[0]--;
}
// Right
if(key_down(K_RIGHT) && (int)((players[turn].pos[0]+8)/8) < map.length && map.tiles[(int)((players[turn].pos[1])/8)][(int)((players[turn].pos[0]+6)/8)] == 0)
{
distMade++;
players[turn].pos[0]++;
}
// Up
if(jump)
{
jump--;
if(players[turn].pos[1] > 1)
{
if(map.tiles[(int)((players[turn].pos[1]-8)/8)][(int)((players[turn].pos[0])/8)] == 0)
players[turn].pos[1]--;
}
}
else if(key_down(K_UP) && map.tiles[(int)((players[turn].pos[1]-8)/8)][(int)((players[turn].pos[0])/8)] == 0)
{
jump = 10;
}
Sleep(100);
}while(distMade < MAX_DEP);
if(players[turn].life > 0)
{
RestoreDisp(2);
Draw_selectedPlayer(players[turn], MAX_DEP-distMade);
Fight_playerDown(map, players, nbrPlayers);
// SHOOT
SaveDisp(1);
ball.pos[0] = (float)players[turn].pos[0] + (players[turn].pos[0]>64 ? -1. : 7.);
ball.pos[1] = (float)players[turn].pos[1] + 4.;
ball.speed[0] = (players[turn].pos[0]>64 ? -1. : 1.);
ball.speed[1] = -1.5;
do
{
// Draw
RestoreDisp(1);
Draw_traject(ball);
ML_display_vram();
// Keys
if(key_down(K_EXIT))
{
while(key_down(K_EXIT));
return;
}
if(key_down(K_LEFT) && ball.speed[0] > -MAX_SPEED)
{
ball.speed[0] -= .05;
if(ball.speed[0] < 0.)
ball.pos[0] = (float)players[turn].pos[0] - 1.;
}
if(key_down(K_RIGHT) && ball.speed[0] < MAX_SPEED)
{
ball.speed[0] += .05;
if(ball.speed[0] > 0.)
ball.pos[0] = (float)players[turn].pos[0] + 7.;
}
if(key_down(K_UP) && ball.speed[1] > -MAX_SPEED)
{
ball.speed[1] -= .05;
}
if(key_down(K_DOWN) && ball.speed[1] < MAX_SPEED)
{
ball.speed[1] += .05;
}
if(key_down(K_EXE))
{
while(key_down(K_EXE));
break;
}
Sleep(50);
}while(1);
ball.flying = 1;
do
{
// Draw
RestoreDisp(1);
ML_point((int)(ball.pos[0]+.5), (int)(ball.pos[1]+.5), 3, ML_BLACK);
ML_display_vram();
// Ball position
ball.pos[0] += ball.speed[0]/2.;
ball.pos[1] += ball.speed[1]/2.;
ball.speed[1] += .05;
// Quit
if(key_down(K_EXIT))
{
while(key_down(K_EXIT));
return;
}
// Player collision
for(i=0; i<nbrPlayers; i++)
{
if( ball.pos[0]+1.>=(float)players[i].pos[0] && ball.pos[0]-1.<=(float)players[i].pos[0]+5. && ball.pos[1]+1.>=(float)players[i].pos[1] && ball.pos[1]-1.<=(float)players[i].pos[1]+8.)
{
if(ball.pos[1]+1.>=(float)players[i].pos[1]+3.)
players[i].life -= 35; // Bodyshoot
else
players[i].life -= 70; // Headshoot
if(players[i].life < 0)
players[i].life = 0;
ball.flying = 0;
}
}
// Ground collision
if((int)((ball.pos[0] + 1.)/8.) > map.length || ((ball.pos[0] - 1.)/8.) < 0. || map.tiles[(int)((ball.pos[1] + (ball.speed[0]>0. ? 1. : -1.))/8.)][(int)((ball.pos[0] + (ball.speed[0]>0. ? 1. : -1.))/8.)] != 0)
ball.flying = 0;
Sleep(BALL_SPEED);
}while(ball.flying);
}
}
if(Fight_checkPlayers(players, nbrPlayers))
break;
}
// End of game
ML_clear_vram();
Draw_mapFight(map);
Draw_playersFight(players, nbrPlayers);
ML_rectangle(30, 28, 98, 37, 1, ML_CHECKER, ML_WHITE);
ML_rectangle(29, 27, 99, 38, 1, ML_BLACK, ML_TRANSPARENT);
sprintf(buffer, "%s wins !", names[Fight_checkPlayers(players, nbrPlayers)-1]);
Draw_textCenter(buffer, 30);
ML_display_vram();
while(!key_down(K_EXE))
Sleep(100);
while(key_down(K_EXE));
}
N'importe ou que je mette un return dans ma fonction, elle plante sur SH4 mais pas sur SH3 ...
Ca m'enerfe
Citer : Posté le 13/02/2015 14:38 | #
Je comprends pas en quoi un return peut me faire planter ...
On appelle couramment ça des effets de bords... si tu enlèves une instruction, par exemple un printf(), le code fonctionne mais si tu le laisses ça bugge.
Et pourtant ce n'est pas cette instruction qui est la cause du bug. Le problème se trouve ailleurs... c'est très long à debugger parce que même quand on croit avoir cerné le problème on est souvent tombé à côté...
Normalement quand on code proprement, de manière structurée, clean, etc. au possible on n'en a pas. Enfin c'est surtout théorique, j'en ai moi-même eu des bien énervants parce que je libérais un pointeur au mauvais moment.
Donc le plus simple c'est de reparcourir tout le code à la recherche d'effets non voulus, ou, mieux, de le réécrire... mais c'est plus long (n'empêche que je le fais souvent :P ).
Citer : Posté le 13/02/2015 16:47 | #
Ha oui ca doit etre ca ...
Apres 20h de recodage intensif, TProg est de retour:
C'est bon ca marche, ce satané SDK est vraiment pourrit, c'est surement lui qui a tout fait bugger et certainement pas moi
En realité, TProg a trouvé son erreur au bout de 3 minutes:
sprintf(buffer, "\nHey guys,\nbefore starting the battle, what's your name dear guest of %s ?", names[0]);
Que je suis con ...
Ajouté le 17/02/2015 à 01:01 :
Bonsoir,
J'ai un "freeze" avec ce code et GetKey():
{
// SPRITES
const unsigned char fond[]={
0x0,0x0,0x0,0x0,0x0,0x78,0x0,0x0,
};
const unsigned char oeuf[]={
0x6,0x0,
0x1f,0x80,
};
unsigned int key;
int x, y;
x = 64;
y = 32;
do
{
// AFFICHAGE
ML_clear_vram();
ML_bmp_or(fond, 0, 0, 128, 64);
ML_bmp_or(oeuf, x-6, y-7, 12, 14);
ML_display_vram();
// Gauche
if(key_down(K_LEFT) && x>6)
x--;
// Droite
if(key_down(K_RIGHT) && x<122)
x++;
// Haut
if(key_down(K_UP) && y>7)
y--;
// Bas
if(key_down(K_DOWN) && y<57)
y++;
// Retour
if(key_down(K_EXIT))
{
while(key_down(K_EXIT))
Sleep(100);
return;
}
// Exe
if(key_down(K_EXE))
{
while(key_down(K_EXE))
Sleep(100);
if(x>5 && y>4 && x<36 && y<35)
return;
if(x>28 && y>33 && x<59 && y<64)
AGBS_Monde1();
if(x>54 && y>1 && x<85 && y<32)
AGBS_Monde2();
if(x>88 && y>15 && x<119 && y<46)
AGBS_Monde3();
}
Sleep(15);
}while(1);
}
void AGBS_Monde1()
{
// SPRITES
const unsigned char fond[]={
0x0,0x0,0x0,0x0,
};
const unsigned char pointeur[]={
0x0,0x0,0x0,0x0,
};
const unsigned char cadena[]={
0xff,
};
unsigned int key = 0;
int xPointeur, nbr;
xPointeur = 0;
do
{
// AFFICHAGE
ML_clear_vram();
ML_bmp_or_cl(fond, -7*xPointeur, 0, 191, 64);
ML_bmp_or_cl(pointeur, xPointeur*12+1, -3, 16, 18);
for(nbr = data[1]; nbr<8; nbr++)
ML_bmp_xor_cl(cadena, 43+19*nbr-7*xPointeur, 23, 8, 7);
// GESTION DES TOUCHES
GetKey(&key);
switch(key)
{
case KEY_CTRL_EXIT:
if(xPointeur != 0)
xPointeur = 0;
else
return;
break;
case KEY_CTRL_LEFT:
if(xPointeur>0)
xPointeur--;
break;
case KEY_CTRL_RIGHT:
if(xPointeur<data[1]+1)
xPointeur++;
break;
case KEY_CTRL_EXE:
while(key_down(K_EXE))
Sleep(100);
if(xPointeur)
level(1, xPointeur-1);
else
return;
}
}while(1);
}
Je m'explique, lorque je passe de AGBS_MenuJeu() a AGBS_Monde1(), j'arrive dans Monde1. Le fond s'affiche, avec les breakpoint, je vois que le programme s'arrete au GetKey() et donc rentre dedans. Le soucis c'est qu'a se moment la, je peux appuyer sur toutes les touches rien ne se passe sauf avec la touche EXE...
Et le comble c'est qu'en lancant Monde1 sans passer par MenuJeu, tout se passe bien...
Bref je comprend pas.
Citer : Posté le 17/02/2015 02:29 | #
Si je puis me permettre, Je me demande encore si qui que ce soit comprend le SDK...
Enfin, bon.... Je te propose d'essayer en passant d'une façon alternée... il doit pas apprécier le menu pour une raison ou une autre...
Je suis de l'autre coté de la manche maintenant. Yay.
Citer : Posté le 17/02/2015 10:10 | #
J'ai pas jeté un coup d'œil suffisant pour trouver l'origine du problème, mais j'insiste : virez moi les 50 lignes de sprites dans vos code ! Mettez la déclaration, mais 3 valeurs dans le tableau suffisent...
Ajouté le 17/02/2015 à 10:10 :
Ça devient illisible, tu m'étonne qu'on trouve pas les problèmes
Citer : Posté le 17/02/2015 10:21 | #
Ou alors faites comme moi : mettez tout sur une seule ligne !
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 17/02/2015 10:40 | #
Desole j'ai pas l'habitude vu qu'avec Notepad++ ils sont cachés ...
J'ai edité
Citer : Posté le 17/02/2015 12:45 | #
Sinon, c'est pas un problème de touche en mémoire ? Je sais que sur MS2, si on joue en appuyant sur EXE, lors de la mise en pause ça quitte tout de suite car la touche EXE est dans le buffer du GetKey.
Citer : Posté le 17/02/2015 13:45 | #
Ca correspondrait a ca...
Mais du coup comment faut faire pour l'eviter ?
Citer : Posté le 17/02/2015 15:18 | #
Utiliser le syscall KBD_PutKey
Citer : Posté le 15/03/2015 16:29 | #
J'ai un problème : tout d'abord, j'ai lancé casionj.g1w et ca plantait direct (alors qu'il voulait bien ouvrir tout mes autres .g1w ...) j'ai donc ouvert un autre projet pour copier le g1w et le mettre a la place de celui qui marchait pas, et a présent le SDK accepte enfin de l'ouvrir sans planter ! Or il m'indique quelques erreurs qui n'en sont pas mais osef. le problème est qu'il ne veut pas l'émuler, bien que je compile 2 sec avant : No build project could be find in the file et si quelqu'un a déjà eu ce problème ca m'interresse car la je suis obligé de passer par prendre le g1a compilé et le mettre dans le fichier SDCard d'un autre jeu pour enfin l'émuler
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 15/03/2015 16:41 | #
Reconfigure le projet, t'as fait des conneries tout le long >_<
Citer : Posté le 15/03/2015 16:47 | #
Alors c'est super bizarre... j'ai fait project-> EDIT et la je vais dans paths j'ai vu qu'il indiquait pour sources SRC un fichier qui n'existait pas du coup j'ai changé le path et la ca marche je n'ai rien compris
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 22/03/2015 21:45 | #
Une fois n'est pas coutume, j'ai encore un bordel avec mes tableaux de structures...
Voici le code:
Block *blocks = NULL;
Variable *variables = NULL;
// Dnas le .h
typedef struct
{
char name[11];
char type[11];
double value;
} Variable;
// Dans edit.c
extern Block *blocks;
static int nbrVariables;
extern Variable *variables;
void edit_Algo(AlgoCaract algoCaract)
{
Menu menu = BASE;
int i, posCursor;
int stop = 0;
unsigned int key;
char debug[200] = {0};
// Load blocks
edit_loadBlocks(algoCaract);
// Init var
nbrVariables = 0;
for(i=0; i<algoCaract.nbrBlocks && blocks[i].type == VAR_NEW; i++)
nbrVariables++;
variables = calloc(nbrVariables, sizeof(Variable));
for(i=0; i<nbrVariables; i++)
{
strcpy(variables[i].name, blocks[i].args[0]);
strcpy(variables[i].type, blocks[i].args[1]);
variables[i].value = 0.;
}
// Princip
posCursor = 0;
do
{
ML_clear_vram();
PrintXY(0, 0, "====== ======", 0);
PrintXY(36, 0, algoCaract.name, 0);
Draw_FKeys(menu);
edit_drawAlgo(algoCaract.nbrBlocks, posCursor);
sprintf(debug, "%d %p", nbrVariables, variables);
PrintMini(0, 0, debug, 0);
for(i=0; i<nbrVariables; i++)
{
sprintf(debug, "var %d: %s, %s", i, variables[i].name, variables[i].type);
PrintMini(0, 6*(i+1), debug, 0);
}
GetKey(&key);
// Blabla de l'affichage et des touches avec appel a edit_addBlock_Var()
}while(!stop);
// Save
edit_saveBlocks(algoCaract);
// Free
free(blocks);
free(variables);
}
void edit_addBlock_Var(Block *block, TypeBlock type)
{
unsigned int key;
int cursor = 0;
char name[10] = {0};
char buffer[100] = {0};
const char arrows[2][3] = {{0xE6, 0x9A, 0}, {0xE6, 0x9B, 0}};
ML_clear_vram();
if(type == VAR_NEW)
{
do
{
ML_clear_vram();
PrintXY(0, 0, (const unsigned char*)"Nouvelle variable:", 0);
PrintXY(0, 16, (const unsigned char*)"Nom de la variable", 0);
PrintXY(0, 24, (const unsigned char*)"[ ]", 0);
if(cursor<8)
PrintXY(6*(cursor+1), 24, (const unsigned char*)"_", 0);
PrintXY(6, 24, (unsigned char*)name, 0);
GetKey(&key);
if((key >= 'A' && key <= 'Z') && cursor<8)
{
name[cursor] = key;
cursor++;
}
if(key == KEY_CTRL_DEL && cursor > 0)
{
PrintXY(6, 24, (const unsigned char*)" ", 0);
cursor--;
name[cursor] = 0;
}
}while(key != KEY_CTRL_EXE || cursor == 0);
nbrVariables++;
strcpy(block->args[0], name);
strcpy(block->args[1], "NOMBRE");
variables = realloc(variables, (nbrVariables+1)*sizeof(Variable));
strcpy(variables[nbrVariables-1].name, name);
strcpy(variables[nbrVariables-1].type, "NOMBRE");
// DEBUG
sprintf(buffer, "var %d: %s, %s", nbrVariables-1, variables[nbrVariables-1].name, variables[nbrVariables-1].type);
PrintMini(0, 0, buffer, 0);
ML_display_vram();
Sleep(2500);
}
else if(type == VAR_READ)
{
do
{
ML_clear_vram();
PrintXY(0, 0, (const unsigned char*)"Lire variable:", 0);
PrintXY(0, 16, (const unsigned char*)"Nom de la variable", 0);
PrintXY(18, 24, (const unsigned char*)"[ ]", 0);
PrintXY(24, 24, (unsigned char*)variables[cursor].name, 0);
if(cursor>0)
PrintXY(6, 24, arrows[0], 0);
if(cursor<nbrVariables-1)
PrintXY(84, 24, arrows[1], 0);
GetKey(&key);
if(key == KEY_CTRL_LEFT && cursor>0)
cursor--;
if(key == KEY_CTRL_RIGHT && cursor<nbrVariables-1)
cursor++;
}while(key != KEY_CTRL_EXE);
strcpy(block->args[0], variables[cursor].name);
}
}
Donc le probleme est relatif a mon tableau de Variable.
En fait dans la fonction edit_addBlock_Var(), le debug m'affiche ce que j'ai rentré juste au dessus (normal me direz-vous).
Mais une fois de retour dans la boucle principale, le debug m'affiche que les premieres cases sont vides... Bref j'y comprend niet alors si quelqu'un trouve mon erreur
Citer : Posté le 23/03/2015 18:41 | #
Ça sert à rien ça, tu sais ? Ça n'initialise que la première case.
Je trouve ton code pas clair, tu peux pas séparer l'interface et les contrôleurs ? C'est un peu le bordel dans ton affaire...