Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1587 connectés 

 

Sujet(s) à lire :
    - Article: un raytracer de base en C++
 

 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
Auteur Sujet :

La programmation d'effets de demos old-school (Assembleur + C)

n°522094
chrisbk
-
Posté le 24-09-2003 à 13:01:05  profilanswer
 

Reprise du message précédent :

Mara's dad a écrit :

Horko, tu peux nous dire comment installer Open Watcom (1.0 ou 1.1) sur un XP pro.
J'ai laissé l'install se faire toute seule, mais à la compil, j'ai un problème :
 
Warning! W1008: cannot open clib3r.lib : No such file or directory
Warning! W1008: cannot open emu387.lib : No such file or directory
 
Bon, après, bien sûr çà déconne à fond...
 
Pourtant, les libs en question sont bien installées dans c:\watcom\lib386\nt ? ? ?
 
 


 
Y'a un bat a lancer (setvars je crois, dans le rep de openwatcom) qui regle le pb

mood
Publicité
Posté le 24-09-2003 à 13:01:05  profilanswer
 

n°522122
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 13:22:55  profilanswer
 

chrisbk a écrit :

ben vu que tu mets 0xFF non ca change rien, mais si tu veux faire un degradé (par exemple)tu arriveras trop rapidement a saturation


Bon j'ai regardé mes vieilles docs, apparemment y'a certaines cartes svga qui ont des registres 8 bits, et d'autres qui ont des registres 6 bits. Donc effectivement, dans le doute, j'utiliserais 6 bits pour la couleur.


---------------
J'ai un string dans l'array (Paris Hilton)
n°522125
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 13:24:59  profilanswer
 

Mara's dad a écrit :

Horko, tu peux nous dire comment installer Open Watcom (1.0 ou 1.1) sur un XP pro.
J'ai laissé l'install se faire toute seule, mais à la compil, j'ai un problème :
 
Warning! W1008: cannot open clib3r.lib : No such file or directory
Warning! W1008: cannot open emu387.lib : No such file or directory
 
Bon, après, bien sûr çà déconne à fond...
 
Pourtant, les libs en question sont bien installées dans c:\watcom\lib386\nt ? ? ?
 
 


Dans le répertoire d'install de watcom, tu as un setvars.bat à lancer (à noter que tu peux choisir lors de l'install si tu souhaites le lancer manuellement ou l'inclure dans tes variables d'environnement).
Et je l'ai dit à la fin de mon article en plus :o
 
edit: [:benou_grilled]


Message édité par Harkonnen le 24-09-2003 à 13:26:55

---------------
J'ai un string dans l'array (Paris Hilton)
n°522223
Mara's dad
Yes I can !
Posté le 24-09-2003 à 15:05:15  profilanswer
 

J'avais choisi l'install auto, et j'avais déjà essayé avec setvars.bat :??:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°522231
e-TE
Posté le 24-09-2003 à 15:13:09  profilanswer
 

drapo pour quand jaurai le temp de tout lire ^^

n°522248
Mara's dad
Yes I can !
Posté le 24-09-2003 à 15:22:49  profilanswer
 

Ok, pb watcom réglé. J'avais installé que le support pour windows 32bits :whistle:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°522257
Mara's dad
Yes I can !
Posté le 24-09-2003 à 15:29:59  profilanswer
 

Allez, juste pour le plaisir :
 
Dans waitVBL, pas la peine de faire mov dx,03dah à chaque passage dans la boucle start, il suffit de l'initialiser 1 fois avant :D
 
Sinon, comment faire pour intercepter un Ctrl+C ? Parce-que sinon, y'a pas d'appel à resetVideo()...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°522264
Mara's dad
Yes I can !
Posté le 24-09-2003 à 15:40:35  profilanswer
 

Une dernière pour la route :
 

Code :
  1. if (tabstars[i].x > 319)
  2.     tabstars[i].x -= 319;


 
au lieu de

Code :
  1. if (tabstars[i].x > 319)
  2.     tabstars[i].x = 0;


 
Bon, je pinaille, je sais...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°522315
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 16:11:11  profilanswer
 

Mara's dad a écrit :

