PDA

Voir la version complète : [GBA][Aide] Ham - Dé-initialiser une Map


omg
06/05/2006, 19h30
Bonjour,
je bosse actuellement sur plusieurs levels pour mon jeu.
j'initialise mon niveau de telle manière :
ham_Init();
ham_SetBgMode(0);
//=======================
speed = 4;
// --- Load Map Principale --- Hel[1] ---
LEVEL2POWER=8;
//en fait faut mettre LEVEL2POWER=n ou 2^n = longueur map
// Mise en place de la Map de Collision
BG=&port_v4_part01_col;

// Initialisation de la palette
ham_LoadBGPal256((void*)port_v4_part01_palette);

ham_bg[0].ti = ham_InitTileSet((void*)port_v4_part01_tiles,SIZEOF _16BIT(port_v4_part01_tiles),1,1);
Map0 = hel_MapInit(0, 256 , 64 , FALSE, &port_v4_part01_map); //longueur map,largeur
ham_InitBg(0, TRUE, 2, FALSE);

ham_bg[1].ti = ham_bg[0].ti;
Map1 = hel_MapInit(1, 192 , 48 , FALSE, &port_v4_part01_map_fond); //longueur map,largeur
ham_InitBg(1, TRUE, 3, FALSE);

ham_bg[2].ti = ham_bg[0].ti;
Map2 = hel_MapInit(2, 256 , 64 , FALSE, &port_v4_part01_map_front); //longueur map,largeur
ham_InitBg(2, TRUE, 0, FALSE);
Malheureusement pour moi je voudrais introduire un nouveau niveau mais je n'arrive pas à "dé-initialiser celui-ci"
J'ai essayer avec les commandes " ham_DeInitBG" et aussi "ham_DeInitTileSet " et "ham_DeInitMapSet" mais ça plante...
Quelqu'un aurait une idée? :cry:

Kyros
06/05/2006, 19h54
void ham_ResetBg ();
Au moins c'est radical ^^ .

J'utilise ça dans mon jeu, car avec les fonctions que tu avais citées j'avais eu des problèmes aussi :blink: ... donc à chaque nouveau "niveau" j'efface tout ce que j'ai en map/BG/tiles courant , puis je recharge le contenu du prochain niveau ...

Je regarderais toutefois pourquoi ca marchait pas ces autres fonctions =_= ...

PS : Juste avant de poster , j'me suis dis que ca venait peut etre du fait que tu utilise HEL et que tu peux pas dé-initialiser les maps crées avec HEL par des fonctions de HAM :unsure: ... regarde si y'a pas une fonction de HEL pour dé-initisaliser ses propres map ... auquel cas tu vires les tiles avec la fonction de HAM et tu vires les maps avec la fonction de HEL ...
Juste une supposition , j'ai pas la spé de HEL sous la main :ange: .

omg
06/05/2006, 20h12
Oui en effet, ça ne marche pas non plus...
Je vais tester avec l'initialisation entierement avec HAM.

Kyros
06/05/2006, 20h17
J'ai regarder la spé' de HEL :
void hel_MapDelete (u32 BgNo);

Ca marche pas non plus ? :blink:

Yodajr
06/05/2006, 20h46
ham_DeInitTileSet(ham_bg[0].ti);
ham_ResetBg();

Ca ca devrai marcher, je l'utilise avec succès avec HEL ;)

omg
06/05/2006, 23h30
Je vous dis ça demain les gars!
Merci de votre aide!

omg
07/05/2006, 17h43
Hier j'avais merdé avec un ";" que j'avais omis...
ça marche bien a part que j'ai un leger décalage d'un tile sur la droite sur ma deuxieme map.
J'ai décidé de passer sur "Hel Lib 2"...
Vais essayer le transfert car pas mal de choses change , les scroll de map par exemple... Tout à l'air d'avoir été simplifié!

A bientot et encore merci à vous deux!

Bientot une nouvelle démo!

Edit (quelques temps plus tard :berk: ) : Apres moulte reflexion, je crois que je vais essayer de chercher pourquoi j'ai ce décalage de 1 Tile surement du au map scrollby de Hel sur mes background 0 et 2. Une fois tous mes problemes réglés je regarderai de plus pres Hel lib 2... :p

omg
14/05/2006, 18h47
Apres une semaine, je tombe sur un nouveau probleme toujours en rapport avec le sujet.
Je commence le jeu tranquillou au bord de la mer... 3 background (un "front" qui passe devant lles personages, un normal ou les personnages marchent, et un fond : la mer)
int main(void){
ham_Init();
//=======================
// Setup the background mode
ham_SetBgMode(0);
level=0;
//création des sprites banjo et Trilby qui est censé être une fée
createTrilby(1,20,312);
createBanjo(0,20,20);
//chargement de la map 1
changeMap(level,96,200);
ham_StartIntHandler(INT_TYPE_VBL,(void*)&vbl_func);
while(TRUE){}
return 0;
anim_eau =0;
}

void vbl_func(){
ham_CopyObjToOAM();
input();
Ptx = hel_MapGetPositionInPixel(&Map0); // update des coord de la map en pixel


focusCam(Banjo);
if((sprite[Banjo].x >= 1990) && (level == 0))
{
level = 1;
changeMap(level,20,220);
}

if((sprite[Banjo].x<= 15) && (level == 1))
{
level = 0;
changeMap(level,96,200);
//changeMap(level,1999,200); petit probleme quand je met un nombre > 256 pb u8-u16???
}
isInTheScreen(Trilby);
isInTheScreen(Banjo);
follow(Trilby,Banjo); /pour que Trilby suive Banjo
jump(Banjo);
gravity(Banjo);
}

