PDA

Voir la version complète : [GBA][Aide] Effacer un sprite


Neumann
27/04/2007, 21h27
Bonjour à tous !
Je vais vous explique tout d'abord le concept de mon jeu pour que vs puissiez m'aider...

Je fais actuellement un snake, et pour l'animer voici mon idée:

je crée un tableau X et un tableau Y. x[0] et y[0] sont les coordonnées de la tete que j'incrémente ou décrémente (ca se dit ?) pour animer la tete. Et en meme temps avec de toucher aux coordonnées de la tete, je décale dans les tableaux les coordonnées d'un cran vers la droite lors de chaque interruption. Par exemple x[8] contient la coordonnée X que la tête avait 8 interruptions auparavant. Mes bouts de corp font 8*8 donc j'utilise les coordonnées [8*i] pour animer le i-ème bout de corp.

Mais représenter un virage que charge un sprite représentant un serpent "plié" au niveau du virage. Mon problème c'est que je ne trouve pas de moyen d'effacer ce sprite quand la totalité du corps est passé.

J'attache le rom pour que vous puissiez vous représenter par vous même ce que je raconte...

Ainsi que le code source.

J'ai pensé à 2 idées:
-Lorsque un virage est crée, je sauvegarde ses soordonnées dans un tableau et des qu'elles coincident avec celles du dernier bout de corps, j'effece le sprite.

-Lorsque je crée un virage, j'initialise un compteur à la valeur <nombre de bout de corps>*8 que je décrémente à chaque interruption. Des que le compteur tombe à zéro, j'efface le sprite.

J'ai mis en oeuvre ces 2 méthodes mais aucune ne marche, la fonction <ham_DeleteObj();> fait planter l'ensemble du programme en faisant disparaitre la tete.

Si quelqu'un à une idée... je suis preneur :D

Pitt
27/04/2007, 21h45
Prends une gomme ! :ph34r:

Plus sérieusement, je suis pas un spécialiste de HAM, mais il doit y avoir une fonction pour cacher (hide) le sprite. A moins que tu aies vraiment besoin de l'effacer de la mémoire vidéo, auquel cas la fonction que tu cites ... hem. devrait fonctionner ...

Neumann
28/04/2007, 16h20
Je dois absolument supprimer le sprite de la mémoire car j'en crée un nouveau a chaque virage donc la mémoire se remplit vite.

if (n>1) {ham_DeleteObj(virage_sprite[virage_compteur_effacer]);
++ virage_compteur_effacer;}

J'ai rajouter ca dans mon code, en gros ca efface le virage 0 puis le virage 1... etc lors de chaque création de bout de corps. Et au final ca fait se décaler mes sprites, et disparaitre la moitié de la tete par moment.

Je ne comprends pas comment cette ligne peut faire planter le tout. Mais le plus bizzare c'est que quand je remplace ces qq lignes par:

if (n>1) {ham_SetObjXY(virage_sprite[virage_compteur_effacer], 241,161);
++ virage_compteur_effacer;}

Et bien j'ai exactement le même problème.
Je comprends vraiment pas là.

Pitt
28/04/2007, 16h31
Hmmm ta variable virage_sprite[virage_compteur_effacer] contient bien le numéro du sprite ?

Neumann
28/04/2007, 16h44
Oui evidement, <compteur_virage_effacer> commence a 0 et s'incrémente a chaque effacage. Entre temps virage_sprite[] crée un sprite en 0 puis en 1.. etc.

Et il y a au moins un virage crée avant le premier effacage.

Neumann
28/04/2007, 19h47
J'ai voulu tester la fonction ham_DeleteObj d'une autre manière:

if (F_CTRLINPUT_A_PRESSED) {
ham_DeleteObj(virage_sprite[virage_compteur_bis]);
++virage_compteur_bis;
}

Je rapelle que les sprites des virages sont chargés dans le tableau <virage_sprite[]> en commencant bien entendu par l'indice 0.

J'initialise le compteur virage_compteur_bis à 0 et quand j'appuie sur A je supprime le sprite virage 0 et incrémente le compteur_bis pour le prochaine sprite.

Or avec ce code, quand j'appuie sur A, et bien non seulement ca ne supprime pas le sprite virage, mais ca influe sur l'affichage de la tête (les 3 quarts de la tête deviennent transparents).

Je suis perdu je sens que je vais abandonner ce projet sans doute trop ambitieux pour un premier projet...

Yodajr
29/04/2007, 07h30
Je ne sais pas du tout si ca peux aider, mais dans la flemme de regarder ton code :whst:
Je te conseille d'utiliser la lib complémentaire à HAM : HEL (http://www.console-dev.de/hellibrary.html)
Elle est plus mieux :p moins bugué, plus rapide, plus complète, etc...
Maintenant, dans mes jeux GBA, y'a plus que des hel_qqchose :D

