PDA

Voir la version complète : [NDS][Aide] Demande conseils pour débuter en prog DS


sensei
14/02/2006, 11h14
Salut,

en voyant tout ces magnifiques homebrews, j'ai une grande envie d'essayer d'en faire autant :)

Je n'ai JAMAIS développé en C ni en VB, je connais juste le PHP et je sais comment fonctionne les structures if then else... je ne sais pas ce qu'est un pointeur (ca a l'air important...).

Est ce possible juste avec ces bases ?

Sinon j'ai vu plusieurs tuto qui ont l'air complet, quest ce que Palib ? je sais juste que ca permet de dev sur DS, y a t il d'autres moyens ?

Quel est le plus facile ?

Merci

Costello
14/02/2006, 11h23
honnêtement, non, je pense que connaître le PHP ne t'aidera pas spécialement ...
et si tu ne connais pas la notion de pointeur, ça va s'avérer encore plus difficile, car ça signifie que tu n'as pas vraiment en tête le fonctionnement général de la mémoire...

si tu veux quand même te lancer, tu peux te rendre ici:
http://www.playeradvance.org/old/index.php?showforum=53
c'est l'ancien forum de Playeradvance, il y avait pas mal de tutos et d'aide pour débuter la prog DS...

bonne chance!
a+

Mollusk
14/02/2006, 11h41
On va encore dire que je me fais de la pub, mais bon...

www.palib.info/wiki <- tutos en anglais pour tous les niveaux, y compris tutos bases de C
www.palib.info/wikifr <- le meme, mais en francais, en cours de traduction...

Dr.Vince
14/02/2006, 12h19
regarde quelques tutos en C sur le net (tu apprendra ce qu'est un pointeur comme ça)

PAlib est une librairie qui te permet de créer facilement des applications/jeux sur DS
je te conseille vivement de l'utiliser vu que tu ne connais rien au C, car si tu dois en plus tte taper le fonctionnement du hard t'es pas sortis de l'auberge

Mollusk
14/02/2006, 12h38
Ah, j'avais pas lu ton post en entier (notamment sur PAlib).

En fait, pour développer sur DS t'as plusieurs choses/couches :
- devkitPro, qui te permet de compiler ton code pour le rendre utilisable sur (donc obligatoire)
- libnds, qui est une libraire qui permet de programmer sur DS, apportant pas mal de petites choses, du style le stylet, les touches, etc... mais ca reste assez basique et il te faudra connaitre le fonctionnement de l'affichage des sprites, des fonds, etc... ce qui est parfois un peu ardu pour démarrer
- PAlib, qui est une surcouche de libnds, en gros, et qui a pour but de simplifier tout ce qui n'est pas simple : affichage de sprites, de fonds, dessiner à l'écran, système simplifié pour le stylet et le pad, etc... Après tu es libres d'utiliser plus ou moins de choses. Ceci ne dispense bien sûr pas d'en apprendre un peu plus sur le fonctionnement de la DS, puisque sinon tu risques de ne pas comprendre pourquoi tu ne peux pas charger tel super grand fond (mémoire, nombre de tiles différentes limitées, etc...)

Costello, au sujet des tutos sur l'ancien PA, je crains que les choses aient un peu changées depuis, donc c'est pas parfaitement à jour :S

N64Francois
14/02/2006, 14h19
Avant d'utiliser Ham, je n'avais jamais codé en C. J'avais seulement de toutes petites connaissances en QBasic et VB, et une connaissance moyenne du PHP.
Je trouve que le fait de connaître le PHP m'a apporté un grand plus :
- c'est à peu près la même structure
- on y retrouve plein de choses identiques (fonctions/instructions)

Mollusk
14/02/2006, 14h32
Je pense que toute expérience, meme en language différent, est bénéfique, ne serait-ce que pour 'développer' la 'logique'.

Et puis on est aussi assez nombreux ici il me semble à n'être partie d'aucunes bases, donc ca devrait aller ;)

sensei
14/02/2006, 14h43
Merci pour toutes ces infos, liens et tutos !

J'ai toutes les explications que j'attendais :)

Maintenant, c'est clair, je vais me tourner vers palib et essayer deja d'afficher quelque chose, puis de bouger quelques sprites avec la croix. j'essaierai ensuite de gérer les collisions et de tester les zones pour declencher telles ou telles actions.

C'est parti, jme lance... ^^

archilolo
14/02/2006, 15h22
Tu voudrais faire quoi, comme genre de jeu ? :)

sensei
14/02/2006, 16h10
Deja tout dépends de comment je vais me débrouiller en prog... :p

Dans un premier temps, et si j'arrive à afficher un sprite + le faire déplacer avec la croix, j'essaierai de faire un pong like puis si ca marche, j'enchaine direct avec un pong like mais en dessinant la barre au stylet (avec longueur limitée bien sur :) )

Mollusk
14/02/2006, 16h18
Bonne idée tout ca :) Toujours commencer par quelque chose de simple !

Bobby Sixkilla
14/02/2006, 16h48
Bon courage! ^^ Je pense aussi que connaître le PHP t'aidera pour le C. ;)

archilolo
14/02/2006, 17h20
si ca marche, j'enchaine direct avec un pong like mais en dessinant la barre au stylet (avec longueur limitée bien sur :) )

Il y a un mini jeu de Monkey Ball DS comme ça, je crois ?

sensei
14/02/2006, 20h08
Grace aux tutos, j'ai réussi à afficher le celébrissime hello world et de changer le texte.

Mollusk
14/02/2006, 20h15
ah, bah ca démarre bien alors :p

Nesgba
14/02/2006, 20h37
Ah, j'avais pas lu ton post en entier (notamment sur PAlib).