Allez, juste pour le plaisir :
 
Dans waitVBL, pas la peine de faire mov dx,03dah à chaque passage dans la boucle start, il suffit de l'initialiser 1 fois avant :D


clair, mais bon, j'ai codé ça la nuit hein, j'ai le droit de loucher non ? :whistle:
 

Mara's dad a écrit :


Sinon, comment faire pour intercepter un Ctrl+C ? Parce-que sinon, y'a pas d'appel à resetVideo()...
 
 [:wisetechi]


la fonction kbhit() n'intercepte que l'appui sur une touche unique. tu sors de la boucle en pressant n'importe quelle touche


---------------
J'ai un string dans l'array (Paris Hilton)
n°522318
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 16:14:42  profilanswer
 

Mara's dad a écrit :

Une dernière pour la route :
 

Code :
  1. if (tabstars[i].x > 319)
  2.     tabstars[i].x -= 319;


 
au lieu de

Code :
  1. if (tabstars[i].x > 319)
  2.     tabstars[i].x = 0;


 
Bon, je pinaille, je sais...


:non:
A mon tour de pinailler : ta solution est plus lente car elle oblige à faire une soustraction, plus lente que le xor nécesaire pour mettre le registre contenant x à 0  ;)  
 
Mais bon, sur un P4, on s'en fout un peu [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
mood
Publicité
Posté le 24-09-2003 à 16:14:42  profilanswer
 

n°522325
Mara's dad
Yes I can !
Posté le 24-09-2003 à 16:18:08  profilanswer
 

Harkonnen a écrit :


:non:
A mon tour de pinailler : ta solution est plus lente car elle oblige à faire une soustraction, plus lente que le xor nécesaire pour mettre le registre contenant x à 0  ;)  
 
Mais bon, sur un P4, on s'en fout un peu [:ddr555]


Je vois bien que c'est plus lent, mais çà décale les étoiles les unes par rapport aux autres :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°522350
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 16:43:52  profilanswer
 

Mara's dad a écrit :


Je vois bien que c'est plus lent, mais çà décale les étoiles les unes par rapport aux autres :D


[:lorill]
 
Bon sinon, l'histoire de la multiplication par 2 pour accéder aux données de la table, c'est bon pour toi ?  :)


---------------
J'ai un string dans l'array (Paris Hilton)
n°522357
antp
Super Administrateur
Champion des excuses bidons
Posté le 24-09-2003 à 16:50:49  profilanswer
 

Harkonnen a écrit :


la fonction kbhit() n'intercepte que l'appui sur une touche unique. tu sors de la boucle en pressant n'importe quelle touche


 
Chez moi ça marchait pas; j'ai dû tuer le process :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°522364
Mara's dad
Yes I can !
Posté le 24-09-2003 à 17:00:50  profilanswer
 

Harkonnen a écrit :

Bon sinon, l'histoire de la multiplication par 2 pour accéder aux données de la table, c'est bon pour toi ?  :)  


En fait non, parce-ce que je croyait qu'en C, l'arithmétique des pointeur en tenais compte
 
Si tu déclares unsigned int *yTable et bien *(yTable + 1) pointe bien sur le 2éme unsigned int !
 
Tu peux le vérifier,
Dans precalcOffs(), enlève le *2, et dans le main, virre la ligne ypos = ypos+ypos et çà marche très bien.
 
Ben oui, on est plus en ASM là :D  
 
C'est à se demander pourquoi çà plantait pas avant (dépassement du tableau) :??:
 
Ou alors j'ai rien compris. De toute façon, c'est pas normal que çà marche en faisant *2 ou en ne le faisant pas :??:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°522368
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 17:07:41  profilanswer
 

Mara's dad a écrit :


En fait non, parce-ce que je croyait qu'en C, l'arithmétique des pointeur en tenais compte
 
Si tu déclares unsigned int *yTable et bien *(yTable + 1) pointe bien sur le 2éme unsigned int !
 
Tu peux le vérifier,
Dans precalcOffs(), enlève le *2, et dans le main, virre la ligne ypos = ypos+ypos et çà marche très bien.
 
Ben oui, on est plus en ASM là :D  
 
