1

Mais comme c'est de l'optimisation, et puis que la partie basic n'est pas très visitée, je préfere mettre ça ici :

Le but est de faire un déplacement correct pour un rpg (cms bien sûr), en 100% basic.

Nous avons une matrice de dimention 10 sur 6. Le joueur veut se déplacer d'une case, donc on utilise un getkey, puis on définit les nouvelles coordonnées, qu'on place dans une liste : pos{x,y}. Il faut tester :
1) Que le perso va bien se déplacer sur l'écran (sinon on fait scroller comme dans zelda gameboy)
2) Que la case de destination n'est pas un obstacle

Si les deux conditions sont bonnes, on déplace. Mais il reste encore quelques trucs à tester. La "case" sur laquelle se trouve le perso contient une valeur, c'est un nombre à 4 chiffres. Les 3 premiers indiquent le sprite et le dernier indique le type de case.
Il faut donc :
1) Séparer le n° du sprite et le type de case
2) Tester la case
3) Voir si ça va déclancher qq chose de spécial, un combat, etc...

Bref venons en à l'algo lui-même, le mien ressemble pour l'instant à ça :

lbl deplace
*getkey -> définir la case d'arrivée dans arrivée_x et arrivée_y*
if *la destination est dans l'écran* then
matrice[position_y,position_x]->valeur_case
else
goto *le programme de scrollage*
endif
{mod(valeur_case,10),int(valeur_case/10)}->valeur_separee // On sépare les 3 premiers chiffres du dernier
if *la destination est la même que l'arrivée* or *l'arrivée est un mur* then
*afficher le perso immobile*
else
*afficher le perso en déplacement d'une case à l'autre*
*mettre à jour les nouvelles coordonnées (remplacer position_x et position_y par arrivée_x et arrivée_y)*
endif
if *un certain nombre aléatoire est plus petit qu'une valeur* then
*déclancher un combat*
endif
goto deplace

Voilà... Tout ce que j'ai mit en *violet* ce sont des parties sans interet ou des sous-programmes. Il reste donc cette portion de code.
Mais avec tous ces tests, évidement c'est TRES lent (basic oblige sad).

Est-ce que qqun voit une solution qui supprimerait des tests, en allegerait certains, de façon a optimiser ça du mieux possible ?
P.S : évitez les remarques du style "fais ça en C", merci wink
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

Bah faire scroller la map sous le perso (Pokemon), c'est encore le mieux. Comme ça tu supprimes déjà un test, de "si perso est ds l'écran, sinon faire décaller l'écran".

Mais en BASIC c'est pas terrible.

Aussi, fais gaffe au nbre de tests, car quand tu auras plusieurs perso à faire bouger sur la map, ça va considérablement ralentir le prog.

Le mieux est donc de faire scroller la map en dessous, de tester si on arrive "à la fin de la case" si ton perso scroll en case par case. Ca fait 2 tests en tout (scroll vertical et scroll horizontal).

En fait il faut limiter le nbre de test pour un perso à 4 au max, car sinon ça va vraiment ramer en cas de plusieurs perso sur la map.