En fait, pour développer sur DS t'as plusieurs choses/couches :
- devkitPro, qui te permet de compiler ton code pour le rendre utilisable sur (donc obligatoire)
- libnds, qui est une libraire qui permet de programmer sur DS, apportant pas mal de petites choses, du style le stylet, les touches, etc... mais ca reste assez basique et il te faudra connaitre le fonctionnement de l'affichage des sprites, des fonds, etc... ce qui est parfois un peu ardu pour démarrer
- PAlib, qui est une surcouche de libnds, en gros, et qui a pour but de simplifier tout ce qui n'est pas simple : affichage de sprites, de fonds, dessiner à l'écran, système simplifié pour le stylet et le pad, etc... Après tu es libres d'utiliser plus ou moins de choses. Ceci ne dispense bien sûr pas d'en apprendre un peu plus sur le fonctionnement de la DS, puisque sinon tu risques de ne pas comprendre pourquoi tu ne peux pas charger tel super grand fond (mémoire, nombre de tiles différentes limitées, etc...)

Costello, au sujet des tutos sur l'ancien PA, je crains que les choses aient un peu changées depuis, donc c'est pas parfaitement à jour :S
si je puis me permettre d'apporter quelques modif:

En fait, pour développer sur DS t'as plusieurs choses :
- un compillateur (gcc par exemple)
- un editeur de texte (notepad par exemlpe)
- ou un ide que tu configure pour faire les 2

bien sur tu as des tas de fichiers a taper pour une bonne compillation (surtout sur nds)
donc c'est la que le devkitarm/devkitpro te vien en aide il suffi juste de l'installer et c'est parti sinon tu as un autre devkit officiel nintendo mais c'est aussi avec gcc.
bien sur ce qu'a oublié de dire mollusk (comme a chaque fois ?) c'est que tu n'a pas forcement besoin de surcouche (defines, lib...) pour coder, mais ca t'aide a moin te prendre la tete c'est clair, mais rien nent'empeche de rechercher les registres dont tu as besoin pour ton jeu et les taper toi meme tu apprendre par la meme occasion a parfaitement maitriser le hard.

Mollusk
14/02/2006, 20h44
Lol, on va pas se refaire le meme topo à chaque fois nes :p

Demande conseils pour débuter en prog DS et en plus il ne code pas encore en C... donc pour démarrer c'est plus simple avec une lib (au moins libnds), après je pense que s'il le désire il n'aura pas besoin de nous pour prendre son envol dans d'autres direction.

Mais pour apprendre le C... et le dev DS... et puis comme il dit, il ne sait pas ce qu'un pointeur est... enfin bon...

Nesgba
14/02/2006, 21h35
faudrai creer un sujet sur le nouveau pa pour eviter de se prendre le bec a chaque fois ;) j'essaye de ne pas poster a chaque coup mais c'est plus fort que moi il manque un vide et faut que je le comble.

pour moi le gars doit disposer d'outils les + brutes qui soit pui si il le desire ensuite il peut choisir des surcouches pour son confort mais il faut a chaque fois enumerer les default que peuvent engendrer ces surcouches !
une lib doit etre proposé que en choix secondaire.

le gars demande comment coder sur nds ? ca me parrai logique de lui expliquer TOUT les moyens sans en privilegier un (pourquoi citer palib et pas une autre ? et pourquoi citer un compillo et pas un autre ?) il faut vraiment un post avec toute la doc et qui n'est pas ciblé sinon on se prendra la tete tout les 2 tout le temp pour des broutilles ;)

Mollusk
14/02/2006, 21h44
bah en meme temps c'est lui qui parle de PAlib dans son premier post ;)

sinon, ouvre un topic, et puis on rajoutera ce qui manque :)

M@cZér0
14/02/2006, 23h21
bah en meme temps c'est lui qui parle de PAlib dans son premier post ;)

sinon, ouvre un topic, et puis on rajoutera ce qui manque :)

C'est une bonne idée!!:rolleyes:

Je voudrais aussi me mettre a la prog DS mais je ne connais ABSOLUMENT RIEN DU TOUT et aucun langage de prog!! Ca va être dur!:S :blink:
Au fait je propose que les membres programmant expliquent tout de A à Z sur la prog, un peu comme le wiki où chaque personne rajouterais son grain de sel et où le topic serait régulièrement amélioré!

PS : Est-ce que commencer sur de la prog GBA et plus simple pour commencer (et bénéfice pour une futur prog DS) ??:huh:

Mollusk
14/02/2006, 23h40
PS : Est-ce que commencer sur de la prog GBA et plus simple pour commencer (et bénéfice pour une futur prog DS) ??
Si tu veux programmer sans lib, oui, c'est plus simple et ca ressemble pas mal. Avec lib pas forcément

Pour le wiki, j'ai fait ca pour le dev avec PAlib sur DS... :)

Fab
15/02/2006, 02h27
Personnellement, je pense qu'il vaut mieux commencer par des tutoriaux de C avant de se lancer dans la prog DS si on n'a aucune connaissance en programmation. Ca me semble mieux, ne serait-ce que pour assimiler la syntaxe ;)

sensei
16/02/2006, 09h54
salut,

j'ai un ptit problème lorsque je teste PAGfx pour creer un sprite.

Il me dit que ma version de .Net Framework est pas bonne. J'ai Xp Sp2.

Du coup jsuis bloqué... :hum:

Dr.Vince
16/02/2006, 11h44
bah télécharge la dernière version du framwork .Net

sensei
16/02/2006, 12h17
J'ai téléchargé .net sur le site de microsoft, quand je veux l'installer, il me dit que j'ai deja une version + récente...

Sinon j'avance à très petit pas mais j'avance :)