[PS] Pour infos : 1) l'auteur de HEL a aussi créé VHAM
2) VHAM est à la version 2.6

Pitt
29/04/2007, 12h00
Ah bah c'est du beau ! Je lui demande de nous sortir son code pour qu'on y comprenne qqchose, et toi t'as la flemme de le regarder ... :lol:
Rhalala ma p'tite dame, les admins de nos jours, c'est plus c'que c'était ... :p

Arcadia
29/04/2007, 13h23
Je suis un peu comme yodajr, j'ai la flemme de tout lire mais si je m'en tiens au titre du topic, et sachant que l'on est sous HAM, et bien il y a une fonction toute faite pour afficher ou masquer un sprite :

ham_SetObjVisible (sprite, visible);

Si visible = 1, le sprite est affiché, si visible égal 0, et sprite est....caché



[EDIT] Ah ouais, j'ai lu un peu plus en détail le topic. Bon visiblement tu as besoin de détruire les sprite pour un souci de mémoire (faut y aller pourtant pour en arriver là !). Maintenant la fonction ham_DeleteObj fonctionne bien normallement...je vais peut-être jeter un oeil dans tes sources quand même...

Neumann
29/04/2007, 13h49
Oui en effet j'ai besoin de supprimer les sprites car ma méthode (que je vais peut-être revoir car c'est "lourd") c'est de créer un nouveau sprite pr chaque virage. Je dois donc supprimer les sprites au fur et à mesure pour ne pas saturer la mémoire.

Ce qui est bizarre c'est que quand je remplace ham_DeleteObj() par Ham_SetObjXY(virage_sprite[], 241, 161); ce qui normalement place le sprite hors de l'écran, et bien j'ai les même symptomes que précedement, cad que les 3 quarts de la tête deviennent invisibles et que les autres sprites se décalent.

Je n'y comprends goutte, car cette commande semble influer sur des parties du code qui n'ont aucun rapport...


Je rappelle que c'est mon premier projet GBA donc n'hésitez pas à critiquer mon code pour ceux qui ont le courage de le lire :P

Arcadia
29/04/2007, 14h07
Je ne sais pas si ça peut t'aider, mais sous HAM j'ai souvent eu des petits problème, notamment avec les sprites, et je ne comprenais pas d'ou ils venaient, car il n'y avait pas d'explications. J'ai deux parades que tu peux essayer...

La première, c'est que quand je déclare une tableau quelconque, il m'arrive d'avoir des sprites corrompus : l'images est degueulasse, alors qu'avant la déclaration du tableau, tout était parfait...pourtant rien ne lie le tableau avec le sprite ! Dans ce cas là, je "gonfle" volontairement le tableau. Au lieu de déclarer 5 valeurs par exemple, j'en déclare 6...et là miracle !

La seconde consiste à déplacer dans le fichiers makefile, les différentes déclarations de ".o". Je regroupe les fichiers correspondant à la déclaration des graphs en premiers, et je les place en tête de liste.

Voila, bon courage ^^...

Neumann
29/04/2007, 16h36
Est-ce que l'on peut utiliser la lib HEM sous vHAM ?

J'ai suivi le guide d'installation de cette lib et quand je tente d'ouvrir un exemple fourni avec cette lib, vHAM me dit que le format du projet n'est pas valide.

La version 2.8 téléchargée sur le site officiel devient 2.4.2 une fois installée

Pitt
29/04/2007, 17h03
Sans problèmes, normalement. Regarde la doc de HEL pour voir s'il n'y a pas un truc à rajouter.

Neumann
29/04/2007, 20h25
PROJET ABANDONNE

Trop complexe pour un premier jeu. Je vais commencer un truc plus simple dès demain. Merci quand même. J'aurais appris des choses au moins ;)

Pitt
29/04/2007, 20h58
Désolé de pas avoir pu t'aider, mais je ne code pas sur GBA avec HAM/HEL.
Mais n'abandonne pas pour si peu !
Je suis sûr que quelqu'un va pouvoir t'aider.

Yodajr
30/04/2007, 05h09
Bon, quelques trucs :
Enlève le code du vbl. Oui je sais, c'est la partie négative d'apprendre via les tutos d'aaron roger. Ta vbl_func() ne doit contenir que le ham_CopyObjToOAM() et presque rien d'autre (souvent quelques lignes de code relatives aux libs son)
Tout le reste doit etre dans la boucle infinie while.
Lance un nouveau projet avec vbl dans VHAM, il te mettra la structure automatiquement.