C'est à se demander pourquoi çà plantait pas avant (dépassement du tableau) :??:
 
Ou alors j'ai rien compris. De toute façon, c'est pas normal que çà marche en faisant *2 ou en ne le faisant pas :??:  


:heink:
je testerais ce soir, c'est space ce truc :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
n°522662
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 21:37:03  profilanswer
 

La notion de temps machine
 
En regardant défiler les étoiles du Starfield, on peut s'interroger : combien d'étoiles peut on mettre en l'espace d'un balayage vertical ?
 
Tout le challenge de la création de démo consiste à faire le maximum de choses en une VBL, ceci pour préserver la sacro-sainte fluidité de l'animation.
 
Ainsi, il est plus que problable que le nombre arbitraire de 500 étoiles que j'ai fixé soit largement inférieur à la capacité du processeur central. Dés lors, comment connaitre le nombre d'étoiles idéal, celui qui, si on lui rajoute une étoile supplémentaire, fera franchir le cap fatidique de la VBL à la capacité de calcul du processeur ?
 
Oubliez les GetTickCount() et autres fonctions réservées à la programmation Windows. Nous faisons tout à la main.
 
Nous pourrions utiliser l'instruction assembleur RDTSC, qui compte les cycles. Seulement, ce nombre n'est pas très parlant, et surtout ne veut strictement rien dire d'une machine à l'autre.
 
Ce qui serait pratique, c'est un moyen de visualiser à l'écran le temps qu'il me reste avant que le faisceau n'arrive en bas de l'écran. Ceci est possible par une petite bidouille en assembleur.
 
Le principe est très simple : avant que le faisceau ne soit en bas de l'écran, on définit la couleur de fond en noir. Une fois que le faisceau commence à tracer une nouvelle image, on la passe en bleu (par exemple).
Ainsi, le temps machine utilisé avant le VBL suivant sera matérialisé par une bande bleue en haut de l'écran. Plus cette bande sera près du bas de l'écran, moins il restera de temps avant que le faisceau n'arrive en bas de l'écran.
 
Le challenge consiste donc à trouver le nombre d'étoiles maximum, celui qui recouvrira la totalité de l'écran en bleu sauf le point de coordonnées (319,199) qui devra rester noir :D
 
La définition de la palette utilise la fonction assembleur décrite dans l'article sur le Starfield et ne présente aucune difficulté.
 
Modification du source
Dans le source, j'ai modifié la fonction WaitVBL().
Juste avant l'attente du VBL, j'ai rajouté des instructions qui passent la couleur de fond en noir, et juste après, je colorie le fond en bleu.
Ces modifications sont activées en compilant le source de la manière suivante :
 
wcl386 -dDEBUG /l=dos4g tstarfield.c
 
Le symbole DEBUG encadre la coloration du fond dans le source tstarfield.c. Pour ne pas visualiser le temps machine, il suffit de compiler selon la ligne de commande décrite dans l'article sur le Starfield, sans le "-dDEBUG".
 
J'ai passé le nombre d'étoiles à 20000, afin de visualiser le temps machine. Ce nombre doit être suffisamment grand, sinon on ne verra rien (la puissance des machines actuelles permet de calculer un grand nombre d'étoiles)
 
N'hésitez pas à modifier ce nombre pour voir combien d'étoiles votre machine est capable d'afficher.
Les plus courageux peuvent même s'amuser à réécrire le source entièrement en assembleur pour voir s'il leur est possible de gagner des étoiles supplémentaires :)
 
Télécharger le source modifié
Télécharger l'éxécutable avec 20000 étoiles et visualisation du temps machine
 
Effet de feu in progress :hello:


---------------
J'ai un string dans l'array (Paris Hilton)
n°522668
antp
Super Administrateur
Champion des excuses bidons
Posté le 24-09-2003 à 21:40:13  profilanswer
 

ça y est, je suis largué :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°522675
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 21:44:53  profilanswer
 

antp a écrit :

ça y est, je suis largué :D


qu'est ce que tu comprends pas :??:


---------------
J'ai un string dans l'array (Paris Hilton)
n°522685
antp
Super Administrateur
Champion des excuses bidons
Posté le 24-09-2003 à 21:48:03  profilanswer
 