J'ai réussi à afficher un texte sur l'ecran du haut et du bas, et à faire afficher un texte
si j'appuye sur l'ecran tactile. (avec un while et la fonction stylusheld).

Sinon vous utilisez quel émulateur pour tester les prog ? j'ai l'impression que ideas s'en sort mieux que dualis...

thoduv
16/02/2006, 12h19
DeSmuMe ! :dblthumb:

sensei
16/02/2006, 19h13
Pas facile... mais j'avance !

je viens de faire enfin marcher le frontend pagfx et, encore plus dur, de convertir un sprite (dur dur de trouver un bon format ! ).

Je vais maintenant l'inclure dans le code et tenter de le faire bouger B)

PS : DeSMume fonctionne très bien !

Mollusk
16/02/2006, 20h19
ah, bah ca avance bien tout ca :) hésite pas à demander si tu as des questions, des précisions, etc...

sensei
17/02/2006, 00h10
J'ai réussi à afficher le beau sprite que je viens de dessiner sous paint shop :p

Et j'ai réussi à le faire bouger a droite avec un FOR et en incrémentant x de 1 pendant quelques secondes.

Demain j'essaie de le faire bouger au pad et au stylus car la j'en ai marre :S

Vraiment prenant la prog DS :D

Mollusk
17/02/2006, 00h17
:d

sensei
18/02/2006, 00h32
salut,

j'ai une ptite question :

j'arrive a importer des sprites sans problèmes ( quoi que je n'arrive pas à avoir plus gros que 64x64...) mais j'aimerais tracer une simple ligne avec des coordonnées X et Y.

Il me semble qu'il n'y a pas d'explications à ce sujet sur la doc wiki de palib.

Merci

Nesgba
18/02/2006, 00h51
salut,

j'ai une ptite question :

j'arrive a importer des sprites sans problèmes ( quoi que je n'arrive pas à avoir plus gros que 64x64...) mais j'aimerais tracer une simple ligne avec des coordonnées X et Y.

Il me semble qu'il n'y a pas d'explications à ce sujet sur la doc wiki de palib.

Merci

64x64 c'est le max mais tu peut toujours utiliser plusieurs sprites et si ils ont une structure chaqun tu fait en sorte que les autres sprites suivent le premier en se basant sur celle ci.

une ligne, de quel taille ? qui puisse se deplacer ?
tu veut la tracer sur l'ecran ou sur un sprite ? en quel mode ?

Mollusk
18/02/2006, 01h05
sensei, en fait il manque la doc concernant le mode 8 ou 16bit, parce que... j'ai manqué de temps ^^
Mais c'est très simple, suffit de faire un PA_Init8bitBg, et apres t'as une fonction pour tracer des traits, des rectangles, etc... ou juste dessiner au stylet. Regarde la doc, dans la section "Draw" il me semble

sensei
18/02/2006, 11h20
En fait, je veux dessiner une ligne, mais pas au stylet. Mon idée est de la poser sur un socle au milieu comme pour faire une balance. Si un objet tombe à droite alors je change les coordonnées X et Y pour faire basculer la ligne en diagonale... (chose qu'on ne peux pas faire si je dessine une ligne en tant que sprite je pense).

Je vais essayer de voir pour cette fonction "PA_Init8bitBg". Elle est mentionnée sur Palib.com, je vais essayer de me débrouiller.

Mollusk
18/02/2006, 11h46
pourquoi pas juste utiliser un sprite et le faire tourner pour changer l'inclinaison ?? ton sprite tu peux le faire en 64x32 et le zoomer pour qu'il fasse 128x64, ca suffirait ou pas ?

sensei
18/02/2006, 12h01
Dis comme ca, ca à l'air simple... mais pas pour moi ! :S :)

Je vais deja essayer avec une ligne et si ca marche pas, je me lancerai dans la gestion des sprites et tout ce que ca contient (zoom rotation ...).

J'ai une vague idée de jeu... Ce serait un perso sur cette balance donc, avec des pierres qui tombe dessus et font incliner cette balance. Chaque inclinaison provoquerai des sauts du perso, et cette inclinaison le ferait glisser... => Le but étant de ne pas tomber de cette balance...

Mollusk
18/02/2006, 12h08
ca a l'air marrant. Je pense que c'est gérable avec un simple sprite, et ca serait plus rapide et plus pratique pour toi que de dessiner une 'vraie' ligne

Fab
19/02/2006, 02h55
Je suis du même avis que Mollusk à propos des sprites.

N'hésite pas à voir les exemples de PA_lib (PAlibExamples\Sprites), il y a pas mal de choses simples et efficaces.
Au niveau des rotations et des positions pour un sprite (avec pa_lib en tous cas) :
- pour incliner un sprite, l'inclinaison se fait dans le sens contraire des aiguilles d'une montre, et les angles vont de 0 à 511
- les rotations se font autour du centre du sprite, fais attention à mettre ta ligne au centre du sprite
- les coordonnées du sprites sont celles du coin supérieur gauche

sensei
20/02/2006, 09h54
Salut,

j'ai essayé la rotation d'un sprite mais il y a un ptit souci : pour un sprite en 64x32, lorsqu'il tourne, le sprite est limité par la hauteur en 32 et donc tout ne s'affiche pas...
De plus, ma barre doit faire pratiquement toute la largeur de l'ecran, il me faut donc coller au moins 4 sprite de 64, non ?

Sinon ben j'ai réussi à tracer une ligne, mais c'est pas bien beau :(

Mollusk
20/02/2006, 15h11
Pour le sprite, quand tu veux tourner il vaut mieux toujours prendre un sprite carré, sinon effectivement t'as des mauvaises surprises :p

En plus, tu peux activer l'option DblSize, qui te permet de doubler la taille du cadre, donc tu pourrais avoir 128x128 avec un bon zoom
S'il te faut tout l'écran en largeur, tu pourrais aussi utiliser un fond rotatif :)

sensei
20/02/2006, 16h31
SAlut !

Bon j'ai finallement j'ai mis mon projet de coté car trop complexe pour l'instant.
Merci tt de même pour les conseils, et je partirais sur un sprite pour faire ma balance.

Je veux maintenant faire un truc plus simple, pour ne pas bruler les étapes et avoir de bonnes bases. Le projet YAYAXX ( fabuleux) ma donné cette idée.

Je veux faire un truc dans le même style, avec un sprite qui apparait aléatoirement pendant un ptit instant. Le but etant de le "cliquer " au stylet. Si on le clique au bon moment, score + 1. Un truc tout simple mais deja bien difficile pour moi :)