La focntion ChangeMap:void changeMap(u8 level,u16 new_x,u16 new_y)
{ ham_ResetBg();
ham_SetBgMode(0);
//=======================
speed = 4;
// --- Load Map Principale --- Hel[1] ---
LEVEL2POWER=8; //en fait faut mettre LEVEL2POWER=n ou 2^n = longueur map
switch (level)
{ case 0 :
{
// Mise en place de la Map de Collision
BG=&port_v4_part01_col;
// Initialize the palettes
ham_LoadBGPal256((void*)port_v4_part01_palette);
// Setup the tileset for our image
ham_bg[0].ti = ham_InitTileSet((void*)port_v4_part01_tiles,SIZEOF _16BIT(port_v4_part01_tiles),1,1);
// Setup the map for our image
Map0 = hel_MapInit(0, 256 , 64 , FALSE, &port_v4_part01_map); //longueur map,largeur
ham_InitBg(0, TRUE, 2, FALSE);
// Setup the tileset for our image
ham_bg[1].ti = ham_bg[0].ti;
// Setup the map for our image
Map1 = hel_MapInit(1, 192 , 48 , FALSE, &port_v4_part01_map_fond); //longueur map,largeur
ham_InitBg(1, TRUE, 3, FALSE);
// Setup the tileset for our image
ham_bg[2].ti = ham_bg[0].ti;
// Setup the map for our image
Map2 = hel_MapInit(2, 256 , 64 , FALSE, &port_v4_part01_map_front); //longueur map,largeur
ham_InitBg(2, TRUE, 0, FALSE);
//placement des personnages
sprite[Banjo].y = new_y;
sprite[Banjo].x = new_x;
sprite[Trilby].y = new_y - 20;
sprite[Trilby].x = new_x - 20;
break;
}

case 1 :
{
// Mise en place de la Map de Collision
BG=&port_v4_part02_col;
// Initialize the palettes
ham_LoadBGPal256((void*)port_v4_part02_palette);
// Setup the tileset for our image
ham_bg[0].ti = ham_InitTileSet((void*)port_v4_part02_tiles,SIZEOF _16BIT(port_v4_part02_tiles),1,1);
// Setup the map for our image
Map0 = hel_MapInit(0, 256 , 64 , FALSE, &port_v4_part02_map); //longueur map,largeur
ham_InitBg(0, TRUE, 2, FALSE);
// Setup the tileset for our image
ham_bg[1].ti = ham_bg[0].ti;
// Setup the map for our image
Map1 = hel_MapInit(1, 192 , 48 , FALSE, &port_v4_part02_map_fond); //longueur map,largeur
ham_InitBg(1, TRUE, 3, FALSE);
// Setup the tileset for our image
ham_bg[2].ti = ham_bg[0].ti;
// Setup the map for our image
Map2 = hel_MapInit(2, 256 , 64 , FALSE, &port_v4_part02_map_front); //longueur map,largeur
ham_InitBg(2, TRUE, 0, FALSE);
//placement des personnages
sprite[Banjo].y = new_y;
sprite[Banjo].x = new_x;
sprite[Trilby].y = new_y - 20;
sprite[Trilby].x = new_x - 20;
break;
}

default :
{ break; }
}
}
la fonction focuscam qui fixe la camera sur le heros : void focusCam(u8 s){
if(sprite[s].y-Ptx.Y>60){ hel_MapScrollBy(&Map0,0,4); hel_MapScrollBy(&Map2,0,4); hel_MapScrollBy(&Map1,0,2); }
else if(sprite[s].y-Ptx.Y<20){ hel_MapScrollBy(&Map0,0,-4);hel_MapScrollBy(&Map2,0,-4); hel_MapScrollBy(&Map1,0,-2); }

if(sprite[s].x-Ptx.X>100){ hel_MapScrollBy(&Map0,4,0);hel_MapScrollBy(&Map2,4,0); hel_MapScrollBy(&Map1,3,0); }
else if(sprite[s].x-Ptx.X<40){ hel_MapScrollBy(&Map0,-4,0); hel_MapScrollBy(&Map2,-4,0);hel_MapScrollBy(&Map1,-3,0); }
} // [ Recadre la "caméra" sur le sprite s ] .


Bref, quand je passe du niveau 0 au 1 ma map front est décalé vers le bas...
Quand je repasse de la 1 a la 0 j'ai une erreur de mapsrollby... ARG!
Les Screens :
level 0...........................level 1......................retour au 0
http://banjokazooie.free.fr/site/problemes/060514/img.GIF
la rom (http://banjokazooie.free.fr/site/problemes/060514/Project.rar)
Si quelqu'un a déjà eu ce genre de probleme...
Merci!!!
PS : :-' Désolé pour la mise en page...

Dr.Vince
14/05/2006, 21h10
hum, me semble que la réponse à ta question se trouve dans le dernier screen.....

omg
14/05/2006, 22h43
Oui mais je n'ai pas réussi a savoir pourquoi il me dit ça... Mes coordonnées sont pourtant bonne...

Dr.Vince
14/05/2006, 23h39
alors déjà pour la question qui se trouve dans ton code :
256 pb u8-u16???

oui, u8 = 0 à 255

sinon pour ton problème, si j'ai bien compris quand banjo arrive à une certaine distance tu changes les fonds, est-ce que tu remet à zéro la valeur de ton scroll ??

sinon tu sais que tu peux utiliser une fonction bien pratique de VHAM pour débugger :

ham_VBAText();


genre :

ham_VBAText("Valeur = %d\n",mavaleur);


ça écrit dans la log de VBA, il te suffit ensuite lors de l'exécution dans VBA d'afficher la log et de regarder tes traces, comme ça tu pourras détecter exactement où se situe le problème et les valeurs qui posent problème

omg
15/05/2006, 09h44
Je vais essayer ça demain Dr Vince!