non c'est l'histoire du truc bleu pour détecter la vitesse, j'ai lu trop vite je pense, je lirai ça plus calmement plus tard ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°522689
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 21:49:32  profilanswer
 

augmente ou diminue le nombre d'étoiles, ça va te sauter aux yeux :)


---------------
J'ai un string dans l'array (Paris Hilton)
n°522697
red factio​n
Posté le 24-09-2003 à 21:54:33  profilanswer
 

antp a écrit :

non c'est l'histoire du truc bleu pour détecter la vitesse, j'ai lu trop vite je pense, je lirai ça plus calmement plus tard ;)


 
 
bonne idée nempeche  
 
mais avec mon 2400+ jai le 1er 1/4 de lecran recouvert de bleu
 
faut autant de cpu pour gerer un starfield ????
 
 
jvais essayer dimplementer un blur sa doit etre vraiment beau  :love:


Message édité par red faction le 24-09-2003 à 21:55:44
n°522699
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 21:57:26  profilanswer
 

red faction a écrit :


faut autant de cpu pour gerer un starfield ????


ben y'a quand meme 20000 étoiles, c'est pas rien !
et puis il te reste les 3/4 de l'écran, donc tu peux placer environ 80000 étoiles !
passe le source à 100000 étoiles, tu verras les saccades :D


---------------
J'ai un string dans l'array (Paris Hilton)
n°522702
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 24-09-2003 à 22:00:55  profilanswer
 

de toute façon, c'est pas un déplacement d'étoiles qui mettra le CPU à genoux !
ça commencera à se sentir quand on abordera les projections 3D, les rotations, etc...


---------------
J'ai un string dans l'array (Paris Hilton)
n°522704
red factio​n
Posté le 24-09-2003 à 22:04:31  profilanswer
 

tu compte nous faire des optimisations mmx pourla suite des evenements  :??:  
 
 
 
 
 
 :D

n°522710
red factio​n
Posté le 24-09-2003 à 22:16:55  profilanswer
 

m***** c vrai pas de mmx en 16 bit c ca ?

n°522778
bjone
Insert booze to continue
Posté le 24-09-2003 à 23:10:57  profilanswer
 

red faction a écrit :

m***** c vrai pas de mmx en 16 bit c ca ?


 
non là c'est bon le cpu est mode 32bits. (DOS4G RULEZ)
 
perso j'ai un faible pour PMODE, mais bon ché pareil...

n°522832
theshockwa​ve
I work at a firm named Koslow
Posté le 25-09-2003 à 00:57:07  profilanswer
 

Drapal aussi ! J'avais fait un effet de feu sur un petit cube en 3D il y a quelques années, ca me rappelle des bons souvenirs de voir tout ca ! :D

n°523496
bjone
Insert booze to continue
Posté le 25-09-2003 à 20:49:48  profilanswer
 

genre ça: http://site.voila.fr/bjone/files/bsplines.ace
 
;) :D


Message édité par bjone le 25-09-2003 à 20:50:03
n°523498
red factio​n
Posté le 25-09-2003 à 20:52:54  profilanswer
 


 
marche pas  :o  
 
 
 
mais jai plus aucun album mp3  :??:  
 
 :lol:

n°523499
bjone
Insert booze to continue
Posté le 25-09-2003 à 20:53:53  profilanswer
 

red faction a écrit :


 
marche pas  :o  
 
 
 
mais jai plus aucun album mp3  :??:  
 
 :lol:  


 
bin si, pi tu fais bsplines.exe cube.spl par exemple....

n°523500
red factio​n
Posté le 25-09-2003 à 20:54:44  profilanswer
 

BJOne a écrit :


 
bin si, pi tu fais bsplines.exe cube.spl par exemple....


 
jcrois que cetait des fichiers utilise par lappli  
 
comme yavait pas de readme ou une explication du genre

n°523504
bjone
Insert booze to continue
Posté le 25-09-2003 à 21:01:07  profilanswer
 

red faction a écrit :


 
jcrois que cetait des fichiers utilise par lappli  
 