J'ai pas mal avancé : J'ai crée un sprite (mario) et j'arrive à le faire apparaitre aléatoirement ( avec PA_RandMAx pour coordonées x et y) pendant 1 seconde. Puis ensuite il apparait à un autre endroit 1 sec ...etc etc etc
Sur l'ecran du haut, j'affiche score suivit d'une variable qui s'incrémente de 1 si j'arrive à toucher le sprite (avec PA_SpriteTouched). Ca aussi ca marche :)

Voici mes questions :

Mon sprite a une couleur bizzare (il est bleuté).
Ensuite il apparait disparait une dizaine de fois et ensuite plus rien, alors que la boucle est infinie (pas testé sur la DS encore)
J'aimerais le faire disparaitre instantanément dès que je le touche, la fonction c'est PA_deletesprite ?

MERCI

Mollusk
20/02/2006, 16h36
Bleuté ? Ca me parait bizarre, tu convertis avec quoi et en quel mode ? Tu testes sur Dualis (parait qu'il a des soucis de couleurs)

Pour éviter des soucis de mémoire, évite le plus possible DeleteSprite... Pourquoi ? Quel est l'intéret d'effacer un sprite (impose de le retirer de la mémoire) et de le recréer (recopier dans la mémoire) à chaque fois ??? Il suffit de la placer en X = 256 pour qu'il ne soit plus visible, et tu le fais revenir pour qu'il soit à nouveau visible :)

sensei
20/02/2006, 23h41
J'en chie ! :)

J'ai changé de pc et mon sprite a retrouvé une couleur nikel :)

OK pour ne pas utiliser de deletesprite.

Par contre : Mon sprite se crée bien sur l'ecran avec des coordonnées aléatoires x et y, reste 2 sec et boucle pour en faire un autre à un endroit aléatoire. Ca marche qques secondes et après plus rien, ecran noir, a chaque fois (sur DS et emu).

Dans ma boucle, je recrée a chaque le sprite (avec PA_CreateSprite ) avec des coordonnées différentes. Est ce la bonne solution ? Ca bouffe peu être toute la mémoire ? :o

N64Francois
21/02/2006, 00h08
Fait comme a dit Mollusk !
Tu le crées une fois au debut, et ensuite tu le déplaces (ou tu le caches en X>256) avec la fonction PA_SetSpriteXY().

Mollusk
21/02/2006, 00h22
CreateSprite tu finis par avoir un débordement de mémoire...

sensei
21/02/2006, 16h05
Ca marche Merci :)

Au lieu de recréer a chaque fois le sprite, j'utilise PA_SetSpriteXY.

Bon maintenant reste plus qu'a limité la vitesse car il m'en crée des diazines a la seconde alors que j'utilise PA_WaitForVBL();

Bon j'essaie de limiter les questions pour pas trop vous saouler :p

Tembargo
21/02/2006, 16h15
Hihi moi j'aime bien lire ce qui se passe ici, ça trace les débuts d'un jeune codeur. Avec les jours de doute, les jours où ça déconne, les jours où ça marche bien.. :w00t:

waxaw
21/02/2006, 16h58
ça c'est du "Forum Reality" !!! place des webcams un peu partout autour de ton pc et c'est tout bon !! :D

Mollusk
21/02/2006, 17h00
Non mais par contre l'idée que avait été lancée de démarrer un blog en meme temps que le dev, je la trouve excellente. Ca ferait comme ce topic, mais en puissance 10 :)

Dr.Vince
21/02/2006, 18h49
c'était un peu dans cette esprit là les début du dev sur l'ancien PA nan ??

sensei
21/02/2006, 20h18
Et oui les joies de la programmation ! les prises de tête et le bonheur quand ca marche :)

LA ca marche, j'ai mon sprite mario qui s'affiche bien au hasard en continu.

Je vais maintenant crée un sprite Sonic et le faire afficher au hasard aussi.

EDIT : Fais chier :devil:

Je viens de creer mon second sprite (sonic). Je fais un PA_LoadSpritePal et un PA_CreateSprite supllémentaire pour creer mon second sprite (je lui met au passage un autre sprite number).

Je teste et les 2 s'affichent mais le second est une bouillie de couleur, les formes reste cependant justes.
J'ai remarqué dans le code que c'est le dernier PA_CreateSprite qui s'affiche bien.

Une idée ?

Mollusk
21/02/2006, 23h45
Tu es sur d'utiliser 2 palettes différentes pour tes sprites (genre une numéro 0, une numéro 1), et de donner le bon numéro de palette à tes sprites ?

sensei
22/02/2006, 09h00
euh... non, en fait je suis même sur d'utiliser la même palette pour les 2 sprites ^^

Je pensais que seul le numéro de sprite suffisait...

Je teste ca dans la journée.

Merci !