-- test collision pour nouvelle direction
-- test1, scroll vertical (si on a finit de scroller une case, étant donné qu'on ne prend pas de boucle for()).
-- test2, scroll horizontal
-- test combat, ou changement de map


de toute façon même en C, les test c'est assez lent. Donc trouver des astuces, pour en faire le moins possible.

Et encore tu n'as pas parlé des différents sprites du perso, pieds bougeant ect, là faut ruser un peu, en fesant un rapide calcul (+ ou - ou *) plutôt qu'un test.
Tout est ds l'organisation de tes sprites ds la mat de sprites du perso après. tonguetongue
Non-Webmaster et non-programmeur du site. .Pour tout probleme ou question ,débrouillez vous avec les Webmasters .

«- Pas Moo ! ^^

3

Malheureusement, déplacer la map sous le perso c'est inpensable en basic (lenteur de la gestion des matrices...)

Et puis je ne sais pas comment optimiser les déplacements sad
Voilà la partie qui s'occupe de l'anim (avec 2 images par direction pour faire une "animation" de marche) :
(s_img,s_old,s_new,s_dir,s_typ) Prgm Local  l_tmp,l_add,l_curcrd,l_oldcrd,l_newcrd,l_solold,l_solnew If  s_img="ª1":Goto  def_dump ª(s_old-s_new)*8»l_add (s_old-1)*16»l_oldcrd (s_new-1)*16»l_newcrd "s_blk"&string(int(x_mvsall[s_old[2],s_old[1]]/10))»l_solold "s_blk"&string(int(x_mvsall[s_new[2],s_new[1]]/10))»l_solnew CopyVar  l_oldcrd,l_curcrd string(s_dir)»s_dir string(s_typ)»s_typ If s_typ="0" Then p_mnvrtl("drw_pict",l_solold,l_oldcrd[1],l_oldcrd[2]+2,1,"/","drw_pict",s_img&"1"&s_dir&"m",l_curcrd[1],l_curcrd[2]+2,4,"/","drw_pict",s_img&"1"&s_dir&"d",l_curcrd[1],l_curcrd[2]+2) Else l_curcrd+l_add»l_curcrd p_mnvrtl("drw_pict",l_solold,l_oldcrd[1],l_oldcrd[2]+2,1,"/","drw_pict",l_solnew,l_newcrd[1],l_newcrd[2]+2,1,"/","drw_pict",s_img&s_typ&s_dir&"m",l_curcrd[1],l_curcrd[2]+2,4,"/","drw_pict",s_img&s_typ&s_dir&"d",l_curcrd[1],l_curcrd[2]+2) l_curcrd+l_add»l_curcrd p_mnvrtl("exe_wait",2,"/","drw_pict",l_solold,l_oldcrd[1],l_oldcrd[2]+2,1,"/","drw_pict",l_solnew,l_newcrd[1],l_newcrd[2]+2,1,"/","drw_pict",s_img&"1"&s_dir&"m",l_curcrd[1],l_curcrd[2]+2,4,"/","drw_pict",s_img&"1"&s_dir&"d",l_curcrd[1],l_curcrd[2]+2) EndIf DelVar  s_mvsolc DelVar  s_mvsoln Lbl  def_dump EndPrgm

(je c pas ce que ça va donner j'ai utilisé "source php"...)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

tout ça !!!!!!! eekeek

vaut mieux un piti test quand même !! grin

moi j'ai 2 test pour tts les directions, pour animer mon perso. Pas plus !!!

Donc en fait 4 test qui se répètent tt le temps (scroll map, et animation du perso), qu'on ait pressé une touche ou non. Si on prese une touche, ça rajoute 2 test une seule fois (un seul test de collision, un seul test de gestion (combat ect) pile au moment où on presse la touche).
Non-Webmaster et non-programmeur du site. .Pour tout probleme ou question ,débrouillez vous avec les Webmasters .

«- Pas Moo ! ^^

5

arf je comprends rien grin
t'as une source stp ?

Sinon pour l'algo au dessus, le pire c'est qu'il n'y a aucun test ! C'est juste la partie qui déplace le perso roll
Mais bon j'ai refait ce prog 3 fois et g pas trouvé plus rapide...
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

j'ai une qn svp, en basic, c pas plus rapide d'utiliser les listes plutot que les matrices what

7

tout dépend de la taille, mais en regle generale essaie de travailler sur des listes.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

ben pkoi alors tu utilises une matrice dans ton code ?

9

Parceque beaucoup de fonctions utilisent cette matrice pour des tests, et que ces tests sont effectués en fonction de la position du perso.

Cette position a bien sûr 2 coordonnées, donc pour une matrice aussi petite je préfere éviter d'utiliser à chaque fois un calcul pour convertir ces 2 coordonnées en un élement de liste.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

10

moué ... mais si tu fais tout en liste .. t'as pas ce probleme de conversion ...

11

Je peux pas tout faire en liste... Quand on affiche un sprite il faut bien indiquer une coordonnée X et une Y, et comme je dois faire ça souvent c plus simple de prendre les 2 valeurs que l'on tire d'une matrice.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

12

ben oué ... mais si c moins rapide ..

13

utilise les data, c'est plus rapide que les matrices en basic !
Mon site perso : http://www.xwing.info

14

c en gros ce que je dis ... oui

15

voui je sais mais c bien moins souple dans certains sens... et puis c pas tellement plus rapide pour des tailles comme ça sad
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)