comme yavait pas de readme ou une explication du genre


 
c'était un truc fait à l'arrache en cours :D en bts....
 
pi après j'ai ajouté l'asc2spl qui blaireaumétriquement converti un fichier ASC issu de 3D Studio dans le format couillon que j'utilise...


Message édité par bjone le 25-09-2003 à 21:02:09
n°523506
bjone
Insert booze to continue
Posté le 25-09-2003 à 21:01:57  profilanswer
 

forcément comme c'est du DOS en mode réel, si les ressources (vertex/lignes/splines) dépassent la fenêtre de 64Ko, c'est DTC....

n°523510
bjone
Insert booze to continue
Posté le 25-09-2003 à 21:06:03  profilanswer
 

et c'est du C compilé par du C++ (enfin du Borland C++ :D), lol taz pourrait venir hurler... (àlàlà que de souvenirs)
 
4,6 rotation gauche droite (du pavé numérique)
8,2 rotation haut bas  
1,3 rotation Z
/,* zoom
. : bascule effet de vue/recopie simple


Message édité par bjone le 25-09-2003 à 21:15:30
n°523645
theshockwa​ve
I work at a firm named Koslow
Posté le 26-09-2003 à 01:03:42  profilanswer
 

pas mal, le cube ! :D J'avais fait plus simple ... largement ... un simple cube gérés par faces triangulaires ... remplies ou non ... Mais bon ... c'était pas une gestion de splines et c'était un peu tout pourri, ce que j'avais fait ... J'abais relu le source un coup, et j'ai failli m'enfuir en courant ! :D

n°523682
bjone
Insert booze to continue
Posté le 26-09-2003 à 06:35:17  profilanswer
 

theShOcKwAvE a écrit :

pas mal, le cube ! :D J'avais fait plus simple ... largement ... un simple cube gérés par faces triangulaires ... remplies ou non ... Mais bon ... c'était pas une gestion de splines et c'était un peu tout pourri, ce que j'avais fait ... J'abais relu le source un coup, et j'ai failli m'enfuir en courant ! :D


 
bah tu sais je viens de re-regarder, le miens, et je me dit que la STL ou les trucs templatés c'est vraiment mieux :D
 
enfin surtout quand je regarde mon autre truc de rendu 3D en VESA 2.0 sous Dos, celui-là c'était mon projet d'apprentissage de A-Z de la 3D, je l'ai abandonné en 2001, et c'est vraiment un bordel :D


Message édité par bjone le 26-09-2003 à 06:37:27
n°523816
Mara's dad
Yes I can !
Posté le 26-09-2003 à 11:39:39  profilanswer
 

Version modifiée de starfield.c en neige.c
 