N64Francois
22/02/2006, 09h28
Voici un petit lien qui pourrait t'interesser :
http://www.aaronrogers.com/nintendods/PA_Lib/
(les tutos sont en anglais)

sensei
22/02/2006, 11h10
Merci pour le lien, c'est tjrs bon d'avoir un max de doc !

Sinon mes deux sprites s'affiche bien maintenant, c'est génial !

PETITE QUESTION :

Est ce qu'on peut trouver l'equivalent de la commande goto sur la prog DS ? (du style condition goto la , condition2 goto ici ...)

Nesgba
22/02/2006, 11h22
Merci pour le lien, c'est tjrs bon d'avoir un max de doc !

Sinon mes deux sprites s'affiche bien maintenant, c'est génial !

PETITE QUESTION :

Est ce qu'on peut trouver l'equivalent de la commande goto sur la prog DS ? (du style condition goto la , condition2 goto ici ...)

bah tu code en c quand meme non, ta oublié ? ;)

Rebelotte:
Compteur++ ;
if (Compteur<600) goto Rebelotte ;

sinon la prochaine fois essaye de poster dans la section "aide" pas "projets" :)

thoduv
22/02/2006, 12h24
Ceci dis on ne peut que te conseiller d'éviter les goto en C si tu veux pas te retrouver avec un code buggant et dégueu ...

sensei
22/02/2006, 13h23
Merci Nesgab, et pour ta remarque, oui je code en C... depuis une semaine :-*

Gwoin
22/02/2006, 14h31
bah tu code en c quand meme non, ta oublié ? ;)

Rebelotte:
Compteur++ ;
if (Compteur<600) goto Rebelotte ;

sinon la prochaine fois essaye de poster dans la section "aide" pas "projets" :)

Loin de moi de vouloir critiquer, mais Thoduv a largment raison: pas de goto dans du code (il n'y a qu'en batch sous DOS que c'est permis... parce qu'on ne peux pas faire autrement)

La version du code serait plutot:

void Rebelotte() // si toutefois ce code à un sens
{
Compteur++ ;
if (Compteur<600)
Rebelotte() ;
else
AutreFonction();
}


et en plus propre:

void Rebelotte()
{
while (m_iCompteur < 600)
m_iCompteur++ ;

//si besoin est d'appeler une autre fonction apres ça
AutreFonction();
}

Nesgba
22/02/2006, 14h50
merci gwoin d'avoir rettapé mon code que j'ai ecrit pour montrer la syntaxe du goto en c <_<

sinon j'ai bien rigolé sur ton code...

concernant le goto si il existe c'est pour etre utilisé non ? ton compillo genere exactement le meme code pour un for/while que un goto.
apres question propreté de code j'ai pas tout pigé la ... tant que tu comprend ton code et qu'il est efficace ou est le probleme ?

Mollusk
22/02/2006, 15h06
Voici un petit lien qui pourrait t'interesser :
http://www.aaronrogers.com/nintendods/PA_Lib/
(les tutos sont en anglais)

Sans vouloir faire mon chieur, bien qu'à l'époque ces tutos étaient très bons.... Ils n'ont pas été mis à jour depuis plusieurs mois, donc n'utilisaient pas la meme version de PAlib, n'utilisaient pas le meme système de palette (sprites et bg), pas les memes fonctions pour les fonds...

sensei
23/02/2006, 09h49
Salut,

j'ai presque fini, il me manque juste a inclure la gestion du temps comme dans yayaxx pour faire un compteur qui defile pendant une minute...

Une idée ?

Mollusk
23/02/2006, 10h21
Pour calculer le temps ? Une variable que tu fous à nombre de secondes * 60, et à laquelle tu retires 1 à chaque boucle. Tu divises par 60 pour afficher en secondes, et en général on utilise des sprites pour l'afficher :)

sensei
23/02/2006, 11h05
Je suis d'accord et je sais le faire (je pense).

Seulement, j'ai deja une boucle principale avec à l'intérieur une autre boucle + les conditions si tel ou tel sprite est touché...

J'arrive pas intégrer une autre boucle pour calculer le temps dans toutes mes boucles ! :S

Mon code doit faire vachement peur :D

Dr.Vince
23/02/2006, 11h41
utilise les interruptions. (TIMER il me semble)

N64Francois
23/02/2006, 13h45
A chaque VBL, j'ai enlevé 1 à une variable.
1 sec = 60 VBL
1 min = 3600 VBL
Pour afficher le nombre de secondes, j'ai utilisé la fonction ceil() pour arrondir les nombres (enlever les chiffres après la virgules).

sensei => Si tu veux utiliser ceil(), n'oublie pas d'ajouter la ligne suivante au début de ton code :
#include <math.h>

sensei
23/02/2006, 15h12
Merci, c'est de cette manière que je voulais faire (avec PA_waitforVBL()...).

Cependant je ne sais pas comment l'inclure car j'ai deja une boucle qui tourne dans ma grande boucle.

exemple :

grandeboucle
-> generation des positions XY au hasard
boucle
-> affichage des sprites selon XY au hasard
-> condition if si le sprite est touché
/boucle
/grandeboucle

Ou est ce que je dois rajouter la boucle pour ne pas affecter les autres boucles ?

Meerci

EDIT : pendant que j'y suis, j'ai 2 questions sur des points que j'ai mal compris sur le tutorial wiki :

-comment effacer du texte ecris avec PA Outputext ?
-Si jeux convertir une image en background, quelle taille doit elle avoir pour la convertir avec PGAFX ?

Mollusk
23/02/2006, 18h49
Pour effacer du texte : PA_ClearBgText (ou un truc comme ca, faut regarder dans la doc), ou alors tu fous des espaces par-dessus :)

Pour les images, 256x192 me paraitrait logique, non ??? Tu peux faire plus si tu veux scroller et tout...