Les exemples fournis avec la derniere version de HEL sont surement compilés avec la derniere version de VHAM, c'est celle que t'a ?
Sinon oui bien sûr que c'est compatible, dans mon message précedent je viens de dire que c'est le même gars qu'a fait les 2...

Sinon, si tu ne l'a pas encore effacé, envoie le dossier complet de ton projet (avec images et tout et tout) tu as éveillé ma curiosité.

j'ai souvent eu des petits problème, notamment avec les sprites, et je ne comprenais pas d'ou ils venaient, car il n'y avait pas d'explications.
J'en ai ptetre une : HAM :p
Sans vouloir dire que c'est la cause de tes soucis, HAM est buguée et n'est plus mise à jour depuis la version 2.8 que tout le monde utilise.
Alors que HEL est régulierement mise à jour (la derniere version, la 2.3, est sortie le 9 de ce mois d'avril) et peter (emanuel et peter, ils sont balezes pour choisir des pseudos ces 2 là ^^) a donc en quelque sorte repris le flambeau de cette lib GBA en corrigeant les bugs, en optimisant la vitesse et en offrant toujours plus de possibilités.
Donc je conseille vivement à tous les utilisateurs de HAM d'installer HEL et de bien parcourir la doc (http://www.console-dev.de/hel/docs/) à la recherche des commandes ham_ qui ont leur équivalent en hel_ , elles sont quasiment toutes bien meilleures ;)

Arcadia
30/04/2007, 10h52
HAM est buguée
Tu veux dire qu'il y a un os dans HAM ?

Neumann
30/04/2007, 13h46
Voici tout mon dossier snake avec code et gfx.
Je commence a étudier la lib HeL.

Pour le moment et jusqu'à jeudi je suis en examens, mais après je vais me pencher plus sérieusement la dessus.

Merci pour votre aide en tout cas :D


Sinon j'utilise bien la dernière version de HAM, la 2.8.
Mais quand on fait <a propos de HAM> la version affichée est 2.4.2, alors que dans le log d'installation c'est indiqué 2.8...
Chelou

Dr.Vince
02/05/2007, 00h31
Bon je te met la réponse de Yodajr qui a posté hier à 5h00 du mat, alors que le forum était fermé :


Non tu mélange :
HAM c'est la lib GBA d'emanuel, ici (http://www.ngine.de/).
VHAM c'est l'IDE de peter, ici (http://www.console-dev.de/visualham.html).

Le pack HAM que tu télécharge sur ngine contient la derniere version de HAM (2.8) et une ancienne version de VHAM (2.4.2)
Depuis VHAM est passé à la 2.6


lol Arcadia, je suis resté un moment avant de me rappeler la traduction google mémorable des tutos d'aaron ^^

Yodajr
02/05/2007, 08h04
Oui vince, j'ai calculé trop tard que mon post allais disparaitre, je l'avais copié pour le reposter aujourd'hui, tu m'a devancé ^^

Neumann
02/05/2007, 16h50
Ok Yodajr merci pour l'info j'ai pompé la dernière release de vHAM, et je me penche sur HEL dès demain (fin des exams powa).

Je vais par ailleurs refaire complètement le système d'affichage du snake, j'ai eu l'idée d'un système moins lourd et a priori moins buggé.

Neumann
04/05/2007, 20h45
Exams terminés, je me repenche sur mon projet.

D'abord, après avoir regardé les exemples fournis avec la lib HEL et en regardant la doc fournie avec, je vais continuer mon projet en HAM, car c'est quand même moins compliqué lol. Je préfère faire un projet complet avec une lib qui possède de s tutos, pour commencer.


Enlève le code du vbl. Oui je sais, c'est la partie négative d'apprendre via les tutos d'aaron roger. Ta vbl_func() ne doit contenir que le ham_CopyObjToOAM() et presque rien d'autre (souvent quelques lignes de code relatives aux libs son)
Tout le reste doit etre dans la boucle infinie while.

C'est ce que j'ai fait seulement comment fait-on pour que la boucle ne s'execute une seule fois par rafraichissement de l'écran? Dans HEL il y a une fonction pour faire cela, mais je n'ai pas trouvé l'équivalent dans HAM.

Merci d'avance ;)

Yodajr
05/05/2007, 07h13
Comme je t'ai dit plus haut, tu fait "nouveau projet" avec VHAM, puis "C with VBL" ou un truc du genre.
Il va te filer le template du projet.
Tu mettra ton code dans la boucle while(true), dans le if(g_newframe)

PS: oublie pas de virer le MULTIBOOT