Code :
  1. /*
  2. ---- Neige.c ----
  3. A compiler avec Open Watcom  
  4. wcl386 /l=dos4g neige.c
  5. ---------------------
  6. */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. typedef struct {
  10. unsigned int x; // abscisse du flocon
  11. char y; // son ordonnée  
  12. char speedX; // sa vitesse horizontale
  13. char speedY; // sa vitesse verticale
  14. unsigned int pos; // son adresse dans l'écran  
  15. } flocon;
  16. unsigned char *screen = (unsigned char *)0xA0000; // adresse de l'écran
  17. unsigned int nbFlocon = 0;
  18. flocon *Neige; // Tableau de flocons
  19. void initPalette(void);
  20. void initVideo(void);
  21. void waitVBL(void);
  22. void resetVideo(void);
  23. void initNeige(void);
  24. void initPalette(void)
  25. {
  26. _asm
  27. {
  28.  mov dx,03c6h
  29.  mov al,0ffh
  30.  out dx,al
  31.  mov dx,03c8h
  32.  mov al,0
  33.  out dx,al
  34.  inc dx
  35.  mov al,0ffh
  36.  out dx,al
  37.  xor ax,ax
  38.  out dx,al
  39.  out dx,al
  40. }
  41. }
  42. void initVideo(void)
  43. {
  44. _asm
  45. {
  46.  mov ax,13h
  47.  int 10h
  48. }
  49. }
  50. void waitVBL(void)
  51. {
  52. _asm
  53. {
  54. #ifdef DEBUG
  55.  mov dx,03c8h
  56.  mov al,0
  57.  out dx,al
  58.  inc dx
  59.  xor ax,ax
  60.  out dx,al
  61.  out dx,al
  62.  out dx,al
  63. #endif
  64.  mov dx,03dah
  65.  start:
  66.  in al,dx
  67.  test al,8
  68.  jnz start
  69.  end:
  70.  in al,dx
  71.  test al,8
  72.  jz end
  73. #ifdef DEBUG
  74.  mov dx,03c8h
  75.  mov al,0
  76.  out dx,al
  77.  inc dx
  78.  xor ax,ax
  79.  out dx,al
  80.  out dx,al
  81.  mov al,0ffh
  82.  out dx,al
  83. #endif
  84. }
  85. }
  86. void resetVideo(void)
  87. {
  88. _asm
  89. {
  90.  mov ax,0003h
  91.  int 10h
  92. }
  93. }
  94. void initNeige(void)
  95. {
  96. flocon *unFlocon; // Une étoile
  97. for( unFlocon = Neige; ( unFlocon - Neige ) < nbFlocon; unFlocon++ )
  98. {
  99.  unFlocon->x = rand() % 320;
  100.  unFlocon->y = rand() % 200;
  101.  unFlocon->speedX = (rand() % 3)+1;
  102.  unFlocon->speedY = (rand() % 3)+1;
  103.  unFlocon->pos = 0;
  104.  unFlocon++;
  105. }
  106. }
  107. void main(int argc,char *argv[])
  108. {
  109. flocon *unFlocon; // Un flocon
  110. // Lecture du nombre de flocons
  111. if( argc == 2 )
  112. {
  113.  nbFlocon = atoi( argv[1] ) ;
  114. }
  115. // 500 par défaut
  116. if( nbFlocon <= 0 )
  117. {
  118.  nbFlocon = 500;
  119. }
  120. // Allocation des flocon
  121. Neige = (flocon *)calloc(nbFlocon, sizeof(flocon));
  122. initVideo();
  123. // initPalette();
  124. initNeige();
  125. do
  126. {
  127.  waitVBL(); // attente du début du balayage vertical. supprimez le et voyez le résultat ;)
  128.  for( unFlocon = Neige; ( unFlocon - Neige ) < nbFlocon; unFlocon++ )
  129.  {
  130.   // on efface l'ancien flocon (l'octet 0 correspond à la couleur 0, noire)
  131.   *(screen + unFlocon->pos) = 0;
  132.   // on déplace le flocon
  133.   unFlocon->x += unFlocon->speedX; // on ajoute la vitesse à l'abscisse
  134.   unFlocon->y += unFlocon->speedY; // on ajoute la vitesse à l'ordonnée
  135.   // on teste si le flocon sort de la ligne. si c'est le cas, on la remet en début de ligne
  136.   if ( unFlocon->x > 319)
  137.    unFlocon->x -= 319;
  138.   // on teste si le flocon sort du bas de l'écran. si c'est le cas, on la remet en haut
  139.   if ( unFlocon->y > 199)
  140.    unFlocon->y = 0;
  141.   // On stocke la nouvelle place du flocon
  142.   unFlocon->pos = unFlocon->x + ( unFlocon->y * 320 );
  143.   // on écrit l'octet correspondant à la couleur
  144.   *(screen + unFlocon->pos ) = 24 + ( unFlocon->speedX-1 ) * 3;
  145.  }
  146. }while (!kbhit());
  147. free(Neige); // Libération des flocons
  148. resetVideo(); // retour en mode text
  149. }


 
Plusieurs modifs :
 
1- Correction d'un bug d'harko (copier coller :D ) :
Dans resetVideo() les instructions :

mov ax,4c00h
int 21h


sont en fait un appel DOS pour stopper le prog  :ouch: C'est dommage de l'arrêter avant de libérer les allocations dynamiques :whistle:
 
2- Pour le fun utilisation de pointeurs plutôt que d'un tableau avec indice. En plus c'est plus rapide avec des pointeurs déclaré en local dans les fonctions.