Pour les boucles, le plus simple serait de te faire une fonction WaitForVBL(), et dedans tu fous PA_WaitForVBL et tu augmentes ton timer... puis tu remplaces pour l'utiliser partout... J'ai un compteur dans le VBL mais j'ai oublié le nom ^^

Gwoin
23/02/2006, 19h20
merci gwoin d'avoir rettapé mon code que j'ai ecrit pour montrer la syntaxe du goto en c <_<

sinon j'ai bien rigolé sur ton code...

concernant le goto si il existe c'est pour etre utilisé non ? ton compillo genere exactement le meme code pour un for/while que un goto.
apres question propreté de code j'ai pas tout pigé la ... tant que tu comprend ton code et qu'il est efficace ou est le probleme ?

Déolé si je t'ai vexé :-'

Sans vouloir rentrer dans un débat sur la prog, concernant le goto je ne sais pas bien pourquoi il est là en C.
Faire un long programme complet en utilisant les goto, c'est le bordel.
C'est bien moins clair que les fonctions ou méthodes et c'est sujet à risques d'erreurs.
Le goto ne remplace pas que des boucles, et c'est bien là son problème.
Et dans le cas d'une boucle avec for/while, la ou les condition(s) d'arrets sont clairement explicites.
En général, quand on en vient à utiliser les goto, c'est que le code est mal structuré.
Je pense (et ce n'est que mon avis) qu'il vaux mieux déconseiller à un débutant en C (à quiconque en fait) d'utiliser des goto.

Concernant le "Et en plus propre" que j'ai ecrit, c'était pour éviter la recursivité, inutile dans un cas aussi simple.

Maintenant, je suis content que mon petit exemple t'ai amusé et j'espere avoir l'occasion de t'amuser à nouveau ^^

sensei
23/02/2006, 22h52
Pour effacer du texte : PA_ClearBgText (ou un truc comme ca, faut regarder dans la doc), ou alors tu fous des espaces par-dessus :)

Pour les images, 256x192 me paraitrait logique, non ??? Tu peux faire plus si tu veux scroller et tout...

Pour les boucles, le plus simple serait de te faire une fonction WaitForVBL(), et dedans tu fous PA_WaitForVBL et tu augmentes ton timer... puis tu remplaces pour l'utiliser partout... J'ai un compteur dans le VBL mais j'ai oublié le nom ^^

1) OK, sinon bien vu le coup des espaces, excellent même :)

2) Oui c'est logique... tellement simple que j'ai pas osé le faire...

3) C'est bien ce que je pensais, il va falloir que j'apprennes a faire les fonctions... :(

4) Merci ^^

sensei
24/02/2006, 11h06
Effacement du texe OK :)

Background OK :)

Fonction : PAS OK :(

J'essaye de comprendre les fonctions, structures et array sur wiki mais rien à faire, je comprends pas... du coup, pour la gestion du temps , c'est pas gagné :hum:

Mollusk
24/02/2006, 11h19
Il te manque quoi comme info en fait ?

sensei
24/02/2006, 11h31
Ben je pense pas qu'il manque d'infos, c'est juste que je comprends pas...

Pour moi, une fonction, c'est un bout de programme qui tourne hors boucle. (comme pour calculer le temps avec VBL).

Mais je ne comprends pas la synthaxe et comment l'intégrer dans le programme.

Tembargo
24/02/2006, 12h01
Si tu connais le PHP, donc tu connais les fonctions nan ? :huh:

Mollusk
24/02/2006, 12h08
bah tu fais genre void mafonction(void){
trucs à executer...

}

et dans ton programme, tu l'appelles en faisant mafonction();

Gwoin
24/02/2006, 12h17
Ben je pense pas qu'il manque d'infos, c'est juste que je comprends pas...

Pour moi, une fonction, c'est un bout de programme qui tourne hors boucle. (comme pour calculer le temps avec VBL).

Mais je ne comprends pas la synthaxe et comment l'intégrer dans le programme.

Une fonction c'est un juste un bout de code qui fait un truc et qui peux aussi renvoyer une valeur (là je fait simple expres)

exemple de fonctions:


//la fonction 'somme' prend 2 entiers en parametres
// et en retourne la somme
int somme(int a, int b)
{
int c = a + b;

return c;
}

int main(void)
{
// PAlib init
PA_Init();
PA_InitVBL();

[...]

int x=2, y=3;
int marcel = somme(x, y);

//maintenant 'marcel' vaut 5

//le while est une boucle
//celle ci ne s'arretera jamais vu que sa condition ('1') est toujours vrai
while (1)
{
//appel la fonction 'TestTouche'
TestTouche();

//appel la fonction 'RenderGame'
RenderGame();

PA_WaitForVBL();
}
return 0;
}


//la fonction TestTouche test si le joueur a appuyé sur une touche
// et retourne true si c'est le cas
bool TestTouche()
{
if (Pad.Select.Newpress)
return true;
else
return false;

}

//la fonction RenderGame affiche les sprites du jeu
// et ne retourne rien (pour faire simple, considere que void est egale à rien)
void RenderGame()
{
//affiche les sprites
PA_SetSpriteXY(0, 1, ... ...);
PA_SetSpriteXY(0, 2, ... ...);

[...]
}


C'est juste un simple et bete exemple, mais ca te montre différentes utilisations de fonctions.
le but d'une fonction c'est d'empacter une portion de code que tu pourras appeler plusieurs fois.
Comme ça, tu as juste à appeler la fonction (1 ligne) à chaque fois que tu en as besoin au lieu de te retapper tout le code
C'est à la fois plus simple et plus rapide.

sensei
24/02/2006, 13h18
Merci pour vos explications !

j'ai réussi à créer et a faire executer une fonction (retirer 1 à un evariable toute les secondes avec VBL).

Mais il y a un souci :p

J'ai intégré cette fonction a ma boucle principale (qui affiche des sprites aléatoirement pendant un temps aléatoire. Donc ma boucle peut parfois prendre 2 secondes pour boucler, ce qui veux dire que ma fonction va s'effectuer en 2 secondes pour normalement enlever 1 à une variable chaque seconde).

Vous me suivez ? :rolleyes:

Gwoin
24/02/2006, 13h20
Merci pour vos explications !

j'ai réussi à créer et a faire executer une fonction (retirer 1 à un evariable toute les secondes avec VBL).

Mais il y a un souci :p

J'ai intégré cette fonction a ma boucle principale (qui affiche des sprites aléatoirement pendant un temps aléatoire. Donc ma boucle peut parfois prendre 2 secondes pour boucler, ce qui veux dire que ma fonction va s'effectuer en 2 secondes pour normalement enlever 1 à une variable chaque seconde).

Vous me suivez ? :rolleyes:

tu pourrais poster ton code ou ettre en ligne les fichiers que je regarde ça ?
Par ce que là je ne comprend pas tout :p

Gwoin
24/02/2006, 13h32
ha ca y est je comprends...

Moi je ferais differemment.
Si tu veux afficher un objet 2 secondes, alors tu l'affiches.
tu continues tes boucles VBL.
et au bout de 2 secondes, tu le retires...

et comme ça tu n'attends pas 2 secondes, mais à chaque boucle, tu verifies si ca fait 2 secondes (ou plus). Si c'est le cas, alors tu appels le code qui enleve le sprite.

Mollusk
24/02/2006, 13h37
tu utilises ton compteur pour savoir quand afficher/cacher :

if(compteur == 2 secondes) CacherObjet();

et tu mets ca dans une boucle normale :)

sensei
24/02/2006, 20h52
Super ca marche grâce à votre aide !! Merci !

J'ai du refaire toute la grande boucle mais maintenant c'est nickel.

Je voudrais rajouter du son, mais les explications sont vagues. Je converti mon fichier en raw sans problème (avec switch) mais dans le code, il faut faire un include nomduson_raw.h -> comment fait on pour générer ce fichier ?

Merci

Mollusk
24/02/2006, 20h53
tu mets ton .raw dans ton dossier data, et le .h sera généré tout seul :)

RefiX
24/02/2006, 20h54
Super ca marche grâce à votre aide !! Merci !

J'ai du refaire toute la grande boucle mais maintenant c'est nickel.

Je voudrais rajouter du son, mais les explications sont vagues. Je converti mon fichier en raw sans problème (avec switch) mais dans le code, il faut faire un include nomduson_raw.h -> comment fait on pour générer ce fichier ?

Merci
Pas besoin de le génerer, lors de la compilation il est crée automatiquement.

[edit]Grilled >_<

Tembargo
24/02/2006, 20h57
C'est quand même marrant un sensei qui a autant de questions et si peu de réponses :D

sensei
24/02/2006, 21h06
Vous êtes super rapide merci !

Ya plus qu'à tester :)

PS : C'est vrai que pour quelqu'un qui veux apprendre le C , la prog et la prog DS, j'ai mal choisi mon pseudo :p mais tant pis, je m'appelais comme ca sur l'ancien forum...
(quoique c'était aussi pour apprendre comment fonctionnait linkers, supercard et compagnie... :) )

Edit : l'avatar de refix, c'est pas le héros du jeu de tribunal ?

Tembargo
24/02/2006, 21h28
Edit : l'avatar de refix, c'est pas le héros du jeu de tribunal ?

oui oui http://www.gamebrink.com/images/ds-gyakutensaiban-jap.jpg
Mais en blond ^^

sensei
24/02/2006, 22h57
J'ai le son qui marche, j'ai presque fini :)

Un grand merci pour votre aide :notworthy

Ah si, je viens de mettre un backgroud sur l'ecran du haut, il s'affiche bien mais mon texte ne s'affiche plus... (jai vérifié que text et back utilise bien le meme numéro de background).

Mollusk
25/02/2006, 00h28
(jai vérifié que text et back utilise bien le meme numéro de background).

euh, justement, faut utiliser des numéros différents, non ??

sensei
25/02/2006, 15h58
Oui c'est ca !

Mais je savais pas, merci encore une fois.

J'ai presque finit mon premier "jeu"...

Au passage, j'ai 2 ptites questions :

- Combien de condition if ont peux mettre dans une boucle avant de saturer la DS ?
- Il existe une commande pour faire un restart du prog ou un reset ?

Mollusk
25/02/2006, 16h02
Commandes if -> tu peux en mettre un paquet... Impossible de dire combien, mais il faut toujours chercher à optimiser pour en utiliser le moins possible de toute facon

Pour reset, faut le faire toi-meme dans ton programme, y'a pas de commande pour à ma connaissance

sensei
25/02/2006, 16h49
Dans la mienne, il y en a environ une dizaine... Vive le code amateur :lol:

Mollusk
25/02/2006, 17h02
10 c'est rien

Nesgba
25/02/2006, 18h06
- Combien de condition if ont peux mettre dans une boucle avant de saturer la DS ?
eh bien ca depend les conditions que tu teste ^^
tu peut en passer facilement quelques milliers tout comme une seule (mais faut vraiment la charger a mort :D)


- Il existe une commande pour faire un restart du prog ou un reset ?
oui, cherche dans le bios y'a des trucs pas mal :ph34r:

Gwoin
25/02/2006, 21h01
un tout petit message concernant le timer de la page precedente.

Si tu veux afficher le temps qui s'écoule dans un jeux, tu peux surement utiliser la structure PA_RTC (ce qui signifie certainement Real Time Clock).
Au début du jeu tu regardes l'heure qu'il est, et à chaque boucle VBL tu regardes à nouveau l'heure et tu fais une différence : c'est le temps qui s'est écoulé.

J'ai pensé à ça par hasard en parcourant le wiki de PA_Lib à cette adresse:
http://www.palib.info/wiki/doku.php?id=day8

Ca peut surement te permettre de fair un compteur (ou un decompteur) sur un jeu...

Par contre si le joueur joue entre 23h58 et 00h04, fais gaffe de bien prendre en compte le changement de journée :D

Mollusk
25/02/2006, 21h10
gwoin, le soucis c'est qu'il faut vérifier la date et tout, s'il joue à minuit à la fin du mois ca devient galère. En comptant les VBLs, il suffit de diviser par 60 pour avoir les secondes...

sensei
25/02/2006, 21h40
Merci pour les tuyaux mais c'est bon, j'ai pu me débrouiller avec le VBL et en decomptant 60 (attention, avec les emulateurs ca va plus vite !).

Mon "jeu" est fini, avant toutes critiques , je vous rappelle que je ne connaissais pas la programmation , ni le C il y a même pas 2 semaines :) D'ailleurs dans mon programme, il y a encore beaucoup de lignes que je ne comprends, je sais juste qu'il fallait les mettre d'après les tutos :lol:

Je finis encore 2 ou trois trucs et je vous le met à disposition.

J'aimerais notamment pouvoir recommencer une partie une fois celle ci finie (au bout des 60 secondes je fais un break) mais je ne sais pas faire...

Brunni
25/02/2006, 21h53
gwoin, le soucis c'est qu'il faut vérifier la date et tout, s'il joue à minuit à la fin du mois ca devient galère. En comptant les VBLs, il suffit de diviser par 60 pour avoir les secondes...
Non, par 59.737 :whst: :ange:

Mollusk
25/02/2006, 21h57
certes

sensei
25/02/2006, 23h10
Voila vous pouvez tester, soyez indulgents ^^

http://bekko.free.fr/DSonic.JPG

DSonic.nds
http://bekko.free.fr/DSonic.nds

DSonic.ds.gba
http://bekko.free.fr/DSonic.ds.gba

Mollusk
25/02/2006, 23h34
J'ai testé sur DeSmuME, mais c'est pas facile car ca tourne à 100fps :s

sensei
25/02/2006, 23h36
EN effet, le jeu est concu pour la DS, etant donné que l'emu fait tourner le jeu a 100/120 img/sec, il s'en trouve 2x plus rapide...

KerneL
25/02/2006, 23h40
Bon, j'ai testé pour ma part directement sur la DS (via mon M3, merci pour le .ds.gba ;) ). Je dis bravo, pour quelqu'un qui est parti de connaissances 0 en C, c'est vraiment bien!
Juste une bricole: je pense que tu es trop indulgent si on touche un Mario, enlever un point ca ne pénalise pas tant. Une dizaine de points ça obligerait à faire plus attention ^^.
Bonne continuation et bon courage en tous cas.

Gwoin
25/02/2006, 23h58
Ca a l'air sympa :)
Bon début... bienvenue à un nouveau codeur ^^

gwoin, le soucis c'est qu'il faut vérifier la date et tout, s'il joue à minuit à la fin du mois ca devient galère. En comptant les VBLs, il suffit de diviser par 60 pour avoir les secondes...

Ho, une petite fonction qui teste ça et qui renvoie un nombre de secondes, ca ne doit pas être bien sorcier à faire et ça ne doit prendre que quelques lignes.
IL suffit de tester d'abord le changement d'année, puis de mois, de jours, d'heure, de minute et enfin de seconde et de calculer le total de secondes entre 2 dates passées en paramètre.

Une fois cette petite fonction écrite, c'est plus facile à gérer que de compter les VBL...
Enfin, je dis ça, mais je ne me sent pas le courage de l'écrire :whst:

Mollusk
26/02/2006, 00h32
Gwoin, il faut aussi prendre en compte les années bissextiles, si tu veux que ca marche dans 100% des cas... Tout ca pour éviter une division avec un compteur à la con, je trouve ca beaucoup !

En plus, il ne va pas compter la premiere seconde correctement : ca prendra toujours moins d'une seconde pour l'afficher, voire meme juste 1/60ème de seconde si on prend la valeur repère juste avant le changement de seconde. Donc c'est valable sur le long terme (genre calcul du temps total de jeu dans les RPG), mais pour afficher un temps court c'est pas top.

Pourquoi tout le monde semble contre un timer tout bete ???

sensei
26/02/2006, 00h41
Euh pour l'histoire du temps, un VBL a 60 c'est vraiment simple...

Sinon je vais créer un topic pour DSonic, comme ca tout le monde pourra poster les remarques et améliorations a faire.

Kernel, j'ai mis le score a -6 si on touche mario B)

Gwoin
26/02/2006, 13h03
Gwoin, il faut aussi prendre en compte les années bissextiles, si tu veux que ca marche dans 100% des cas... Tout ca pour éviter une division avec un compteur à la con, je trouve ca beaucoup !

En plus, il ne va pas compter la premiere seconde correctement : ca prendra toujours moins d'une seconde pour l'afficher, voire meme juste 1/60ème de seconde si on prend la valeur repère juste avant le changement de seconde. Donc c'est valable sur le long terme (genre calcul du temps total de jeu dans les RPG), mais pour afficher un temps court c'est pas top.

Pourquoi tout le monde semble contre un timer tout bete ???

heu... bon d'accord ^^ :)