Code :
  1. for( unFlocon = Neige; ( unFlocon - Neige ) < nbFlocon; unFlocon++ )


Cette manière d'écrire n'est pas forcément plus rapide ni plus lisible ;), mais elle montre bien l'utilisation de l'arithmétique des pointeurs en C.
 
unFlocon = Neige : On pointe sur le début de la zone mémoire de stockage des flocons ( La neige quoi ! ) .
 
unFlocon++ : On avance d'un flocon et non pas d'un octet. unFlocon est déclaré comme pointeur sur une structure, l'incrémentation tiens compte de la taille de la structure.
 
( unFlocon - Neige ) < nbFlocon : C'est pareil, on peut faire ce genre d'opération avec les pointeurs. Le résultat de la soustraction donne leur décalage en nombre de structure.
 
3- Ajout d'une vitesse verticale aléatoire pour faire tomber les étoiles d'harko et les transformer en flocons de mara :D
 
4- Le nombre de flocon est un paramètre du prog (500 par défaut).
 
5- Disparition du tableau d'offset précalculé. Une multiplication par 320 ne prend pas de temps en ASM.
Explication par harko:

Citation :

En fait, le compilo ne multiplie pas, mais il réalise 2 décalages de bits :
 
320 = 256+64
= 2<<8 + 2<<6
 
donc en asm, tu auras :
 
au lieu de  
imul ax,320
 
tu auras
asl ax,8
asl ax,6
 
2 décalages au lieu d'une multiplication, c'est 100 fois plus rapide


 
J'ai laissé initPalette() même si je l'utilise pas, pour ceux qui voudrait changer la couleur de fond :)
 
Merci à harko, avec ses quelques lignes de code, j'ai appris plein de chose, et de vieux souvenirs sont remontés à la surface :jap:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°523964
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 26-09-2003 à 14:36:29  profilanswer
 

Mara's dad a écrit :


1- Correction d'un bug d'harko (copier coller :D ) :
Dans resetVideo() les instructions :

mov ax,4c00h
int 21h


sont en fait un appel DOS pour stopper le prog  :ouch: C'est dommage de l'arrêter avant de libérer les allocations dynamiques :whistle:


Oui effectivement, autant pour moi, je termine le programme par cette fonction... Mais bon, toutes les machines ont au moins 512 Mo de RAM maintenant, ça se serait jamais vu [:ddr555]
J'ai modifié les sources téléchargeables en conséquence :)


---------------
J'ai un string dans l'array (Paris Hilton)
n°524041
antp
Super Administrateur
Champion des excuses bidons
Posté le 26-09-2003 à 15:38:52  profilanswer
 

de toute façon Windows NT/2000/XP libère toute la mémoire allouée par le programme :whistle:

n°524073
Mara's dad
Yes I can !
Posté le 26-09-2003 à 15:55:39  profilanswer
 

antp a écrit :

de toute façon Windows NT/2000/XP libère toute la mémoire allouée par le programme :whistle:  


Et des fois même plus :lol:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°524220
bjone
Insert booze to continue
Posté le 26-09-2003 à 18:48:42  profilanswer
 

tous les OS libèrent les ressources demandées/crées par un process. (y'a des cas particuliers, comme les communications inter-process sous unix qui sont pas détruites quand y'a plus de process qui les utilisent, alors que sous windows oui )
 
mais c'est pas une excuse pour ne pas libérer ce qu'on crée...
(surtout dans des fonctions, sinon bonjour les leaks, mais bon à la fin d'un programme, (presque) tout est libéré)


Message édité par bjone le 26-09-2003 à 18:50:18
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15

Aller à :
Ajouter une réponse
 

Sujets relatifs
Projet de topic tutorial sur la programmation d'effets graphiquesProgrammation jeux video
cherche cours de programmation[ASM] L'assembleur sur TI82
Newbee en recherche d'un bon bon logiciel de programmationProgrammation graphique : choix d'un toolkit
[Programmation windows en C++] Recherche d'un bon tutorial...la fin des langages de programmation... sous Windows evidemment
cherche pro de la programmation 
Plus de sujets relatifs à : La programmation d'effets de demos old-school (Assembleur + C)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR